單片機源程序如下:
- #include<reg52.h>
- #include <stdio.h>
- #include<intrins.h>
- #include "delay.h"
- #include "TM1650.h"
- #include "EEPROM.h"
- uchar jishu;
- char num,num1,num2,i0,i1,i2,i3,S=0,wg;
- sfr WDT_CONTR=0xe1;
- //按鍵信號輸入引腳定義
- sbit Q1=P1^2; //啟動按鍵
- sbit Q2=P1^3; //停止按鍵
- sbit Q3=P1^4; //復位按鍵
- sbit Q4=P1^5; //減時按鍵
- //繼電器信號輸入引腳定義
- sbit B0=P3^2; //火線繼電器或者零線繼電器信號
- sbit B1=P3^3; //火線繼電器或者零線繼電器信號
- sfr P3M1 = 0xB1;
- sfr P3M0 = 0xB2;
- uchar code mun_to_char[]={0x3F,0x06,0x5B,0x4f,0x66,
- 0x6D,0x7D,0x07,0x7F,0x6F,
- 0x77,0x7C,0x39,0x5E,0x79,
- 0x71,0x00,0x86,0xdB,0xcf,0xe6,
- 0xeD,0xfD,0x87,0xfF,0xeF};
- /* 0 1 2 3 4
- 5 6 7 8 9
- a b c d e
- f 關 */
- void inint()
- {
- TMOD=0x11; //設置T1定時器方式1,T0定時器方式1
- EA=1; //打開總中斷
- TH0=(65536-50000)/256; //50ms計數
- TL0=(65536-50000)%256; //50ms計數
- TH1=(65536-50000)/256; //50ms計數
- TL1=(65536-50000)%256; //50ms計數
- //TR0=1; //啟動T0定時器
- TR1=1;
- ET0=1; //
- ET1=1;
- //B1=0;
- WDT_CONTR=0x37;
- /* 用于eeprom的初始值設置 */
- num1=num2=byte_read(0x0000); //num2讀取eeprom中的數據
- P3M1 = 0xB1|0x00;
- P3M0 = 0xB2|0x0c;
- }
- void keycan()
- {
- if(Q1==0)
- {
- delay_1ms(10); //延時10ms
- if(Q1==0)
- {
- num1=num2;
- num=0;
- TR0=1;
- B0=0;
- S=1;
- }
- while(!Q1); //啟動按鍵松手檢測
- }
- if(Q2==0)
- {
- delay_1ms(10);
- if(Q2==0) //停止按鍵松手檢測
- {
- if(S==1)
- {TR0=~TR0;B0=~B0;B1=~B1;}
- }
- while(!Q2);
- }
- if(Q3==0) //復位按鍵
- {
- delay_1ms(10);
- if(Q3==0) //復位按鍵松手檢測
- {
- B0=1;
- B1=1;
- num1=num2;
- num=0;
- S=0;
- TR0=0;
- }
- while(!Q3);
- }
-
- if(Q4==0) //時間初值設置按鍵
- {
- delay_1ms(10); //長按3s
- if(Q4==0) //按鍵松手檢測
- {
- num2++;
- if(num2>=100){num2=1;}
- SectorErase(0x0000); //擦出扇區
- byte_write(0x0000,num2); //把num2的值寫入eeprom中2000地址
- TM1650_Set(0x48,0x11, //總共8級亮度,現在設置5級亮度
- 0x6E,mun_to_char[16], //數碼管個位顯示數據
- 0x6C,mun_to_char[16], //數碼管個位顯示數據
- 0x6A,mun_to_char[num2%10], //數碼管十位顯示數據
- 0x68,mun_to_char[num2%100/10] //數碼管百位顯示數?
- );
-
- }
- while(!Q4);
- }
- }
- //數據處理
- void CLshuju()
- {
- i3=num1%100/10;
- i2=num1%10;
- i1=num%100/10;
- i0=num%10; //16進制轉換成10進制
- if(i2==0){i2=0;}
- if(i3==0){i3=0;}
-
- TM1650_Set(0x48,0x11, //總共5級亮度,現在設置5級亮度
- 0x6E,mun_to_char[i0], //數碼管個位顯示數據
- 0x6C,mun_to_char[i1], //數碼管十位顯示數據
- 0x6A,mun_to_char[i2], //數碼管百位顯示數據
- 0x68,mun_to_char[i3] //數碼管千位顯示數據
- );
- }
- void main()
- {
- inint(); //初始化變量
- while(1)
- {
- if(num2>=100){num2=0;} //防止首次上電讀取錯誤的eeprom的數據
- if((num1==0)&&(num==0)){num1=num2;}
- keycan(); //按鍵檢測
- CLshuju(); //數據顯示
- }
- }
-
- void timer0() interrupt 1 //計時中斷0工作方式1函數。
- {
- TH0=(65536-50000)/256; //50ms計數
- TL0=(65536-50000)%256; //50ms計數
- jishu++;
- if(jishu==20) //50ms*20=1000ms
- {
- jishu=0;
- if(num==0)
- {
- num=60;
- num1--;
- }
- num--;
- if(num<58){B1=0;}
- if((num1==0)&(num==0)){B0=1;B1=1;S=0;TR0=0;}
- }
- }
- void timer1() interrupt 3 //計時中斷1工作方式1函數。
- {
- TH1=(65536-50000)/256; //50ms計數
- TL1=(65536-50000)%256; //50ms計數
- wg++; //喂狗變量
- if(wg==160) //50ms*160次=8s喂狗
- {
- wg=0;
- WDT_CONTR=0x37; //看門狗溢出時間為9秒
- }
-
- }
復制代碼
51hei.png (6 KB, 下載次數: 69)
下載附件
2022-1-7 18:05 上傳
Keil代碼下載:
手動抽水泵軟件20211107版.zip
(75.32 KB, 下載次數: 22)
2022-1-7 13:05 上傳
點擊文件名下載附件
數碼管顯示繼電器倒計時 下載積分: 黑幣 -5
|