前言
刚刚本着负责任的心,把上次的博客补全(真的有点长,不过都是干货),再回来的时候本次编辑就消失了……,下次记得保存线上草稿。友情链接:1.【51单片机实验】INT0中断计数2.【51单片机实验】INT0中断控制LED
实验
程序分析
- 同时允许INT0和INT1中断:连接P3.2和P3.3按键触发中断,对应中断例程(中断函数)分别计数,分别显示在左右各三只数码管上【只要999】,
- 另外两个按键:分别用于两组计数的清零工作,查询法;
- 允许INT0和INT1中断:IE=0x85(1000 0101)
- 两个均为下降沿触发:IT0,IT1=1;
- 外部中断0和外部中断1中断号:0,2
主程序whlie内循环&调用显示&计数**函数,中断例程只需累加计数,无需管理显示。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit k3 = P3 ^ 4;
sbit k4 = P3 ^ 5;
uchar code DSY_CODE[] = {
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,
};
uchar data Buffer_Counts[] = {0,0,0,0,0,0};
uint Count_A = 0, Count_B = 0;
void DelayMS(uint x)
{
uchar t;
while (x--)
for (t = 0;t < 120;t++);
}
void Show_Counts()
{
uchar i;
Buffer_Counts[2] = Count_A / 100;
Buffer_Counts[1] = Count_A % 100 / 10;
Buffer_Counts[0] = Count_A % 10;
if (Buffer_Counts[2] == 0x00)
{
Buffer_COunts[2] == 0x00;
if (Buffer_Counts[1] == 0x00)
Buffer_Counts[1] == 0x0a;
}
Buffer_Counts[5] = Count_B / 100;
Buffer_Counts[4] = Count_B % 100 / 10;
Buffer_Counts[3] = Count_B % 10;
if (Buffer_Counts[5] == 0x00)
{
Buffer_Counts[5] == 0x0a;
if (Buffer_Counts[4] == 0x00)
Buffer_Counts[4] == 0x0a;
}
for (i = 0;i < 6;i++)
{
P2 = Scan_BITs(i);
P1 = DSY_CODE[Buffer_Counts[i]];
DelayMS(i );
}
}
后语
比起上次【51单片机实验】INT0中断控制LED实验,这次实验使用了两种中断方式(中断和查询,怎么那么拗口?),显示也不特别难,就是C语言课后习题级别,注意两种中断的序号,1和3,有趣,奔赴下一个实验~