【简要说明】 一、板子尺寸:长113mmX宽72mmX高18mm
二、主要器件:单片机、数码管、继电器
三、工作电压:有12V和24两种可供选择
四、板子功耗:小于300mA
GYJ-0054_双路可编程数码管显示延时模块的电路原理图:
pcb图:
实物图与接线图等:
上电out1吸和 触发端子1倒计时开始(时分秒)out2吸和 倒计时中按键不管用 触发端子2则out1吸和
单片机源程序如下:
- #include "demo.h"
- #include "eeprom.h"
- #define uchar unsigned char//宏定义无符号字符型
- #define uint unsigned int //宏定义无符号整型
- uint tcnt1=0;//用于刷新数码管
- uint bainum1,shinum1,genum1;//数码管上显示
- uint bainum2,shinum2,genum2;//数码管上显示
- code uchar seg7code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟
- uchar wei1[3]={0XDf,0XBf,0X7f};//数码管1的位的控制端
- uchar wei2[3]={0XFb,0XF7,0Xef};//数码管2的位的控制端
- bit flag_eeprom1=1;//掉电存储的标志位
- static uchar presstime=0;//时间值按键用到的
- uint kf0=1;//按键用的标志位
- uint kt0=0;//按键用的标志位
- uint keynum=0;//数码管的位
- uint bainum11=0,shinum11=0,genum11=0;//用于传到数码管上显示
- uint bainum22=0,shinum22=0,genum22=0;//用于传到数码管上显示
- uint if0=1,if1=1;//触发用的标志位
- uint it0=0,it1=0;//触发用的标志位
- uint inum1=0,inum2=0,inum3=0;//触发端子用的计数
- uint isecond1=0,isecond2=0;//触发端子用的计数
- uint iminute1=0,iminute2=0;//触发端子用的计数
- uchar inum11=0,inum12=0,inum21=0,inum22=0,inum31=0,inum32=0;//掉电存储
- extern void keycan();//按键
- extern void keyflag();//按键结束调用
- extern void displaynum();//将数字传到数码管上显示
- extern void operations();//操作
- void timer0_1init(void){//定时配置
- TMOD=0x11;//将定时器0,1都设置为模式1
- TL0 = 0xCD;//设置定时器0时间为2ms
- TH0 = 0xF8;//设置定时器0的初始值
- TR0=1;//开启定时器0
- TR1=1;//开启定时器1
- EA=1;//开总中断
- ET0=1;//开定时器0的中断
- }
- void main(){
- timer0_1init();
- inum11=Byte_Read(0x01);//掉电存储用到
- inum12=Byte_Read(0x02);//掉电存储用到
- inum21=Byte_Read(0x03);//掉电存储用到
- inum22=Byte_Read(0x04);//掉电存储用到
- inum31=Byte_Read(0x05);//掉电存储用到
- inum32=Byte_Read(0x06);//掉电存储用到
- inum1=inum11*100+inum12;
- inum2=inum21*100+inum22;
- inum3=inum31*100+inum32;
- bainum11=inum1/10%10;
- shinum11=inum1%10;
-
- genum11=inum2/10%10;
- bainum22=inum2%10;
-
- shinum22=inum3/10%10;
- genum22=inum3%10;
- if(inum1>100 || inum1<0){
- inum1=0;
- }
- if(inum2>60 || inum2<0){
- inum2=0;
- }
- if(inum3>60 || inum3<0){
- inum3=0;
- }
- while(1){
- keycan();//调用按键
- operations();//调用操作
- if (it0==1){//当标志位it0等于1时
- out2=0;//out2输出
- }
- if (it0==0){out1=0;}
- }
- }
- void operations(){//操作
- if(in1==0){//当触发端子1触发
- if0=0;//将if0值改为0,定时器开始倒计时
- it0=1;//将it0置为1,out1输出
- }
- if(in2==0){if0=1;it0=0;}
- }//操作结束
- void keycan(){//按键
- if(keynum==0){//当按键值等于0的时候调用显示
- displaynum();
- }
- if(if0==1){
- if(key1==0){//当按键1按下
- if(kf0){//当标志位kf0=1的时候进行
- if(presstime>100){//当时间值大于一百的时候
- kf0=0;//标志位kf0=0
- kt0=1;//标志位kt0=0
- presstime=0;//时间清零,重新进行
- keynum++;//数码管的位
- if(keynum==7){//当位到7则置位0
- keynum=0;
- }
- }
- }
- }else{//当按键松开
- keyflag();
- }//按键1结束
- }
- if(key2==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;//掉电存储的标志位改为1,进行存值操作
- switch(keynum){
- case 1:
- bainum11++;//数码管一加加
- if(bainum11>9){//当数码管一加加到9时置为1
- bainum11=0;
- }
- break;
- case 2:shinum11++;if(shinum11>9){shinum11=0;}break;
- case 3:genum11++;if(genum11>5){genum11=0;}break;
- case 4:bainum22++;if(bainum22>9){bainum22=0;}break;
- case 5:shinum22++;if(shinum22>5){shinum22=0;}break;
- case 6:genum22++;if(genum22>9){genum22=0;}break;
- default:break;
- }
- }}}else{keyflag();displaynum();
- if((flag_eeprom1==1))//加掉电存储,必需加到这,不然有一些小问题
- { flag_eeprom1=0;
- saveeepro();//掉电存储
- }
- }//松开按键进行显示
- if(key3==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;
- switch(keynum){
- case 1:
- bainum11--;//数码管一减减
- if(bainum11>111){//当数码管一减减到0时置为9
- bainum11=9;
- }
- break;
- case 2:shinum11--;if(shinum11>111){shinum11=9;}break;
- case 3:genum11--;if(genum11>111){genum11=5;}break;
- case 4:bainum22--;if(bainum22>111){bainum22=9;}break;
- case 5:shinum22--;if(shinum22>111){shinum22=5;}break;
- case 6:genum22--;if(genum22>111){genum22=9;}break;
- default:break;
- }
- }}}else{keyflag();displaynum();if((flag_eeprom1==1)){flag_eeprom1=0;saveeepro();}}//松开按键进行显示
- }//按键结束
- void displaynum(){//将数字传到数码管上显示
- if (if0==0){//当if0==0时num1三个数码管进行显示
- bainum1=inum1/10%10;//十位
- shinum1=inum1%10;//个位
- genum1=inum2/10%10;//十位
- bainum2=inum2%10;//个位
- shinum2=inum3/10%10;//十位
- genum2=inum3%10;//个位
- }else{
- bainum1=bainum11;
- shinum1=shinum11;
- genum1=genum11;
- bainum2=bainum22;
- shinum2=shinum22;
- genum2=genum22;
- inum1=bainum11*10+shinum11; //将num1三个数码管的值付给inum
- inum2=genum11*10+bainum22;
- inum3=shinum22*10+genum22;
- }
- }
- void saveeepro(){//掉电存储
- inum11=inum1/100;//把int型的值拆分到char型
- inum12=inum1%100;
- inum21=inum2/100;
- inum22=inum2%100;
- inum31=inum3/100;
- inum32=inum3%100;
- Sector_Erase(0); //擦除0x01地址中的数据 一定要先擦除再写进 同一地址
- Byte_Program(0x01,inum11); //擦除完成就可以写入了
- Byte_Program(0x02,inum12); //擦除完成就可以写入了
- Byte_Program(0x03,inum21); //擦除完成就可以写入了
- Byte_Program(0x04,inum22); //擦除完成就可以写入了
- Byte_Program(0x05,inum31); //擦除完成就可以写入了
- Byte_Program(0x06,inum32); //擦除完成就可以写入了
- }
- void timer0(void)interrupt 1 {//定时器0
- //500等于1秒
- TL0 = 0xCD; //重新设置定时器0时间为2ms
- TH0 = 0xF8; //重新设置定时器0的初始值
- tcnt1++;//用于刷新数码管
- presstime++;//按键用到,用于防抖
- if (if0==0){//当if0等于0时
- isecond1++;//当触发1触发后进行计数(秒)
- if (isecond1==500){//一秒时间到
- isecond1=0;//置为0,重新开始计
- if(if1==1){
- if1=0;
- }else{
- if1=1;
- }
- inum3--;
- if(inum3<0 || inum3>60 ){//说明一分钟到了
- inum3=59;
- inum2--;//inum进行减减
- if(inum2<0 || inum2>60){//当inum等于0时
- inum2=59;
- inum1--;
- if(inum1<0|| inum1>100){
- if0=1;//将标志位if0置为1
- it0=0;//将标志位it0置为0,out1断开
- }
- }
- }
- }
- }//触发端子1的计时结束
- switch(tcnt1){
- /**************数码管1-开始*****************/
- case 1: P2=0XFF; P0=seg7code[bainum1];if(keynum==1 || keynum==0){P2=wei1[2];}break;
- case 2: P2=0XFF; P0=seg7code[shinum1];if(keynum==2 || keynum==0){P2=wei1[1];}break;
- case 3: P2=0XFF; P0=0x7f;if(if1==1){P2=wei1[1];}break;//小数点
- case 4: P2=0XFF; P0=seg7code[genum1]; if(keynum==3 || keynum==0){P2=wei1[0];}break;
- /**************数码管1-结束*****************/
- /**************数码管2-开始*****************/
- case 5: P2=0XFF; P0=seg7code[bainum2];if(keynum==4 || keynum==0){P2=wei2[2];}break;
- case 6: P2=0XFF; P0=0x7f;if(if1==1){P2=wei2[2];}break;
- case 7: P2=0XFF; P0=seg7code[shinum2];if(keynum==5 || keynum==0){P2=wei2[1];}break;
- case 8: P2=0XFF; P0=seg7code[genum2]; if(keynum==6 || keynum==0){P2=wei2[0];}break;
- /**************数码管2-结束*****************/
- default: tcnt1=0; P2=0XFF; break;
- }
- }//定时器0结束
- void keyflag(){//按键结束调用,按键的建议使用,这样可以减小code,但是触发的不建议
- if(kt0){//当标志位kt0=1的时候进行
- if(presstime>100){//当时间值大于一百的时候
- kf0=1;//标志位kf0=1
- kt0=0;//标志位kt0=0
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
有如下测试程序
触发之后延时时间接通(分钟)时间可调0-999
触发之后延时时间接通(秒)时间可调0-999
触发之后延时时间断开(分钟)时间可调0-999
触发之后延时时间断开(秒)时间可调0-999
设置触发次数,当触发端子1触发到设置的次数out1吸和 触发端子2out2同理
设置触发次数,当触发端子1触发到设置的次数out1断开 触发端子2out2同理
所有资料51hei提供下载:
GYJ-0054_双路可编程数码管显示延时模块发货资料.rar
(291.71 KB, 下载次数: 38)
|