- #include <reg51.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- sbit start=P2^7;
- sbit stop=P2^6;
- sbit plus_one=P2^5;
- sbit resert=P2^4;
- #define dpick P0
- #define wpick P1
- u16 num1=0; //1s的次数的计数值
- u16 num60=0; //1min的次数的计数值
- u16 zd_num=0; //进入中断次数的计数值
- //子函数
- void delay(u16 num) //延时函数
- {
- u16 x,y;
- for(x=num;x>0;x--)
- for(y=110;y>0;y--)
- {
- ;
- }
- }
- u8 code table[]={0x3f,0x06 ,0x5b ,0x4f, 0x66, 0x6d, 0x7d ,0x07, 0x7f,
- 0x6f,0x77 ,0x7c, 0x39, 0x5e, 0x79, 0x71};
- void Display(u16 a,u16 b,u16 c,u16 d) //定义显示函数
- {
- dpick=table[a]; //秒的个位的段选
- wpick=0x7f; //秒的个位的位选
- delay(5);
-
- dpick=table[b]; //秒的十位的段选
- wpick=0xbf; //秒的十位的位选
- delay(5);
-
- dpick=table[c]+0x80; //分的个位的段选(带小数点)
- wpick=0xdf; //分的个位的位选
- delay(5);
-
- dpick=table[d]; //分的十位的段选
- wpick=0xef; //分的十位的位选
- delay(5);
- }
- void InitTimer0() //定时器初始化函数
- {
-
- TMOD=0x01; //选择定时器0的工作方式1
- TH0=(65535-50000) / 256; //计算初值 (定时50ms)
- TL0=(65535-50000) % 256;
- EA=1; //打开总中断
- ET0=1; //打开定时器中断
- TR0=0;
- }
- void TIMER0() interrupt 1 //定时器中断服务函数
- {
- TH0=(65535-50000) / 256; //手动填充
- TL0=(65535-50000) % 256;
- zd_num++; //让进入中断次数值加1,用于判断是否达到1s
- }
- //主函数
- void main()
- {
- u16 s1,s10,min1,min10; //秒的个位,秒的十位,分的个位,分的十位
- InitTimer0(); //初始化定时器
- while(1)
- {
- if(start==0) //检测启动
- {
- delay(20);
- if(start==0)
- {
- TR0=1; //定时器打开
- while(!start);
- }
- }
- if(stop==0) //检测启动
- {
- delay(20);
- if(stop==0)
- {
- TR0=0; //定时器关闭
- while(!stop);
- }
- }
- if(plus_one==0)
- {
- delay(20);
- if(plus_one==0)
- {
- zd_num=zd_num+20;
- while(!plus_one);
- }
- }
- if(resert==0)
- {
- delay(20);
- if(resert==0)
- {
- zd_num=0;
- TR0=0;
- num1=0;
- num60=0;
- }
- while(!resert);
- }
-
- if(zd_num>=20)
- {
- zd_num=0;
- num1++;
- if(num1>=60)
- {
- num1=0;
- num60++;
- if(num60>=60)
- {
- TR0=0;
- num1=0;
- num60=0;
- zd_num=0;
- }
- }
- }
-
- s1=num1%10; //从秒的计数值里面分离秒的个位
- s10=num1/10; //从秒的计数值里面分离秒的十位
- min1=num60%10; //从分的计数值里面分离分的个位
- min10=num60/10; //从分的计数值里面分离分的十位
-
- Display(s1,s10,min1,min10); //显示
- }
- }
复制代码 |