10秒的秒表计数仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- void key1();
- void key2();
- void key3();
- uchar keyflay;
- uchar seconds =00;
- uchar gw = 0;
- uchar dw = 0;
- uint c = 0;
- sbit key = P3^0;
-
- uchar code distab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴段码,无小数点
- void DelayMS(uint x)
- {
- uchar i;
- while(x--) for(i=0; i<240; i++);
- }
- void xs()
- {
- seconds =seconds %100;
- gw=seconds/10;
- dw=seconds%10;
- P0=distab[gw];
- P2=0x01;
- DelayMS(2);
- P0=0x00;
- P2=0x01;
- DelayMS(2);
-
- P0=distab[dw];
- P2=0x02;
- DelayMS(2);
- P0=0x00;
- P2=0x02;
- DelayMS(2);
- }
- void KeyScan()
- {
- keyflay = keyflay% 3;
- switch(keyflay)
- {
- case 0: key1(); break;
- case 1: key2(); break;
- case 2: key3();
- }
- keyflay++;
- }
- void key1()
- {
- TR0=1;
- }
- void key2()
- {
- TR0=0;
- }
- void key3()
- {
- seconds=0;
- }
- void b()interrupt 1
- {
- if(++c==500)
- {
- seconds++;
- c=0;
- }
- }
- int main()
- {
- uchar d = 1;
- keyflay = 0;
- key = 1;
-
- TMOD=0x02;
- TH0=256-200;
- TL0=256-200;
- IE=0x82;
- TR0=0;
-
- while(1)
- {
- xs();
- if(key != d)
- {
- d=key;
- DelayMS(30); //防抖处理
- if(key == 0) //判断键是否按下
- {
- KeyScan(); //键处理程序
- }
- }
- }
- }
-
-
复制代码
所有资料51hei提供下载:
10秒的秒表.zip
(105.2 KB, 下载次数: 30)
|