本帖最后由 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;
- }
- }
- }
复制代码
|