有重启,终止,停表功能。(复位电路及外部晶振忽略)
protues8仿真图如下:
程及仿真在附件中下载
单片机源程序如下:
- #include <REGX52.H>
- char code seg7cat[18] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0x7F};//'-'
- void delayms(unsigned int td);
- void seg7x8_display(unsigned char *p);
- void clock_refresh(void);
- void stop_2(void);
- void Int0Init();
- unsigned char T0CNT,M,S,SD2;
- unsigned int stop1=0,stop2=1;
- unsigned char dis_buf[9];
- sbit k1=P3^2; //定义独立按键K1
- sbit k2=P3^3; //定义独立按键K2
- sbit k3=P3^4; //定义独立按键K3
- void main(void)
- {
- unsigned char i;
- Int0Init();
- T0CNT = M = SD2 = S = 0;
- for(i=0;i<8;i++) dis_buf[ i ] = 0; //清除显示缓存
- TH0 = (65536-500)/256;
- TL0 = (65536-500)%256; //定时时间50ms,0.5ms
- TMOD = 0x11;
- ET0 = 1;
- EA = 1;
- TR0 = 1;
- for(;;)
- {
- stop_2();
- seg7x8_display(dis_buf);
- }
- }
- void timer0_isr(void) interrupt 1
- { TH0 = (65536-500)/256;
- TL0 = (65536-500)%256;
- if( ++T0CNT >=20)
- { T0CNT = 0; P1 = ~P1;
- clock_refresh();
- }
- }
- // 设置外部中断0
- void Int0Init()
- {
- //设置INT0,外部中断0
- IT0=1;
- EX0=1;
- //设置INT0,外部中断1
- IT1=1;
- EX1=1;
- EA=1;
- }
- //延时子程序
- void delayms(unsigned int td)
- { unsigned int i,j;
- for(i=0;i<td;i++)
- for(j=0;j<120;j++){}
- }
- //显示子程序
- void seg7x8_display(unsigned char *p)
- { unsigned char i;
- for(i=0;i<8;i++)
- {
- if(i==5)
- {P0 = (127&(int)seg7cat[dis_buf[8]]);}
- else
- {P0 = seg7cat[p[i]];}
- P2 = ~(1<<i); delayms(4);
- P2 = 0xFF; delayms(1);
- }
- }
- void clock_refresh(void)
- {
- if(++SD2 >= 100)
- {
- SD2=0;
- if(++S>=60)
- {
- S = 0;
- if(++M>=60)
- M = 0;
- }
- }
- if(stop2)
- {
- dis_buf[0] = M/10;
- dis_buf[1] = M%10;
- dis_buf[2] = 16;
- dis_buf[3] = 16; //'-’
- dis_buf[4] = S/10;
- dis_buf[5] = 17; //'.’
- dis_buf[6] = SD2/10;
- dis_buf[7] = SD2%10;
- dis_buf[8] = S%10;
- }
- }
- //归零
- void Int0() interrupt 0 //外部中断0的中断函数
- {
- unsigned char i;
- if(k1==0)
- {
-
- for(i=0;i<100;i++)
- {
- if(k1==0){i=0;}
- }
- T0CNT = M = SD2 = S = 0;
- }
- }
- //暂停,停表
- void Int1() interrupt 2 //外部中断1的中断函数
- {
- unsigned char i;
- if(k2==0)
- {
- for(i=0;i<10;i++)
- {
- if(k2==0){i=0;}
- }
- stop1 = !stop1;
- while(stop1)
- {
- if(k2==0)
- {
- for(i=0;i<10;i++)
- {
- if(k2==0){i=0;}
- }
- stop1 = !stop1;
- }
- seg7x8_display(dis_buf);
- }
- }
- }
- //停表
- void stop_2(void)
- {
- unsigned char i;
- if(k3==0)
- {
- for(i=0;i<10;i++)
- {
- if(k3==0){i=0;}
- }
- stop2 = !stop2;
- }
- }
复制代码
所有资料51hei提供下载:
秒表.zip
(35.47 KB, 下载次数: 24)
|