QQ圖片20190623220520.png (2.84 KB, 下載次數: 19)
下載附件
問題求解
2019-6-23 22:05 上傳
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define PIN0 P0 //數碼管段選端
- #define PIN1 P2 //數碼管位選端
- #define PIN3 P2 //十分位數碼管的段碼端
- sbit start=P3^0; //啟動/暫停按鈕
- sbit reset=P3^1; //復位按鈕
- uint cnt=0; //1s的次數的計數值
- uint num=0; //進入中斷次數的計數值(一次50ms)
- uint num1=0; //0.1s的次數的計數值
- uchar code table[]={0x3f,0x06,0x5b,
- 0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
- //不帶小數點的共陰極數碼管段碼0-9
- uchar code table1[]={0xbf,0x86,
- 0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
- //帶小數點的共陰極數碼管段碼0-9
- <span style="font-size:14px;">
- char code table2[]={0xc0,0xf9,0xa4,
- 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- //不帶小數點的共陽極數碼管段碼0-9
- void Display(uint w,uint a,uint b,uint c,uint d); //聲明顯示函數
- void InitTimer0(); //聲明定時器初始化函數
- void Delayms(uint x); //聲明延時函數
- void main()
- {
- uint ms100=0; //秒的十分位
- uint s,s1,min,min1,minu=0;
- //依次是秒的個位,秒的十位,分的個位,分的十位
- InitTimer0(); //初始化定時器
- while(1) //進入死循環
- {
- if(start==0) //檢測啟動/暫停鍵是否按下
- Delayms(20); //延時消抖
- {
- if(start==0) //消抖之后再次檢測
- {
- TR0=!TR0; //定時器的控制位取反
- while(!start); //等待按鍵釋放
- }
- }
-
- if(reset==0) //檢測復位鍵是否按下
- {
- Delayms(20); //延時消抖
- if(reset==0) //消抖之后再次檢測
- {
- num=0;
- num1=0; //進入中斷次數值清0
- ms100=0; //十分位的計數值清0
- cnt=0; //秒的計數值清0
- minu=0; //分的計數值清0
- while(!reset); //等待按鍵釋放
- }
- }
- if(num1>=2) //檢測是否達到0.1s,(兩個50ms)
- {
- num1=0; //進入中斷次數值清零
- ms100++; //秒的十分位的計數值加1
- if(ms100>=10) //若秒的十分位計數值達到10
- {
- ms100=0; //清零秒的十分位的計數值
- num1=0;//進入中斷次數值置0
- }
- }
-
- if(num>=20) //判斷計時時間是否達到1s(20個50ms)
- {
- num=0; //進入中斷次數值置0
- cnt++; //秒的計數值加1
- if(cnt>=60) //判斷是否達到60s
- {
- cnt=0; //若達到60s,將秒的計數值置零
- minu++; //分的計數值加1
- if(minu>=60) //判斷是否達到60分鐘,</span><span style="font-family:Arial, Helvetica, sans-serif;"><span style="font-size:10px;">一般秒表是用不到60分的,這是為了程序的嚴謹性</span></span><span style="font-size:14px;">
- {
- TR0=!TR0; //達到60分鐘則關閉定時器并清零所有的計數值
- num1=0;</span><span style="font-size:14px;"> </span><span style="font-size:14px;">
- num=0;
- ms100=0;
- cnt=0;
- minu=0;
-
- }
- }
- }
- s=cnt%10; //從秒的計數值里面分離秒的個位
- s1=cnt/10; //從秒的計數值里面分離秒的十位
- min=minu%10; //從分的計數值里面分離分的個位
- min1=minu/10; //從分的計數值里面分離分的十位
-
- Display(ms100,s,s1,min,min1); //顯示這5個數
- }
- }
- void InitTimer0() //定時器初始化函數
- {
-
- TMOD=0x01; //選擇定時器0的工作方式1
- TH0=(65536-45872)/256; //裝初值(定時50ms),晶振11.0592MHz
- TL0=(65536-45872)%256;
- EA=1; //打開總中斷
- ET0=1; //打開定時器中斷
- TR0=0; //先不要啟動定時器
-
- }
- void TIMER0() interrupt 1 //定時器中斷服務函數
- {
- TH0=(65536-45872)/256; //重裝初值
- TL0=(65536-45872)%256;
- num++; //讓進入中斷次數值加1,用于判斷是否達到1s
- num1++; //讓進入中斷次數值加1,用于判斷是否達到0.1s
- }
- void Delayms(uint x) //延時xms
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- void Display(uint w,uint a,uint b,uint c,uint d) //定義顯示函數
- {
- PIN3=table2[w]; //秒的十分位的段選
- Delayms(5);
-
- PIN0=table[a]; //秒的個位的段選
- PIN1=0x7f; //秒的個位的位選
- Delayms(5);
-
- PIN0=table[b]; //秒的十位的段選
- PIN1=0xbf; //秒的十位的位選
- Delayms(5);
-
- PIN0=table1[c]; //分的個位的段選(帶小數點)
- PIN1=0xdf; //分的個位的位選
- Delayms(5);
-
- PIN0=table[d]; //分的十位的段選
- PIN1=0xef; //分的十位的位選
- Delayms(5);
-
- }
復制代碼 |