本帖最后由 shui206 于 2018-9-30 15:59 編輯
本人是一個電力從業(yè)者,主業(yè)為強(qiáng)電,最近想做一個小設(shè)備,用51單片機(jī)加四個按鍵和6位共陰極數(shù)碼管
要求功能是,用定時器中斷在設(shè)定的時間,循環(huán)發(fā)送一個分閘脈沖命令 延時后再發(fā)送合閘命令,一次循環(huán)后計數(shù)加1;
分閘和合閘脈沖的延時時間可調(diào),并且在按下設(shè)置按鍵后,數(shù)碼管分別用3位顯示分閘設(shè)定時間,3位顯示合閘設(shè)定時間并且循環(huán)先停止
時間可以加減,
在常規(guī)循環(huán)發(fā)送分 合閘命令時 顯示的是循環(huán)次數(shù)
程序?qū)懥撕,循環(huán)信號暫停,但是顯示的還是循環(huán)次數(shù),本人是野路子 程序貼出來大家俅俅,有時間的幫看下
//程序功能包含分合閘脈沖輸出,延時時間可調(diào),及每次輸出一輪分合閘信號,計數(shù)。
//程序設(shè)置參數(shù)時 分合閘脈沖輸出暫停
單片機(jī)源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit hout=P1^0; //合閘信號輸出
- sbit fout=P1^2; //分閘信號輸出
- sbit seth=P1^1; //分閘延時時間設(shè)置時指示
- sbit setf=P1^3; //合閘延時時間設(shè)置指示
- sbit run=P1^7; //運行指示燈
- sbit s1=P3^2; //設(shè)置鍵,外部中斷位
- 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}; //數(shù)碼管顯示數(shù)字
- uchar code tablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //六位數(shù)碼管位選信號
- uchar count1,count2,s1num,numsetf,numseth,miaof,miaoh;
- uint numdis; //定義循環(huán)次數(shù)
- void delayms(uchar z) //12M晶振延時毫秒函數(shù)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=123;y>0;y--);
- }
- //void delay(uchar z) //12M晶振時秒函數(shù)
- //{
- // uint x,y,w;
- //for(x=z;x>0;x--)
- // for(y=123;y>0;y--)
- // for(w=10;y>0;y--);
- //}
- void di() //蜂鳴器發(fā)聲函數(shù)
- {
- beep=0;
- delayms(100);
- beep=1;
- }
- void display(uint numdis) //顯示次數(shù)函數(shù)
- {
- 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) //顯示設(shè)置分閘延時時間的函數(shù)
- {
- 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) //顯示設(shè)置合閘延時時間的函數(shù)
- {
- 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() //按鍵掃描函數(shù)
- {
- if(s1==0)
- {
- delayms(5);
- if(s1==0) //設(shè)置鍵啟動
- {
- s1num++;
- run=1;
- while(!s1);
- di();
- if(s1num==1) //按一次設(shè)置鍵
- {
- TR0=0;
- TR1=0;
- setf=0; //分閘延時設(shè)置指示
- seth=1;
- }
- if(s1num==2) //按兩次設(shè)置鍵
- {
- setf=1;
- seth=0;
- }
- if(s1num==3) //按三次設(shè)置鍵
- {
- s1num=0; //設(shè)置按鍵計數(shù)清零
- 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; //循環(huán)計數(shù)清零
- }
- }
- }
- void init()//初始化函數(shù)
- {
- 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() //主函數(shù)
- {
- 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;
- }
- }
- }
復(fù)制代碼
|