这是我做的流水灯+中断计数,流水灯每亮一下,数码管自动加1,有仿真图
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- #define DATAPORT P2 //数码管数据口
- sbit COM1 = P3^0; //数码管位1驱动口
- sbit COM2 = P3^1; //数码管位2驱动口
- sbit COM3=P3^7;//第三个数码管
- sbit key1=P3^5;//清零按键
- sbit led=P1^0;//20分钟那个小灯
- unsigned char miao,fen;//计时变量
- code unsigned char cc_table[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管段码
- unsigned int num;//计数变量
- void delay(unsigned char t)//延时函数
- {
- unsigned char x,y;
- for(x=t;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display(void)
- {
- COM1 = 1; //打开第一个数码管,让他亮
- DATAPORT = cc_table[num/100]; //显示百位段码
- delay(5);//延时5ms
- COM1 = 0;//关闭第一个数码管,灭,消影
- COM2 = 1;//打开第二个数码管
- DATAPORT = cc_table[num%100/10];//显输十位段码
- delay(5);
- COM2 = 0;//关闭
-
- COM3 = 1; //打开第三个数码管
- DATAPORT = cc_table[num%10];//显输个位段码
- delay(5);
- COM3 = 0;//关闭三个数码管,灭,消影
- }
- void main(void)
- {
- TMOD = 0X01; //初始化定时器
- TH0 =(65536-46078)/256;//定时器初始化
- TL0 =(65536-46078)%256;//定时器初始化
- EA = 1; //开总中断
- ET0 = 1; //开T0中断
- TR0=1; //启动定时器0
- TH1 =(65536-46078)/256;//定时器初始化
- TL1 =(65536-46078)%256;//定时器初始化
-
- ET1 = 1; //开T1中断
- TR1=1;//启动定时器1
- IT0=1; //下降沿触发
- EX0=1;//打开外部0中断
- P0=0x01;//P1第一灯亮
- led=1;//20分钟小灯亮
- while(1)
- {
-
- display(); //显示脉冲数
-
- if(key1==0)//清零按键按下
- {
- delay(2);//延时消去按键抖动
- if(key1==0)//按键按下
- {
- while(!key1);//按键可释放
- num=0;//清零
- }
- }
-
-
- }
- }
- /********************************************************
- * INT0中断函数 *
- ********************************************************/
- void counter0(void) interrupt 0 using 1
- {
-
- EX0=0; //关中断
- num++;//计数值加1
- EX0=1;//开中断
- }
- void T0_ISR(void) interrupt 1
- {
- static unsigned char count,temp=0x02;
- TH0 =(65536-46078)/256;//定时器初始化
- TL0 =(65536-46078)%256;//定时器初始化
- count++;//累计20次为1秒
-
- if(count==20)//1秒到
- {
- P0=0x00;//不亮
- }
- if((count>=60)&&(count>20))//2秒
- {
- count=0;//计数值清零
- P0=temp;
- temp=temp<<1;//左移动
- if(temp==0x40)// 0X40是循环6位,0X00是循环8位
- temp=0x01; // 循环结束,由第一个灯开始
- }
-
- }
- void T1_ISR(void) interrupt 3
- {
- static unsigned int count1;
- TH1 =(65536-46078)/256;//定时器初始化
- TL1 =(65536-46078)%256;//定时器初始化
- count1++;
- if(count1==20)//计数1秒
- {
- count1=0;
- miao++;
- if(miao==60)//计时60秒到
- {
- miao=0;
- fen++;
- if(fen>=150)//计时20分钟
- {
-
- led=0;
- TR1=0;
- }
- }
- }
- }
复制代码
全部资料51hei下载地址:
流水灯中断计数(带仿真).rar
(46.1 KB, 下载次数: 70)
|