原理圖。仿真。都有。仿真需要用到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)
2020-3-22 21:03 上傳
點擊文件名下載附件
|