本帖最后由 shui206 于 2018-9-30 15:59 編輯
本人是一個電力從業者,主業為強電,最近想做一個小設備,用51單片機加四個按鍵和6位共陰極數碼管
要求功能是,用定時器中斷在設定的時間,循環發送一個分閘脈沖命令 延時后再發送合閘命令,一次循環后計數加1;
分閘和合閘脈沖的延時時間可調,并且在按下設置按鍵后,數碼管分別用3位顯示分閘設定時間,3位顯示合閘設定時間并且循環先停止
時間可以加減,
在常規循環發送分 合閘命令時 顯示的是循環次數
程序寫了后,循環信號暫停,但是顯示的還是循環次數,本人是野路子 程序貼出來大家俅俅,有時間的幫看下
//程序功能包含分合閘脈沖輸出,延時時間可調,及每次輸出一輪分合閘信號,計數。
//程序設置參數時 分合閘脈沖輸出暫停
單片機源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit hout=P1^0; //合閘信號輸出
- sbit fout=P1^2; //分閘信號輸出
- sbit seth=P1^1; //分閘延時時間設置時指示
- sbit setf=P1^3; //合閘延時時間設置指示
- sbit run=P1^7; //運行指示燈
- sbit s1=P3^2; //設置鍵,外部中斷位
- sbit s2=P3^5; //減少鍵
- sbit s3=P3^6; //增加鍵
- sbit s4=P3^7; //清零鍵
- sbit dula=P2^6; //段選
- sbit wela=P2^7; //位選
- sbit beep=P2^3; //蜂鳴器
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //數碼管顯示數字
- uchar code tablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //六位數碼管位選信號
- uchar count1,count2,s1num,numsetf,numseth,miaof,miaoh;
- uint numdis; //定義循環次數
- void delayms(uchar z) //12M晶振延時毫秒函數
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=123;y>0;y--);
- }
- //void delay(uchar z) //12M晶振時秒函數
- //{
- // uint x,y,w;
- //for(x=z;x>0;x--)
- // for(y=123;y>0;y--)
- // for(w=10;y>0;y--);
- //}
- void di() //蜂鳴器發聲函數
- {
- beep=0;
- delayms(100);
- beep=1;
- }
- void display(uint numdis) //顯示次數函數
- {
- uchar wan,qian,bai,shi,ge;
- wan=numdis/10000;
- qian=numdis%10000/1000;
- bai=numdis%1000/100;
- shi=numdis%100/10;
- ge=numdis%10;
- dula=1;
- P0=table[wan];
- dula=0;
- P0=0xff;
- wela=1;
- P0=tablewei[1];
- wela=0;
- delayms(5);
- dula=1;
- P0=table[qian];
- dula=0;
- P0=0xff;
- wela=1;
- P0=tablewei[2];
- wela=0;
- delayms(5);
- dula=1;
- P0=table[bai];
- dula=0;
- P0=0xff;
- wela=1;
- P0=tablewei[3];
- wela=0;
- delayms(5);
- dula=1;
- P0=table[shi];
- dula=0;
- P0=0xff;
- wela=1;
- P0=tablewei[4];
- wela=0;
- delayms(5);
- dula=1;
- P0=table[ge];
- dula=0;
- P0=0xff;
- wela=1;
- P0=tablewei[5];
- wela=0;
- delayms(5);
- }
- void display_setf(uchar numsettf) //顯示設置分閘延時時間的函數
- {
- uchar bai,shi,ge;
- bai=numsettf%1000/100;
- shi=numsettf%100/10;
- ge=numsettf%10;
- dula=1;
- P0=table[bai];
- dula=0;
- P0=0xff;
- wela=1;
- P0=tablewei[3];
- wela=0;
- delayms(5);
- dula=1;
- P0=table[shi];
- dula=0;
- P0=0xff;
- wela=1;
- P0=tablewei[4];
- wela=0;
- delayms(5);
- dula=1;
- P0=table[ge];
- dula=0;
- P0=0xff;
- wela=1;
- P0=tablewei[5];
- wela=0;
- delayms(5);
- }
- void display_seth(uchar numsetth) //顯示設置合閘延時時間的函數
- {
- uchar bai,shi,ge;
- shi=numsetth%100/10;
- bai=numsetth%1000/100;
- ge=numsetth%10;
- dula=1;
- P0=table[bai];
- dula=0;
- P0=0xff;
- wela=1;
- P0=tablewei[0];
- wela=0;
- delayms(5);
- dula=1;
- P0=table[shi];
- dula=0;
- P0=0xff;
- wela=1;
- P0=tablewei[1];
- wela=0;
- delayms(5);
- dula=1;
- P0=table[ge];
- dula=0;
- P0=0xff;
- wela=1;
- P0=tablewei[2];
- wela=0;
- delayms(5);
- }
- void keyscan() //按鍵掃描函數
- {
- if(s1==0)
- {
- delayms(5);
- if(s1==0) //設置鍵啟動
- {
- s1num++;
- run=1;
- while(!s1);
- di();
- if(s1num==1) //按一次設置鍵
- {
- TR0=0;
- TR1=0;
- setf=0; //分閘延時設置指示
- seth=1;
- }
- if(s1num==2) //按兩次設置鍵
- {
- setf=1;
- seth=0;
- }
- if(s1num==3) //按三次設置鍵
- {
- s1num=0; //設置按鍵計數清零
- display(numdis);
- run=0;
- setf=1;
- seth=1;
- TR0=1;
- }
- }
- }
- if(s1num!=0)
- {
- if(s2==0)
- {
- delayms(5);
- if(s2==0)
- {
- while(!s2);
- di();
- if(s1num==1)
- {
- display_setf(numsetf); //顯示實時分閘延時時間
- numsetf++;
- if(numsetf==201)
- numsetf=0; //分閘延時最長200秒清零
- }
- if(s1num==2)
- {
- display_seth(numseth); //顯示實時合閘延時時間
- numseth++;
- if(numseth==201)
- numseth=0; //合閘延時最長200秒清零
- }
- }
- }
- if(s3==0)
- {
- delayms(5);
- if(s3==0)
- {
- while(!s3);
- di();
- if(s1num==1)
- {
- display_setf(numsetf); //顯示實時分閘延時時間
- numsetf--;
- if(numsetf==0)
- numsetf=200; //分閘延時最長200秒清零
- }
- if(s1num==2)
- {
- display_seth(numseth); //顯示實時合閘延時時間
- numseth++;
- if(numseth==0)
- numseth=200; //合閘延時最長200秒清零
- }
- }
- }
- if(s4==0)
- {
- delayms(5);
- if(s4==0)
- numdis=0; //循環計數清零
- }
- }
- }
- void init()//初始化函數
- {
- numdis=0;
- numsetf=45;
- numseth=45;
- count1=0;
- count2=0;
- miaof=0;
- miaoh=0;
- fout=1;
- hout=1;
- run=0;
- setf=1;
- seth=1;
- TMOD=0x11;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1; //打開總中斷
- ET0=1;
- ET1=1;
- TR0=1;
- TR1=0;
- }
- void main() //主函數
- {
- init();
- while(1)
- {
- keyscan();
- display(numdis);
- }
- }
- void T0_time() interrupt 1
- {
- TH0=(65536-45872)/256;
- TL0=(65536-45872)%256;
- count1++;
- if(count1==2)
- {
- count1=0;
- miaof++;
- if(miaof==numsetf)
- {
- miaof=0;
- fout=0;
- delayms(200);
- fout=1;
- TR0=0;
- TR1=1;
- }
- }
- }
- void T1_time() interrupt 3
- {
- TH1=(65536-45872)/256;
- TL1=(65536-45872)%256;
- count2++;
- if(count2==2)
- {
- count2=0;
- miaoh++;
- if(miaoh==numseth)
- {
- miaoh=0;
- hout=0;
- delayms(200);
- hout=1;
- numdis++;
- TR0=1;
- TR1=0;
- }
- }
- }
復制代碼
|