原理图。仿真。都有。仿真需要用到8.6版本。实物亲测可用。就是仿真因为刷新速度太快一直显示8888,更改一下延时就行了。可以实现倒计时。到了报警。可以正计时。记录过了多久时间。用12mhz晶振。时钟比较准确。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit s1=P1^0;
- sbit s2=P1^1;
- sbit s3=P1^2;
- sbit s4=P1^3;
- sbit key1=P3^4;
- sbit key2=P3^3;
- sbit key3=P3^2;
- sbit buzz=P1^4;
- uint time=6,time10ms;
- unsigned char table[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
- uchar flag;
-
- /*----------------------------
- 软件延时
- ----------------------------*/
- void Delay(int n) //延时函数
- {
- int x;
- while (n--)
- {
- x = 50;
- while (x--);
- }
- }
- void InitTimer0(void)// 10ms
- {
- TMOD = 0x01;
- TH0 = 0x0D8;
- TL0 = 0x0F0;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0x0D8;
- TL0 = 0x0F0;
- time10ms++;
- if(time10ms>=100)
- { if(flag==2&&time>0) //开始倒计时
- { time--;
- if(time<=0)
- time=0;
- }
- if(flag==4&&flag<=999) //开始正计时
- time++;
-
- time10ms=0;
-
- }
-
- }
- void display(int hh)// int型函数只能取整数,不能取小数。
- {
- s1=0;//因为是共阳数码管,就是正极连在一起。所以高电平就可以点亮他。 但是用的PNP三极管。低电平导通。所以是低电平。
- P2=table[hh/100]; // 假如是821,821/100=8.21,取整数部分就为8
- Delay(5);
- s1=1;
- P2=0xff;
-
-
-
- s2=0;
- P2=table[hh%100/10]; //%号是取余数的意思 821除以100的余数等于21,21除以10的整数部分为2
- Delay(5);
- s2=1;
- P2=0xff;
- s3=0;
- P2=table[hh%100%10]; //
- Delay(5);
- s3=1;
- P2=0xff;
-
- if(flag==0||flag==2) //表示倒计时开始
- { s4=0;
- P2=table[14];
- Delay(5);
- s4=1;
- P2=0xff; }
- else
- {
-
- if(flag==1) //这里设置倒计时时间
- {s4=0;
- P2=table[10];
- Delay(5);
- s4=1;
- P2=0xff; }
- if(flag==3) //
- {
- s4=0; //在进行温度上限设置的时候。最后一位就显示B,表示在正计时
- P2=table[12];
- Delay(5);
- s4=1;
- P2=0xff;
-
-
-
- }
-
-
- }
- }
- void keycan()
- {
- if(key1==0&&flag==1)
- { Delay(100);
- if(key1==0&&flag==1)
- { time++;}
- }
-
- if(key2==0)
- { Delay(100);
- if(key2==0)
- flag++;
- if(flag==3)
- {time=0;buzz=1; }
-
-
- if(flag>4)
- {flag=0;
- time=6;
- }
- }
- if(key3==0&&flag==1)
- { Delay(100);
- if(key3==0&&flag==1)
- time--;
- }
-
-
- }
- main()
- {
- InitTimer0();
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
秒表.rar
(1.15 MB, 下载次数: 15)
|