秒表可以连续走到9999秒,到9999秒自动复位到0,重新计时可以按复位键或停止键。本程序经过上板实验,完全可靠。
- #include<reg51.h>
- #define GPIO_DIG P0
- #define GPIO_PLACE P1
- unsigned char code DIG_PLACE[4] = {0xfe,0xfd,0xfb,0xf7};//,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制
- unsigned char code DIG_CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char DisplayData[8]; //用来存放要显示的8位数的值
- unsigned char Time; //用来存放定时时间
- unsigned int Second;
- /*********************使用数码管显示*******************/
- void DigDisplay()
- {
- unsigned char i;
- unsigned int j;
- for(i=0; i<8; i++)
- {
- GPIO_PLACE=DIG_PLACE[i]; //发送位选
- GPIO_DIG=DisplayData[i]; //发送段码
- j=10; //扫描间隔时间设定
- while(j--);
- GPIO_DIG=0x00; //消隐
- }
- }
- /*********************配置定时器************************/
- void Timer0init(void)
- {
- TMOD=0x01; //定时器0选择工作方式1
- TH0 =(65536-49550)/256; //设置初始值,定时50MS
- TL0 =(65536-49550)%256;
- EA =1; //打开总中断
- ET0 =1; //打开定时器0中断
- TR0 =1; //启动定时器0
- }
- /**********************主函数***************************/
- void main(void)
- {
- Timer0init();
- while(1)
- {
- if(Second>9999)
- {
- Second=0;
- }
- DisplayData[0]=DIG_CODE[(Second)/10000];
- DisplayData[1]=DIG_CODE[(Second)%1000/100];
- DisplayData[2]=DIG_CODE[(Second)%100/10];
- DisplayData[3]=DIG_CODE[(Second)%10];
- DigDisplay();
- }
- }
- /*******************定时器0中断函数**********************/
- void Timer0() interrupt 1
- {
- TH0=(65536-49550)/256; //设置初始值
- TL0=(65536-49550)%256;
- Time++;
- if(Time==40) //控制秒时间长短
- {
- Second++;
- Time=0;
- }
- }
复制代码
|