|
單片機(jī)源程序如下:
- #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;
- //按鍵信號(hào)輸入引腳定義
- sbit Q1=P1^2; //啟動(dòng)按鍵
- sbit Q2=P1^3; //停止按鍵
- sbit Q3=P1^4; //復(fù)位按鍵
- sbit Q4=P1^5; //減時(shí)按鍵
- //繼電器信號(hào)輸入引腳定義
- sbit B0=P3^2; //火線繼電器或者零線繼電器信號(hào)
- sbit B1=P3^3; //火線繼電器或者零線繼電器信號(hào)
- 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 關(guān) */
- void inint()
- {
- TMOD=0x11; //設(shè)置T1定時(shí)器方式1,T0定時(shí)器方式1
- EA=1; //打開總中斷
- TH0=(65536-50000)/256; //50ms計(jì)數(shù)
- TL0=(65536-50000)%256; //50ms計(jì)數(shù)
- TH1=(65536-50000)/256; //50ms計(jì)數(shù)
- TL1=(65536-50000)%256; //50ms計(jì)數(shù)
- //TR0=1; //啟動(dòng)T0定時(shí)器
- TR1=1;
- ET0=1; //
- ET1=1;
- //B1=0;
- WDT_CONTR=0x37;
- /* 用于eeprom的初始值設(shè)置 */
- num1=num2=byte_read(0x0000); //num2讀取eeprom中的數(shù)據(jù)
- P3M1 = 0xB1|0x00;
- P3M0 = 0xB2|0x0c;
- }
- void keycan()
- {
- if(Q1==0)
- {
- delay_1ms(10); //延時(shí)10ms
- if(Q1==0)
- {
- num1=num2;
- num=0;
- TR0=1;
- B0=0;
- S=1;
- }
- while(!Q1); //啟動(dòng)按鍵松手檢測(cè)
- }
- if(Q2==0)
- {
- delay_1ms(10);
- if(Q2==0) //停止按鍵松手檢測(cè)
- {
- if(S==1)
- {TR0=~TR0;B0=~B0;B1=~B1;}
- }
- while(!Q2);
- }
- if(Q3==0) //復(fù)位按鍵
- {
- delay_1ms(10);
- if(Q3==0) //復(fù)位按鍵松手檢測(cè)
- {
- B0=1;
- B1=1;
- num1=num2;
- num=0;
- S=0;
- TR0=0;
- }
- while(!Q3);
- }
-
- if(Q4==0) //時(shí)間初值設(shè)置按鍵
- {
- delay_1ms(10); //長(zhǎng)按3s
- if(Q4==0) //按鍵松手檢測(cè)
- {
- num2++;
- if(num2>=100){num2=1;}
- SectorErase(0x0000); //擦出扇區(qū)
- byte_write(0x0000,num2); //把num2的值寫入eeprom中2000地址
- TM1650_Set(0x48,0x11, //總共8級(jí)亮度,現(xiàn)在設(shè)置5級(jí)亮度
- 0x6E,mun_to_char[16], //數(shù)碼管個(gè)位顯示數(shù)據(jù)
- 0x6C,mun_to_char[16], //數(shù)碼管個(gè)位顯示數(shù)據(jù)
- 0x6A,mun_to_char[num2%10], //數(shù)碼管十位顯示數(shù)據(jù)
- 0x68,mun_to_char[num2%100/10] //數(shù)碼管百位顯示數(shù)?
- );
-
- }
- while(!Q4);
- }
- }
- //數(shù)據(jù)處理
- void CLshuju()
- {
- i3=num1%100/10;
- i2=num1%10;
- i1=num%100/10;
- i0=num%10; //16進(jìn)制轉(zhuǎn)換成10進(jìn)制
- if(i2==0){i2=0;}
- if(i3==0){i3=0;}
-
- TM1650_Set(0x48,0x11, //總共5級(jí)亮度,現(xiàn)在設(shè)置5級(jí)亮度
- 0x6E,mun_to_char[i0], //數(shù)碼管個(gè)位顯示數(shù)據(jù)
- 0x6C,mun_to_char[i1], //數(shù)碼管十位顯示數(shù)據(jù)
- 0x6A,mun_to_char[i2], //數(shù)碼管百位顯示數(shù)據(jù)
- 0x68,mun_to_char[i3] //數(shù)碼管千位顯示數(shù)據(jù)
- );
- }
- void main()
- {
- inint(); //初始化變量
- while(1)
- {
- if(num2>=100){num2=0;} //防止首次上電讀取錯(cuò)誤的eeprom的數(shù)據(jù)
- if((num1==0)&&(num==0)){num1=num2;}
- keycan(); //按鍵檢測(cè)
- CLshuju(); //數(shù)據(jù)顯示
- }
- }
-
- void timer0() interrupt 1 //計(jì)時(shí)中斷0工作方式1函數(shù)。
- {
- TH0=(65536-50000)/256; //50ms計(jì)數(shù)
- TL0=(65536-50000)%256; //50ms計(jì)數(shù)
- 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 //計(jì)時(shí)中斷1工作方式1函數(shù)。
- {
- TH1=(65536-50000)/256; //50ms計(jì)數(shù)
- TL1=(65536-50000)%256; //50ms計(jì)數(shù)
- wg++; //喂狗變量
- if(wg==160) //50ms*160次=8s喂狗
- {
- wg=0;
- WDT_CONTR=0x37; //看門狗溢出時(shí)間為9秒
- }
-
- }
復(fù)制代碼
Keil代碼下載:
手動(dòng)抽水泵軟件20211107版.zip
(75.32 KB, 下載次數(shù): 22)
2022-1-7 13:05 上傳
點(diǎn)擊文件名下載附件
數(shù)碼管顯示繼電器倒計(jì)時(shí)
|
|