单片机源程序如下:
- #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;
- //按键信号输入引脚定义
- sbit Q1=P1^2; //启动按键
- sbit Q2=P1^3; //停止按键
- sbit Q3=P1^4; //复位按键
- sbit Q4=P1^5; //减时按键
- //继电器信号输入引脚定义
- sbit B0=P3^2; //火线继电器或者零线继电器信号
- sbit B1=P3^3; //火线继电器或者零线继电器信号
- 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 关 */
- void inint()
- {
- TMOD=0x11; //设置T1定时器方式1,T0定时器方式1
- EA=1; //打开总中断
- TH0=(65536-50000)/256; //50ms计数
- TL0=(65536-50000)%256; //50ms计数
- TH1=(65536-50000)/256; //50ms计数
- TL1=(65536-50000)%256; //50ms计数
- //TR0=1; //启动T0定时器
- TR1=1;
- ET0=1; //
- ET1=1;
- //B1=0;
- WDT_CONTR=0x37;
- /* 用于eeprom的初始值设置 */
- num1=num2=byte_read(0x0000); //num2读取eeprom中的数据
- P3M1 = 0xB1|0x00;
- P3M0 = 0xB2|0x0c;
- }
- void keycan()
- {
- if(Q1==0)
- {
- delay_1ms(10); //延时10ms
- if(Q1==0)
- {
- num1=num2;
- num=0;
- TR0=1;
- B0=0;
- S=1;
- }
- while(!Q1); //启动按键松手检测
- }
- if(Q2==0)
- {
- delay_1ms(10);
- if(Q2==0) //停止按键松手检测
- {
- if(S==1)
- {TR0=~TR0;B0=~B0;B1=~B1;}
- }
- while(!Q2);
- }
- if(Q3==0) //复位按键
- {
- delay_1ms(10);
- if(Q3==0) //复位按键松手检测
- {
- B0=1;
- B1=1;
- num1=num2;
- num=0;
- S=0;
- TR0=0;
- }
- while(!Q3);
- }
-
- if(Q4==0) //时间初值设置按键
- {
- delay_1ms(10); //长按3s
- if(Q4==0) //按键松手检测
- {
- num2++;
- if(num2>=100){num2=1;}
- SectorErase(0x0000); //擦出扇区
- byte_write(0x0000,num2); //把num2的值写入eeprom中2000地址
- TM1650_Set(0x48,0x11, //总共8级亮度,现在设置5级亮度
- 0x6E,mun_to_char[16], //数码管个位显示数据
- 0x6C,mun_to_char[16], //数码管个位显示数据
- 0x6A,mun_to_char[num2%10], //数码管十位显示数据
- 0x68,mun_to_char[num2%100/10] //数码管百位显示数?
- );
-
- }
- while(!Q4);
- }
- }
- //数据处理
- void CLshuju()
- {
- i3=num1%100/10;
- i2=num1%10;
- i1=num%100/10;
- i0=num%10; //16进制转换成10进制
- if(i2==0){i2=0;}
- if(i3==0){i3=0;}
-
- TM1650_Set(0x48,0x11, //总共5级亮度,现在设置5级亮度
- 0x6E,mun_to_char[i0], //数码管个位显示数据
- 0x6C,mun_to_char[i1], //数码管十位显示数据
- 0x6A,mun_to_char[i2], //数码管百位显示数据
- 0x68,mun_to_char[i3] //数码管千位显示数据
- );
- }
- void main()
- {
- inint(); //初始化变量
- while(1)
- {
- if(num2>=100){num2=0;} //防止首次上电读取错误的eeprom的数据
- if((num1==0)&&(num==0)){num1=num2;}
- keycan(); //按键检测
- CLshuju(); //数据显示
- }
- }
-
- void timer0() interrupt 1 //计时中断0工作方式1函数。
- {
- TH0=(65536-50000)/256; //50ms计数
- TL0=(65536-50000)%256; //50ms计数
- 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 //计时中断1工作方式1函数。
- {
- TH1=(65536-50000)/256; //50ms计数
- TL1=(65536-50000)%256; //50ms计数
- wg++; //喂狗变量
- if(wg==160) //50ms*160次=8s喂狗
- {
- wg=0;
- WDT_CONTR=0x37; //看门狗溢出时间为9秒
- }
-
- }
复制代码
Keil代码下载:
手动抽水泵软件20211107版.zip
(75.32 KB, 下载次数: 22)
|