【簡(jiǎn)要說(shuō)明】 一、板子尺寸:長(zhǎng)113mmX寬72mmX高18mm
二、主要器件:?jiǎn)纹瑱C(jī)、數(shù)碼管、繼電器
三、工作電壓:有12V和24兩種可供選擇
四、板子功耗:小于300mA
GYJ-0054_雙路可編程數(shù)碼管顯示延時(shí)模塊的電路原理圖:
pcb圖:
實(shí)物圖與接線圖等:
上電out1吸和 觸發(fā)端子1倒計(jì)時(shí)開始(時(shí)分秒)out2吸和 倒計(jì)時(shí)中按鍵不管用 觸發(fā)端子2則out1吸和
單片機(jī)源程序如下:
- #include "demo.h"
- #include "eeprom.h"
- #define uchar unsigned char//宏定義無(wú)符號(hào)字符型
- #define uint unsigned int //宏定義無(wú)符號(hào)整型
- uint tcnt1=0;//用于刷新數(shù)碼管
- uint bainum1,shinum1,genum1;//數(shù)碼管上顯示
- uint bainum2,shinum2,genum2;//數(shù)碼管上顯示
- code uchar seg7code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //顯示段碼 數(shù)碼管字跟
- uchar wei1[3]={0XDf,0XBf,0X7f};//數(shù)碼管1的位的控制端
- uchar wei2[3]={0XFb,0XF7,0Xef};//數(shù)碼管2的位的控制端
- bit flag_eeprom1=1;//掉電存儲(chǔ)的標(biāo)志位
- static uchar presstime=0;//時(shí)間值按鍵用到的
- uint kf0=1;//按鍵用的標(biāo)志位
- uint kt0=0;//按鍵用的標(biāo)志位
- uint keynum=0;//數(shù)碼管的位
- uint bainum11=0,shinum11=0,genum11=0;//用于傳到數(shù)碼管上顯示
- uint bainum22=0,shinum22=0,genum22=0;//用于傳到數(shù)碼管上顯示
- uint if0=1,if1=1;//觸發(fā)用的標(biāo)志位
- uint it0=0,it1=0;//觸發(fā)用的標(biāo)志位
- uint inum1=0,inum2=0,inum3=0;//觸發(fā)端子用的計(jì)數(shù)
- uint isecond1=0,isecond2=0;//觸發(fā)端子用的計(jì)數(shù)
- uint iminute1=0,iminute2=0;//觸發(fā)端子用的計(jì)數(shù)
- uchar inum11=0,inum12=0,inum21=0,inum22=0,inum31=0,inum32=0;//掉電存儲(chǔ)
- extern void keycan();//按鍵
- extern void keyflag();//按鍵結(jié)束調(diào)用
- extern void displaynum();//將數(shù)字傳到數(shù)碼管上顯示
- extern void operations();//操作
- void timer0_1init(void){//定時(shí)配置
- TMOD=0x11;//將定時(shí)器0,1都設(shè)置為模式1
- TL0 = 0xCD;//設(shè)置定時(shí)器0時(shí)間為2ms
- TH0 = 0xF8;//設(shè)置定時(shí)器0的初始值
- TR0=1;//開啟定時(shí)器0
- TR1=1;//開啟定時(shí)器1
- EA=1;//開總中斷
- ET0=1;//開定時(shí)器0的中斷
- }
- void main(){
- timer0_1init();
- inum11=Byte_Read(0x01);//掉電存儲(chǔ)用到
- inum12=Byte_Read(0x02);//掉電存儲(chǔ)用到
- inum21=Byte_Read(0x03);//掉電存儲(chǔ)用到
- inum22=Byte_Read(0x04);//掉電存儲(chǔ)用到
- inum31=Byte_Read(0x05);//掉電存儲(chǔ)用到
- inum32=Byte_Read(0x06);//掉電存儲(chǔ)用到
- inum1=inum11*100+inum12;
- inum2=inum21*100+inum22;
- inum3=inum31*100+inum32;
- bainum11=inum1/10%10;
- shinum11=inum1%10;
-
- genum11=inum2/10%10;
- bainum22=inum2%10;
-
- shinum22=inum3/10%10;
- genum22=inum3%10;
- if(inum1>100 || inum1<0){
- inum1=0;
- }
- if(inum2>60 || inum2<0){
- inum2=0;
- }
- if(inum3>60 || inum3<0){
- inum3=0;
- }
- while(1){
- keycan();//調(diào)用按鍵
- operations();//調(diào)用操作
- if (it0==1){//當(dāng)標(biāo)志位it0等于1時(shí)
- out2=0;//out2輸出
- }
- if (it0==0){out1=0;}
- }
- }
- void operations(){//操作
- if(in1==0){//當(dāng)觸發(fā)端子1觸發(fā)
- if0=0;//將if0值改為0,定時(shí)器開始倒計(jì)時(shí)
- it0=1;//將it0置為1,out1輸出
- }
- if(in2==0){if0=1;it0=0;}
- }//操作結(jié)束
- void keycan(){//按鍵
- if(keynum==0){//當(dāng)按鍵值等于0的時(shí)候調(diào)用顯示
- displaynum();
- }
- if(if0==1){
- if(key1==0){//當(dāng)按鍵1按下
- if(kf0){//當(dāng)標(biāo)志位kf0=1的時(shí)候進(jìn)行
- if(presstime>100){//當(dāng)時(shí)間值大于一百的時(shí)候
- kf0=0;//標(biāo)志位kf0=0
- kt0=1;//標(biāo)志位kt0=0
- presstime=0;//時(shí)間清零,重新進(jìn)行
- keynum++;//數(shù)碼管的位
- if(keynum==7){//當(dāng)位到7則置位0
- keynum=0;
- }
- }
- }
- }else{//當(dāng)按鍵松開
- keyflag();
- }//按鍵1結(jié)束
- }
- if(key2==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;//掉電存儲(chǔ)的標(biāo)志位改為1,進(jìn)行存值操作
- switch(keynum){
- case 1:
- bainum11++;//數(shù)碼管一加加
- if(bainum11>9){//當(dāng)數(shù)碼管一加加到9時(shí)置為1
- bainum11=0;
- }
- break;
- case 2:shinum11++;if(shinum11>9){shinum11=0;}break;
- case 3:genum11++;if(genum11>5){genum11=0;}break;
- case 4:bainum22++;if(bainum22>9){bainum22=0;}break;
- case 5:shinum22++;if(shinum22>5){shinum22=0;}break;
- case 6:genum22++;if(genum22>9){genum22=0;}break;
- default:break;
- }
- }}}else{keyflag();displaynum();
- if((flag_eeprom1==1))//加掉電存儲(chǔ),必需加到這,不然有一些小問(wèn)題
- { flag_eeprom1=0;
- saveeepro();//掉電存儲(chǔ)
- }
- }//松開按鍵進(jìn)行顯示
- if(key3==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;
- switch(keynum){
- case 1:
- bainum11--;//數(shù)碼管一減減
- if(bainum11>111){//當(dāng)數(shù)碼管一減減到0時(shí)置為9
- bainum11=9;
- }
- break;
- case 2:shinum11--;if(shinum11>111){shinum11=9;}break;
- case 3:genum11--;if(genum11>111){genum11=5;}break;
- case 4:bainum22--;if(bainum22>111){bainum22=9;}break;
- case 5:shinum22--;if(shinum22>111){shinum22=5;}break;
- case 6:genum22--;if(genum22>111){genum22=9;}break;
- default:break;
- }
- }}}else{keyflag();displaynum();if((flag_eeprom1==1)){flag_eeprom1=0;saveeepro();}}//松開按鍵進(jìn)行顯示
- }//按鍵結(jié)束
- void displaynum(){//將數(shù)字傳到數(shù)碼管上顯示
- if (if0==0){//當(dāng)if0==0時(shí)num1三個(gè)數(shù)碼管進(jìn)行顯示
- bainum1=inum1/10%10;//十位
- shinum1=inum1%10;//個(gè)位
- genum1=inum2/10%10;//十位
- bainum2=inum2%10;//個(gè)位
- shinum2=inum3/10%10;//十位
- genum2=inum3%10;//個(gè)位
- }else{
- bainum1=bainum11;
- shinum1=shinum11;
- genum1=genum11;
- bainum2=bainum22;
- shinum2=shinum22;
- genum2=genum22;
- inum1=bainum11*10+shinum11; //將num1三個(gè)數(shù)碼管的值付給inum
- inum2=genum11*10+bainum22;
- inum3=shinum22*10+genum22;
- }
- }
- void saveeepro(){//掉電存儲(chǔ)
- inum11=inum1/100;//把int型的值拆分到char型
- inum12=inum1%100;
- inum21=inum2/100;
- inum22=inum2%100;
- inum31=inum3/100;
- inum32=inum3%100;
- Sector_Erase(0); //擦除0x01地址中的數(shù)據(jù) 一定要先擦除再寫進(jìn) 同一地址
- Byte_Program(0x01,inum11); //擦除完成就可以寫入了
- Byte_Program(0x02,inum12); //擦除完成就可以寫入了
- Byte_Program(0x03,inum21); //擦除完成就可以寫入了
- Byte_Program(0x04,inum22); //擦除完成就可以寫入了
- Byte_Program(0x05,inum31); //擦除完成就可以寫入了
- Byte_Program(0x06,inum32); //擦除完成就可以寫入了
- }
- void timer0(void)interrupt 1 {//定時(shí)器0
- //500等于1秒
- TL0 = 0xCD; //重新設(shè)置定時(shí)器0時(shí)間為2ms
- TH0 = 0xF8; //重新設(shè)置定時(shí)器0的初始值
- tcnt1++;//用于刷新數(shù)碼管
- presstime++;//按鍵用到,用于防抖
- if (if0==0){//當(dāng)if0等于0時(shí)
- isecond1++;//當(dāng)觸發(fā)1觸發(fā)后進(jìn)行計(jì)數(shù)(秒)
- if (isecond1==500){//一秒時(shí)間到
- isecond1=0;//置為0,重新開始計(jì)
- if(if1==1){
- if1=0;
- }else{
- if1=1;
- }
- inum3--;
- if(inum3<0 || inum3>60 ){//說(shuō)明一分鐘到了
- inum3=59;
- inum2--;//inum進(jìn)行減減
- if(inum2<0 || inum2>60){//當(dāng)inum等于0時(shí)
- inum2=59;
- inum1--;
- if(inum1<0|| inum1>100){
- if0=1;//將標(biāo)志位if0置為1
- it0=0;//將標(biāo)志位it0置為0,out1斷開
- }
- }
- }
- }
- }//觸發(fā)端子1的計(jì)時(shí)結(jié)束
- switch(tcnt1){
- /**************數(shù)碼管1-開始*****************/
- case 1: P2=0XFF; P0=seg7code[bainum1];if(keynum==1 || keynum==0){P2=wei1[2];}break;
- case 2: P2=0XFF; P0=seg7code[shinum1];if(keynum==2 || keynum==0){P2=wei1[1];}break;
- case 3: P2=0XFF; P0=0x7f;if(if1==1){P2=wei1[1];}break;//小數(shù)點(diǎn)
- case 4: P2=0XFF; P0=seg7code[genum1]; if(keynum==3 || keynum==0){P2=wei1[0];}break;
- /**************數(shù)碼管1-結(jié)束*****************/
- /**************數(shù)碼管2-開始*****************/
- case 5: P2=0XFF; P0=seg7code[bainum2];if(keynum==4 || keynum==0){P2=wei2[2];}break;
- case 6: P2=0XFF; P0=0x7f;if(if1==1){P2=wei2[2];}break;
- case 7: P2=0XFF; P0=seg7code[shinum2];if(keynum==5 || keynum==0){P2=wei2[1];}break;
- case 8: P2=0XFF; P0=seg7code[genum2]; if(keynum==6 || keynum==0){P2=wei2[0];}break;
- /**************數(shù)碼管2-結(jié)束*****************/
- default: tcnt1=0; P2=0XFF; break;
- }
- }//定時(shí)器0結(jié)束
- void keyflag(){//按鍵結(jié)束調(diào)用,按鍵的建議使用,這樣可以減小code,但是觸發(fā)的不建議
- if(kt0){//當(dāng)標(biāo)志位kt0=1的時(shí)候進(jìn)行
- if(presstime>100){//當(dāng)時(shí)間值大于一百的時(shí)候
- kf0=1;//標(biāo)志位kf0=1
- kt0=0;//標(biāo)志位kt0=0
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
有如下測(cè)試程序
觸發(fā)之后延時(shí)時(shí)間接通(分鐘)時(shí)間可調(diào)0-999
觸發(fā)之后延時(shí)時(shí)間接通(秒)時(shí)間可調(diào)0-999
觸發(fā)之后延時(shí)時(shí)間斷開(分鐘)時(shí)間可調(diào)0-999
觸發(fā)之后延時(shí)時(shí)間斷開(秒)時(shí)間可調(diào)0-999
設(shè)置觸發(fā)次數(shù),當(dāng)觸發(fā)端子1觸發(fā)到設(shè)置的次數(shù)out1吸和 觸發(fā)端子2out2同理
設(shè)置觸發(fā)次數(shù),當(dāng)觸發(fā)端子1觸發(fā)到設(shè)置的次數(shù)out1斷開 觸發(fā)端子2out2同理
所有資料51hei提供下載:
GYJ-0054_雙路可編程數(shù)碼管顯示延時(shí)模塊發(fā)貨資料.rar
(291.71 KB, 下載次數(shù): 38)
2018-2-8 00:26 上傳
點(diǎn)擊文件名下載附件
|