找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2650|回复: 3
收起左侧

双路可编程数码管显示延时模块电路图资料与单片机源程序

[复制链接]
ID:280979 发表于 2018-2-8 00:26 | 显示全部楼层 |阅读模式
【简要说明】
一、板子尺寸:长113mmX宽72mmX18mm
二、主要器件:单片机、数码管、继电器
三、工作电压:有12V24两种可供选择
四、板子功耗:小于300mA

GYJ-0054_双路可编程数码管显示延时模块的电路原理图:
0.png

pcb图:
0.png

实物图与接线图等:
DSC_0102.JPG DSC_0100.JPG DSC_0091.JPG DSC_0089.JPG DSC_0088.JPG


上电out1吸和 触发端子1倒计时开始(时分秒)out2吸和  倒计时中按键不管用 触发端子2则out1吸和
单片机源程序如下:
  1. #include "demo.h"
  2. #include "eeprom.h"

  3. #define uchar unsigned char//宏定义无符号字符型
  4. #define uint unsigned int  //宏定义无符号整型
  5. uint tcnt1=0;//用于刷新数码管
  6. uint bainum1,shinum1,genum1;//数码管上显示
  7. uint bainum2,shinum2,genum2;//数码管上显示
  8. code uchar seg7code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟
  9. uchar wei1[3]={0XDf,0XBf,0X7f};//数码管1的位的控制端
  10. uchar wei2[3]={0XFb,0XF7,0Xef};//数码管2的位的控制端
  11. bit flag_eeprom1=1;//掉电存储的标志位
  12. static uchar presstime=0;//时间值按键用到的
  13. uint kf0=1;//按键用的标志位
  14. uint kt0=0;//按键用的标志位
  15. uint keynum=0;//数码管的位
  16. uint bainum11=0,shinum11=0,genum11=0;//用于传到数码管上显示
  17. uint bainum22=0,shinum22=0,genum22=0;//用于传到数码管上显示
  18. uint if0=1,if1=1;//触发用的标志位
  19. uint it0=0,it1=0;//触发用的标志位
  20. uint inum1=0,inum2=0,inum3=0;//触发端子用的计数
  21. uint isecond1=0,isecond2=0;//触发端子用的计数
  22. uint iminute1=0,iminute2=0;//触发端子用的计数
  23. uchar inum11=0,inum12=0,inum21=0,inum22=0,inum31=0,inum32=0;//掉电存储
  24. extern void keycan();//按键
  25. extern void keyflag();//按键结束调用
  26. extern void displaynum();//将数字传到数码管上显示
  27. extern void operations();//操作
  28. void timer0_1init(void){//定时配置
  29.         TMOD=0x11;//将定时器0,1都设置为模式1
  30.         TL0 = 0xCD;//设置定时器0时间为2ms
  31.         TH0 = 0xF8;//设置定时器0的初始值
  32.         TR0=1;//开启定时器0
  33.         TR1=1;//开启定时器1
  34.         EA=1;//开总中断
  35.         ET0=1;//开定时器0的中断
  36. }
  37. void main(){
  38.         timer0_1init();
  39.    inum11=Byte_Read(0x01);//掉电存储用到  
  40.    inum12=Byte_Read(0x02);//掉电存储用到
  41.    inum21=Byte_Read(0x03);//掉电存储用到
  42.    inum22=Byte_Read(0x04);//掉电存储用到
  43.    inum31=Byte_Read(0x05);//掉电存储用到
  44.    inum32=Byte_Read(0x06);//掉电存储用到
  45.    inum1=inum11*100+inum12;
  46.    inum2=inum21*100+inum22;
  47.    inum3=inum31*100+inum32;
  48.    bainum11=inum1/10%10;
  49.    shinum11=inum1%10;
  50.    
  51.    genum11=inum2/10%10;
  52.    bainum22=inum2%10;
  53.    
  54.    shinum22=inum3/10%10;
  55.    genum22=inum3%10;
  56.    if(inum1>100 || inum1<0){
  57.                    inum1=0;
  58.    }
  59.    if(inum2>60 || inum2<0){
  60.                    inum2=0;
  61.    }
  62.    if(inum3>60 || inum3<0){
  63.                    inum3=0;
  64.    }
  65.         while(1){
  66.                 keycan();//调用按键
  67.                 operations();//调用操作       
  68.                 if (it0==1){//当标志位it0等于1时
  69.                         out2=0;//out2输出
  70.                 }
  71.                 if (it0==0){out1=0;}
  72.         }
  73. }
  74. void operations(){//操作
  75.     if(in1==0){//当触发端子1触发
  76.                 if0=0;//将if0值改为0,定时器开始倒计时
  77.                 it0=1;//将it0置为1,out1输出
  78.         }
  79.     if(in2==0){if0=1;it0=0;}
  80. }//操作结束
  81. void keycan(){//按键
  82.         if(keynum==0){//当按键值等于0的时候调用显示
  83.                 displaynum();
  84.         }
  85. if(if0==1){
  86.     if(key1==0){//当按键1按下
  87.                 if(kf0){//当标志位kf0=1的时候进行
  88.                         if(presstime>100){//当时间值大于一百的时候
  89.                                 kf0=0;//标志位kf0=0
  90.                                 kt0=1;//标志位kt0=0
  91.                                 presstime=0;//时间清零,重新进行
  92.                                 keynum++;//数码管的位
  93.                         if(keynum==7){//当位到7则置位0
  94.                                    keynum=0;
  95.                                  }

  96.                         }
  97.                   }
  98.         }else{//当按键松开
  99.                 keyflag();
  100.         }//按键1结束
  101. }
  102.     if(key2==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;//掉电存储的标志位改为1,进行存值操作
  103.                                 switch(keynum){
  104.                                         case 1:
  105.                                                 bainum11++;//数码管一加加
  106.                                                 if(bainum11>9){//当数码管一加加到9时置为1
  107.                                                         bainum11=0;
  108.                                                 }
  109.                                                 break;
  110.                                         case 2:shinum11++;if(shinum11>9){shinum11=0;}break;
  111.                                         case 3:genum11++;if(genum11>5){genum11=0;}break;
  112.                                         case 4:bainum22++;if(bainum22>9){bainum22=0;}break;
  113.                                         case 5:shinum22++;if(shinum22>5){shinum22=0;}break;
  114.                                         case 6:genum22++;if(genum22>9){genum22=0;}break;
  115.                                         default:break;
  116.                                 }
  117.                         }}}else{keyflag();displaynum();
  118.                                         if((flag_eeprom1==1))//加掉电存储,必需加到这,不然有一些小问题
  119.                                         {   flag_eeprom1=0;
  120.                                             saveeepro();//掉电存储
  121.                                         }
  122.                         }//松开按键进行显示

  123.     if(key3==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;
  124.                                 switch(keynum){
  125.                                         case 1:
  126.                                                 bainum11--;//数码管一减减
  127.                                                 if(bainum11>111){//当数码管一减减到0时置为9
  128.                                                         bainum11=9;
  129.                                                 }
  130.                                                 break;
  131.                                         case 2:shinum11--;if(shinum11>111){shinum11=9;}break;
  132.                                         case 3:genum11--;if(genum11>111){genum11=5;}break;
  133.                                         case 4:bainum22--;if(bainum22>111){bainum22=9;}break;
  134.                                         case 5:shinum22--;if(shinum22>111){shinum22=5;}break;
  135.                                         case 6:genum22--;if(genum22>111){genum22=9;}break;
  136.                                         default:break;
  137.                                 }                               
  138.                         }}}else{keyflag();displaynum();if((flag_eeprom1==1)){flag_eeprom1=0;saveeepro();}}//松开按键进行显示       

  139. }//按键结束
  140. void displaynum(){//将数字传到数码管上显示
  141.         if (if0==0){//当if0==0时num1三个数码管进行显示               
  142.                 bainum1=inum1/10%10;//十位
  143.                 shinum1=inum1%10;//个位
  144.                 genum1=inum2/10%10;//十位
  145.                 bainum2=inum2%10;//个位
  146.                 shinum2=inum3/10%10;//十位
  147.                 genum2=inum3%10;//个位
  148.         }else{
  149.                 bainum1=bainum11;
  150.                 shinum1=shinum11;
  151.                 genum1=genum11;
  152.                 bainum2=bainum22;
  153.                 shinum2=shinum22;
  154.                 genum2=genum22;
  155.                 inum1=bainum11*10+shinum11;        //将num1三个数码管的值付给inum
  156.                 inum2=genum11*10+bainum22;
  157.                 inum3=shinum22*10+genum22;
  158.         }                         
  159. }
  160. void saveeepro(){//掉电存储
  161.                          inum11=inum1/100;//把int型的值拆分到char型
  162.                          inum12=inum1%100;
  163.                          inum21=inum2/100;
  164.                          inum22=inum2%100;
  165.                          inum31=inum3/100;
  166.                          inum32=inum3%100;
  167.                             Sector_Erase(0);           //擦除0x01地址中的数据          一定要先擦除再写进  同一地址                               
  168.                       Byte_Program(0x01,inum11);            //擦除完成就可以写入了
  169.                           Byte_Program(0x02,inum12);            //擦除完成就可以写入了
  170.                       Byte_Program(0x03,inum21);            //擦除完成就可以写入了
  171.                           Byte_Program(0x04,inum22);            //擦除完成就可以写入了
  172.                       Byte_Program(0x05,inum31);            //擦除完成就可以写入了
  173.                           Byte_Program(0x06,inum32);            //擦除完成就可以写入了
  174. }
  175. void timer0(void)interrupt 1  {//定时器0          
  176.         //500等于1秒
  177.         TL0 = 0xCD;                //重新设置定时器0时间为2ms
  178.         TH0 = 0xF8;                //重新设置定时器0的初始值
  179.         tcnt1++;//用于刷新数码管
  180.         presstime++;//按键用到,用于防抖       
  181.         if (if0==0){//当if0等于0时
  182.                 isecond1++;//当触发1触发后进行计数(秒)
  183.                 if (isecond1==500){//一秒时间到
  184.                         isecond1=0;//置为0,重新开始计
  185.                         if(if1==1){
  186.                                 if1=0;
  187.                         }else{
  188.                                 if1=1;
  189.                         }
  190.                         inum3--;
  191.                         if(inum3<0 || inum3>60 ){//说明一分钟到了
  192.                                 inum3=59;
  193.                                 inum2--;//inum进行减减
  194.                                 if(inum2<0 || inum2>60){//当inum等于0时
  195.                                         inum2=59;
  196.                                         inum1--;
  197.                                         if(inum1<0|| inum1>100){                                                              
  198.                                                         if0=1;//将标志位if0置为1
  199.                                                         it0=0;//将标志位it0置为0,out1断开
  200.                                         }
  201.                                 }
  202.                         }
  203.                 }
  204.         }//触发端子1的计时结束
  205.         switch(tcnt1){
  206.         /**************数码管1-开始*****************/
  207.           case 1: P2=0XFF; P0=seg7code[bainum1];if(keynum==1 || keynum==0){P2=wei1[2];}break;
  208.           case 2: P2=0XFF; P0=seg7code[shinum1];if(keynum==2 || keynum==0){P2=wei1[1];}break;
  209.           case 3: P2=0XFF; P0=0x7f;if(if1==1){P2=wei1[1];}break;//小数点
  210.           case 4: P2=0XFF; P0=seg7code[genum1]; if(keynum==3 || keynum==0){P2=wei1[0];}break;
  211.         /**************数码管1-结束*****************/
  212.         /**************数码管2-开始*****************/       
  213.           case 5: P2=0XFF; P0=seg7code[bainum2];if(keynum==4 || keynum==0){P2=wei2[2];}break;
  214.           case 6: P2=0XFF; P0=0x7f;if(if1==1){P2=wei2[2];}break;
  215.           case 7: P2=0XFF; P0=seg7code[shinum2];if(keynum==5 || keynum==0){P2=wei2[1];}break;
  216.           case 8: P2=0XFF; P0=seg7code[genum2]; if(keynum==6 || keynum==0){P2=wei2[0];}break;
  217.         /**************数码管2-结束*****************/       
  218.           default: tcnt1=0; P2=0XFF; break;
  219.          }
  220. }//定时器0结束
  221. void keyflag(){//按键结束调用,按键的建议使用,这样可以减小code,但是触发的不建议
  222.            if(kt0){//当标志位kt0=1的时候进行
  223.                    if(presstime>100){//当时间值大于一百的时候
  224.                         kf0=1;//标志位kf0=1
  225.                         kt0=0;//标志位kt0=0
  226. ……………………

  227. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

有如下测试程序
触发之后延时时间接通(分钟)时间可调0-999
触发之后延时时间接通(秒)时间可调0-999
触发之后延时时间断开(分钟)时间可调0-999
触发之后延时时间断开(秒)时间可调0-999
设置触发次数,当触发端子1触发到设置的次数out1吸和   触发端子2out2同理
设置触发次数,当触发端子1触发到设置的次数out1断开  触发端子2out2同理
0.png

所有资料51hei提供下载:
GYJ-0054_双路可编程数码管显示延时模块发货资料.rar (291.71 KB, 下载次数: 38)
回复

使用道具 举报

ID:272609 发表于 2018-9-23 08:15 | 显示全部楼层
谢谢楼主的分享,虽然不能完全看懂,不过也能学到很多的东西,另外好像你这个主芯片不是89C51了,又增加了一些难度
回复

使用道具 举报

ID:405738 发表于 2018-10-6 08:06 | 显示全部楼层
楼主资料不错
回复

使用道具 举报

ID:752621 发表于 2020-5-15 15:48 | 显示全部楼层
我想下载,怎样才能下载?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表