Altium Designer画的带数码管延时模块原理图和PCB图如下:(51hei附件中可下载工程文件)
制作出来的实物图如下:
单片机源程序如下:
代码:
- /********************************************************************
- 汇诚科技
- 实现功能:继电器通、断时间都可调控制程序(eeprom)
- 使用芯片:STC12C5204AD
- 晶振:11.0592MHZ
- 编译环境:Keil
- 硬件环境:四位数显两路输入三按键
- 作者:yang
- QQ:790244909
- 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
- /********************************************************************
- /********************************************************************
- 功能说明:继电器循环通断控制程序
- 继电器通、断时间可调,
- key1功能键:调节模式与实时显示模式转换
- keynum=0:实时显示计时模式
- keynum=1:调整继电器设定闭合秒
- keynum=2:调整继电器设定闭合分
- keynum=3:调整继电器设定断开秒
- keynum=4:调整继电器设定断开分
- 以上四个设定值设定好后都存入eeprom,掉电可记忆
- 上电时,继电器吸合,数显开始计时,到达设定闭合时间后断开;数显清零,
- 数显开始计时,到设定时间,继电器闭合,数显清零。。。
- 循环下去。。
- 设定断开时间最大是10分59秒
- 设定闭合时间最大是10分59秒
- ********************************************************************/
- #include<STC12C5A60S2.H> //库文件
- #include <intrins.h>
- #include"eprom.h"
- #define uchar unsigned char//宏定义无符号字符型
- #define uint unsigned int //宏定义无符号整型
- #define DUAN P2 //P0口控制段
- #define WEI P1 //P2口控制位
- sbit jdq= P3^7;
- sbit key1=P3^2; //功能按键
- sbit key2=P3^3; //增加
- sbit key3=P3^4; //减小
- /********************************************************************
- 初始定义
- *********************************************************************/
- code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟
- uchar wei[4]={0X01,0X02,0X04,0X08}; //位的控制端
- uchar numb[4]; //定义字符串
- uchar cnt,keynum;
- uchar setfen,setmiao;
- uchar setdf,setdm;
- uchar miao,fen;
- void IapEraseSector(uint addr);
- void IapProgramByte(uint addr,uchar dat);
- uchar IapReadByte(uint addr);
- bit flag=1; //闭合断开标志位
- /********************************************************************
- 延时函数
- *********************************************************************/
- void delay(uchar x) //延时程序 0.1秒
- {
- uchar m,n,s;
- for(m=x;m>0;m--)
- for(n=20;n>0;n--)
- for(s=248;s>0;s--);
- }
- /********************************************************************
- 显示函数
- *********************************************************************/
- void display(uchar a ,uchar b) //显示函数
- {
- WEI&=0XF0;
- DUAN=seg7code[a/10];
- WEI=wei[0];
- delay(2);
- WEI&=0XF0;
- DUAN=seg7code[a%10]&0x7f;
- WEI=wei[1];
- delay(2);
- WEI&=0XF0;
- DUAN=seg7code[b/10];
- WEI=wei[2];
- delay(2);
- WEI&=0XF0;
- DUAN=seg7code[b%10];
- WEI=wei[3];
- delay(2);
-
- WEI&=0XF0;
- }
- /********************************************************************
- 按键扫描
- *********************************************************************/
- void keyscan(void)
- {
- if(key1==0)
- { delay(1);
- if(key1==0)
- {
- while(!key1);
- keynum++;
- TR0=0;
- jdq=0;
- if(keynum>=5)
- {
- keynum=0;
- miao=fen=0;
- TR0=1;
- jdq=1;
- }
- }
- }
- switch(keynum)
- {
- case 1: if(key2==0)
- {
- delay(5);
- if(key2==0)
- {
- while(!key2)display(setfen,setmiao);
- setmiao++;
- if(setmiao>59)
- setmiao=59;
- IapEraseSector(0);
- IapProgramByte(0,setmiao); //写入函数
- }
- }
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- while(!key3)display(setfen,setmiao);
- setmiao--;
- if(setmiao==0||setmiao>=250)
- setmiao=0;
- IapEraseSector(0);
- IapProgramByte(0,setmiao); //写入函数
- }
- }
- display(setfen,setmiao);
- break;
- case 2: if(key2==0)
- {
- delay(5);
- if(key2==0)
- {
- while(!key2)display(setfen,setmiao);
- setfen++;
- if(setfen>99)
- setfen=99;
- IapEraseSector(512);
- IapProgramByte(512,setfen); //写入函数
- }
- }
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- while(!key3)display(setfen,setmiao);
- setfen--;
- if(setfen==0||setfen>=250)
- setfen=0;
- IapEraseSector(512);
- IapProgramByte(512,setfen); //写入函数
- }
- }
- // display(setfen,setmiao);
- break;
- case 3:
- if(key2==0)
- {
- delay(5);
- if(key2==0)
- {
- while(!key2)display(setdf,setdm);
- setdm++;
- if(setdm>59)
- setdm=59;
- IapEraseSector(0);
- IapProgramByte(0,setmiao); //写设定闭合时间秒
- IapProgramByte(1,setdm); //写设定断开时间秒
- }
- }
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- while(!key3)
- display(setdf,setdm);
- setdm--;
- if(setdm==0||setdm>=250)
- setdm=0;
- IapEraseSector(0);
- IapProgramByte(0,setmiao); //写设定闭合时间秒
- IapProgramByte(1,setdm); ////写设定断开时间秒
- }
- }
- break;
- case 4:if(key2==0)
- {
- delay(5);
- if(key2==0)
- {
- while(!key2)
- display(setdf,setdm);;
- setdf++;
- if(setdf>10)
- setdf=10;
- IapEraseSector(512);
- IapProgramByte(512,setfen); //写设定闭合时间分
- IapProgramByte(513,setdf); //写设定断开时间秒
- }
- }
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- while(!key3)
- display(setdf,setdm);
- setdf--;
- if(setdf==0||setdf>=250)
- setdf=0;
- IapEraseSector(512);
- IapProgramByte(512,setfen); //写设定闭合时间分
- IapProgramByte(513,setdf); //写设定断开时间分
- }
- }
- //
- break;
- default : break;
- }
- }
- /********************************************************************
- 定时器T0初始化
- *********************************************************************/
- void cshh()
- {
- TMOD|=0X01; //定义定时器工作方式
- TH0=0Xa6;
- TL0=0X01;
- ET0=1;
- TR0=1; //开定时器
- EA=1; //开中断
- }
- /********************************************************************
- 初始化函数
- *********************************************************************/
- void init_all(void)
- {
- P2M1=0;
- P2M0=0xff;
- P1M1=0;
- P1M0=0x0f;
- P3M1&=0x7f;
- P3M0|=0x80;
- P3=0xff;
- }
- /********************************************************************
- 主函数
- *********************************************************************/
- void main()
- {
- init_all();
- setfen=IapReadByte(512); //读设定闭合秒
- setdf= IapReadByte(513); //读设定断开秒
- setmiao=IapReadByte(0); //读设定闭合分
- setdm=IapReadByte(1); //读设定断开秒
- cshh(); //定时器初始化
- while(1)
- {
- if(keynum==0) //实时计时模式
- {
- display(fen,miao);
- }
- if(keynum>0&&keynum<3) //设定闭合分和秒模式
- display(setfen,setmiao);
- if(keynum>=3&&keynum<5) //设定断开分和秒模式
- display(setdf,setdm);
- keyscan();
- }
- }
- /********************************************************************
- 定时器中断函数
- *********************************************************************/
- void timer1(void)interrupt 1
- {
- TH0=0Xa6; //定时初值
- TL0=0X01; //定时初值
- cnt++;
- if(cnt>=40)
- {
- cnt=0;
- miao++;
- if(miao>=60)
- {
- miao=0;
- fen++;
- }
- }
- if((fen>=setfen)&&(miao>=setmiao)&&flag)
- {
- flag=0;
- jdq=0;
- miao=0;
- fen=0;
- }
- if((fen>=setdf)&&(miao>=setdm)&&(flag==0))
- {
- jdq=1;
- miao=0;
- fen=0;
- flag=1;
- }
- }
【简介】一、 尺寸:长88.1cmX宽44.7cmX高2cm
二、 工作电压:直流12伏;
三、 特点:
1、可编程(通过下载排针可下载程序),比较灵活
2、具有两路(IN0和IN1)控制/检测信号输入端(也可作为两路AD采样输入)
3、有三个按键输入可以用来编程作为调节参数
4、一路DS18B20温度采集
5、具有继电器吸合指示灯
6、可控制交流220V/10A一下设备。(最大控制设备2000W)
7、可实现一路信号(低电平有效)输入控制继电器延时闭合,延时通断功能
8、具有继电器吸合指示灯
四、默认功能:
l 温度设定要有存储功能,断电重新启动时,设定的温度值有记忆。
l 设定报警温度值,设定温度范围是0到125度
l 温度设定用三个按键完成。分别为:key1功能键、key2调节键
l 按键要有防抖动功能。
l 按功能键key1时显示上次的温度设定值。同时设定温度的百位值闪烁,按上调键一次温度升高一度,同理,再次按下功能键时,十位进行调节。。
l 开机显示设定温度值,过5秒后显示实测温度。
l 当超过设定温度值时继电器吸合,低于设定温度时断开
l 串口发送温度值(注:需要改动板子,外加晶振)
五、可以根据顾客要求设计各种产品模块,延时、温度报警、电脑控制等等
六、DS18B20简介
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
1: 技术性能描述
①、 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
② 、测温范围 -55℃~+125℃,固有测温误差(注意,不是分辨率,这里之前是错误的)0.5℃。
③、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
④、工作电源: 3~5V/DC
⑤ 、在使用中不需要任何外围元件
⑥、 测量结果以9~12位数字量方式串行传送
⑦ 、不锈钢保护管直径 Φ6
⑧ 、适用于DN15~25, DN40~DN250各种介质工业管道和狭小空间设备测温
⑨、 标准安装螺纹 M10X1, M12X1.5, G1/2”任选
⑩ 、PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接