利用STC89C52芯片,进行秒表的设计。将四位共阳极数码管的,段选依口次连接到89C52的P2口上来送段选数据,位选连接在P3口的0,1,2,3上。独立键盘1连接到P1.6上,控制秒表暂停启动。键盘2连接到P1.7上,在秒表暂停状态下可以进行复位功能。晶振采用的是11.0592MHz,一个机器周期的时间为1.09us,两边电容的值为22pF,在电路中其稳定振荡频率,达到快速起振的作用。将晶振两端分别连接在XTAL1和XTAL2上,给单片机提供时钟信号。
单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit key1= P1^6;
- sbit key2= P1^7;
- uint a,c,bai,shi,ge,hao,num,num1,state=0;
- uchar code table[]={
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e};
- void init();
- void display();
- void delay(uchar);
- void keyscan();
- void main()
- {
- init();
- while(1){
- keyscan();
- display();
- }
- }
- void display()
- {
- hao = num%10;
- ge = num/10%10;
- shi = num /100%10;
- bai = num/1000%10;
- P3=0x01;
- P2=table[bai];//送百秒上段选数据
- delay(1);
- P3=0x02;
- P2=table[shi];//送十秒上段选数据
- delay(1);
- P3=0x04;
- P2=table[ge];//送秒上段选数据
- delay(1);
- P3=0x08;
- P2=table[hao];//送零点秒上段选数据
- delay(1);
- }
- void init()//初始化函数
- {
- TMOD=0x01;//工作方式选择定时器0的工作方式1
- TH0=(65536-45872)/256;
- TL0=(65536-45872)%256;
- EA=1;
- ET0=1;
- TR0=0;
- num = 0;
- }
- void time() interrupt 1
- {
- TH0=(65536-45872)/256;
- TL0=(65536-45872)%256;
- a++;
- if(a==2)//2次50ms为0.1s
- {
- a=0;
- num++;
- if(num == 10000)//计满,归零重新开始
- num = 0;
- }
- }
- void keyscan(){
- if(!key1)
- {
- delay(10);//消抖
- if(!key1)//如果key1按下
- {
- state=~state;//state取反
- while(!key1){};
- TR0 = ~TR0;//定时器0的运行控制位取反
- }
- }
- else if(!key2)
- {
- delay(10);
- if(!key2)//如果key2按下
- {
- if(state==1){}//在state为1即运行状态时继续计时
- else if(state==0)//在state为0即暂停状态时,复位全部归零
- {
- hao=0;
- ge=0;
- shi=0;
- bai=0;
- num=0;
- }
- }
- }
- }
- void delay(uchar z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
复制代码
所有资料51hei提供下载:
秒表.zip
(13.45 KB, 下载次数: 63)
|