- /********************************************************************************
- *程序名: 数码管99秒秒表 *
- *编写人: 马飞龙 *
- *编写时间: 1.24 *
- *硬件支持: stc89c52 11.0592MHz *
- *接口说明: P0口接数码管段选,P2.0个位 P2.1十位 *
- *修改日志: *
- 1)修改通电后不操作就开始计时的错误; *
- 2)给数码管显示加消影; *
- ********************************************************************************/
- #include <reg52.h>
- #define uchar unsigned char //宏定义 用uchar代替 unsigned char
- #define uint unsigned int
- /*引脚定义*/
- sbit START=P1^2; //开始、停止键 低电平有效
- sbit RST=P1^3; //复位键
- /*定义全局变量*/
- uint time; //时间变量
- /*数码管字模,对应 0-9*/
- uchar code table[]={ // code 放在ROM
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f};
- /*延时函数*/
- void Delay(uint ms) //毫秒级延时函数
- {
- uint i, j;
- for(i =ms; i>0; i--)
- for(j =110; j>0; j--);
- }
- /*中断*/
- void time0() interrupt 1
- {
- uchar tt;
- TH0 = 0x4c; //晶振11.0592Mhz
- TL0 = 0x00; //若用12Mhz晶振 则改为 TH0=0x3c;TL0=0xb0;
- tt++;
- if(tt == 20)
- {
- time++;
- if(time==99) //到99后在从00开始
- time = 0;
- tt = 0;
- }
- }
- /*显示函数*/
- void Display(uchar sum)
- {
- uchar shi, ge;
- P0 = 0x00; //消影
- P2 = 0x00;
- shi = table[sum/10];
- P0 = shi;
- P2 = 0xfd;
- Delay(5);
- P0 = 0x00; //消影
- P2 = 0x00;
- ge = table[sum%10];
- P0 = ge;
- P2 = 0xfe;
- Delay(5);
- }
- /*按键扫描*/
- void keyscan()
- {
- if(START==0) //开始、停止
- {
- Delay(10); //消抖
- if(START==0)
- {
- TR0 =!TR0;
- while(!START) Display(time);
- }
- }
- if(RST==0) //复位
- {
- Delay(10); //消抖
- if(RST==0)
- {
- time=0;
- TR0=0;
- while(!RST)Display(time);
- }
- }
- }
- //主函数
- void main()
- {
- EA = 1; //中断开关
- ET0 = 1;
- TMOD = 0x01;
- TH0 = 0x4c; //晶振11.0592Mhz
- TL0 = 0x00; //若用12Mhz晶振 则改为 TH0=0x3c;Tl0=0xb0;
- TR0 = 0;
- while(1)
- {
- keyscan();
- Display(time);
- }
- }
复制代码
|