登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看5402|回2|收藏
楼主 ID:284341 只看他
2018-3-2 11:26
Altium Designer画的带数码管延时模块原理图和PCB图如下:(51hei附件中可下载工程文件)
0.jpg 0.png 0.png

制作出来的实物图如下:
alim0104.jpg

单片机源程序如下:

代码:

  1. /********************************************************************
  2. 汇诚科技
  3. 实现功能:继电器通、断时间都可调控制程序(eeprom)
  4. 使用芯片:STC12C5204AD
  5. 晶振:11.0592MHZ
  6. 编译环境:Keil
  7. 硬件环境:四位数显两路输入三按键
  8. 作者:yang
  9. QQ:790244909
  10. 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!     
  11. /********************************************************************   
  12. /********************************************************************
  13. 功能说明:继电器循环通断控制程序
  14. 继电器通、断时间可调,
  15. key1功能键:调节模式与实时显示模式转换
  16. keynum=0:实时显示计时模式
  17. keynum=1:调整继电器设定闭合秒
  18. keynum=2:调整继电器设定闭合分
  19. keynum=3:调整继电器设定断开秒
  20. keynum=4:调整继电器设定断开分
  21. 以上四个设定值设定好后都存入eeprom,掉电可记忆
  22. 上电时,继电器吸合,数显开始计时,到达设定闭合时间后断开;数显清零,
  23.                     数显开始计时,到设定时间,继电器闭合,数显清零。。。
  24.                                         循环下去。。

  25. 设定断开时间最大是10分59秒
  26. 设定闭合时间最大是10分59秒
  27. ********************************************************************/
  28. #include<STC12C5A60S2.H>                 //库文件
  29. #include <intrins.h>
  30. #include"eprom.h"
  31. #define uchar unsigned char//宏定义无符号字符型
  32. #define uint unsigned int  //宏定义无符号整型

  33. #define DUAN P2          //P0口控制段
  34. #define WEI  P1          //P2口控制位
  35. sbit jdq= P3^7;
  36. sbit key1=P3^2;        //功能按键
  37. sbit key2=P3^3;        //增加
  38. sbit key3=P3^4;        //减小
  39. /********************************************************************
  40.                             初始定义
  41. *********************************************************************/
  42. code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟
  43. uchar wei[4]={0X01,0X02,0X04,0X08};                                 //位的控制端
  44. uchar numb[4];              //定义字符串
  45. uchar cnt,keynum;
  46. uchar setfen,setmiao;
  47. uchar setdf,setdm;
  48. uchar miao,fen;
  49. void IapEraseSector(uint addr);
  50. void IapProgramByte(uint addr,uchar dat);
  51. uchar IapReadByte(uint addr);
  52. bit flag=1;        //闭合断开标志位
  53. /********************************************************************
  54.                             延时函数
  55. *********************************************************************/
  56. void delay(uchar x)    //延时程序 0.1秒
  57. {
  58.         uchar m,n,s;
  59.         for(m=x;m>0;m--)
  60.         for(n=20;n>0;n--)
  61.         for(s=248;s>0;s--);
  62. }
  63. /********************************************************************
  64.                             显示函数
  65. *********************************************************************/        
  66. void display(uchar a ,uchar b)   //显示函数
  67. {
  68.       WEI&=0XF0;
  69.           DUAN=seg7code[a/10];
  70.           WEI=wei[0];
  71.           delay(2);

  72.           WEI&=0XF0;  
  73.       DUAN=seg7code[a%10]&0x7f;
  74.           WEI=wei[1];
  75.           delay(2);

  76.           WEI&=0XF0;  
  77.              DUAN=seg7code[b/10];
  78.           WEI=wei[2];
  79.           delay(2);

  80.           WEI&=0XF0;  
  81.       DUAN=seg7code[b%10];
  82.           WEI=wei[3];
  83.           delay(2);
  84.            
  85.           WEI&=0XF0;
  86. }
  87. /********************************************************************
  88.                             按键扫描
  89. *********************************************************************/
  90. void keyscan(void)
  91. {
  92. if(key1==0)
  93. {  delay(1);
  94.     if(key1==0)
  95.     {
  96.            while(!key1);
  97.            keynum++;
  98.            TR0=0;
  99.            jdq=0;
  100.            if(keynum>=5)
  101.            {
  102.              keynum=0;
  103.                  miao=fen=0;
  104.                  TR0=1;
  105.                  jdq=1;
  106.           }
  107.     }
  108.   }
  109.   switch(keynum)
  110.   {
  111.     case 1: if(key2==0)
  112.                 {
  113.                           delay(5);
  114.                           if(key2==0)
  115.                   {
  116.                                   while(!key2)display(setfen,setmiao);
  117.                                   setmiao++;
  118.                                   if(setmiao>59)
  119.                                      setmiao=59;
  120.                                   IapEraseSector(0);
  121.                                   IapProgramByte(0,setmiao);  //写入函数
  122.                           }
  123.                          }
  124.                         if(key3==0)
  125.                         {
  126.                           delay(5);
  127.                           if(key3==0)
  128.                   {
  129.                             while(!key3)display(setfen,setmiao);
  130.                             setmiao--;
  131.                                 if(setmiao==0||setmiao>=250)
  132.                                   setmiao=0;
  133.                             IapEraseSector(0);
  134.                             IapProgramByte(0,setmiao);  //写入函数
  135.                           }
  136.                         }
  137.                  display(setfen,setmiao);
  138.                         break;
  139.      case 2: if(key2==0)
  140.                  {
  141.                                   delay(5);
  142.                                   if(key2==0)
  143.                           {
  144.                                           while(!key2)display(setfen,setmiao);
  145.                                           setfen++;
  146.                                           if(setfen>99)
  147.                                          setfen=99;
  148.                                           IapEraseSector(512);
  149.                                           IapProgramByte(512,setfen);  //写入函数
  150.                           }
  151.                          }
  152.                          if(key3==0)
  153.                          {
  154.                                   delay(5);
  155.                                   if(key3==0)
  156.                           {
  157.                                     while(!key3)display(setfen,setmiao);
  158.                                     setfen--;
  159.                                     if(setfen==0||setfen>=250)
  160.                                        setfen=0;
  161.                                     IapEraseSector(512);
  162.                                     IapProgramByte(512,setfen);  //写入函数
  163.                                   }
  164.                         }
  165.                 //        display(setfen,setmiao);
  166.                         break;
  167.                 case 3:
  168.                     if(key2==0)
  169.                 {
  170.                           delay(5);
  171.                           if(key2==0)
  172.                   {
  173.                                   while(!key2)display(setdf,setdm);
  174.                                   setdm++;
  175.                                   if(setdm>59)
  176.                                      setdm=59;
  177.                                   IapEraseSector(0);
  178.                                   IapProgramByte(0,setmiao);  //写设定闭合时间秒
  179.                                   IapProgramByte(1,setdm);  //写设定断开时间秒
  180.                           }
  181.                          }
  182.                         if(key3==0)
  183.                         {
  184.                           delay(5);
  185.                           if(key3==0)
  186.                   {
  187.                             while(!key3)
  188.                                 display(setdf,setdm);
  189.                             setdm--;
  190.                                 if(setdm==0||setdm>=250)
  191.                                   setdm=0;
  192.                             IapEraseSector(0);
  193.                             IapProgramByte(0,setmiao);  //写设定闭合时间秒
  194.                                 IapProgramByte(1,setdm);  ////写设定断开时间秒
  195.                           }
  196.                         }
  197.                         break;
  198.                 case 4:if(key2==0)
  199.                  {
  200.                                   delay(5);
  201.                                   if(key2==0)
  202.                           {
  203.                                           while(!key2)
  204.                                           display(setdf,setdm);;
  205.                                           setdf++;
  206.                                           if(setdf>10)
  207.                                          setdf=10;
  208.                                           IapEraseSector(512);
  209.                                           IapProgramByte(512,setfen);  //写设定闭合时间分
  210.                                           IapProgramByte(513,setdf);  //写设定断开时间秒
  211.                           }
  212.                          }
  213.                          if(key3==0)
  214.                          {
  215.                                   delay(5);
  216.                                   if(key3==0)
  217.                           {
  218.                                     while(!key3)
  219.                                         display(setdf,setdm);
  220.                                     setdf--;
  221.                                     if(setdf==0||setdf>=250)
  222.                                        setdf=0;
  223.                                     IapEraseSector(512);
  224.                                     IapProgramByte(512,setfen);  //写设定闭合时间分
  225.                                         IapProgramByte(513,setdf);  //写设定断开时间分
  226.                                   }
  227.                         }
  228.                 //        
  229.                         break;
  230.          default : break;
  231.   }
  232. }
  233. /********************************************************************
  234.                            定时器T0初始化
  235. *********************************************************************/
  236. void cshh()
  237. {
  238.          TMOD|=0X01; //定义定时器工作方式
  239.          TH0=0Xa6;
  240.          TL0=0X01;
  241.          ET0=1;
  242.          TR0=1;      //开定时器
  243.          EA=1;       //开中断
  244. }
  245. /********************************************************************
  246.                             初始化函数
  247. *********************************************************************/
  248. void init_all(void)   
  249. {
  250.         P2M1=0;
  251.         P2M0=0xff;
  252.         P1M1=0;
  253.         P1M0=0x0f;
  254.         P3M1&=0x7f;
  255.         P3M0|=0x80;
  256.         P3=0xff;        
  257. }                  
  258. /********************************************************************
  259.                             主函数
  260. *********************************************************************/
  261. void main()
  262. {         
  263.         init_all();
  264.         setfen=IapReadByte(512);           //读设定闭合秒
  265.         setdf= IapReadByte(513);                   //读设定断开秒
  266.         setmiao=IapReadByte(0);                          //读设定闭合分
  267.         setdm=IapReadByte(1);                          //读设定断开秒
  268.         cshh();                          //定时器初始化
  269.         while(1)
  270.         {  
  271.            if(keynum==0)   //实时计时模式
  272.            {
  273.              display(fen,miao);
  274.            }
  275.            if(keynum>0&&keynum<3) //设定闭合分和秒模式
  276.              display(setfen,setmiao);
  277.            if(keynum>=3&&keynum<5) //设定断开分和秒模式
  278.              display(setdf,setdm);
  279.        keyscan();
  280.            }
  281. }
  282. /********************************************************************
  283.                            定时器中断函数
  284. *********************************************************************/
  285. void timer1(void)interrupt 1  
  286. {
  287.    TH0=0Xa6; //定时初值
  288.    TL0=0X01; //定时初值
  289.    cnt++;
  290.    if(cnt>=40)
  291.    {
  292.          cnt=0;
  293.          miao++;
  294.          if(miao>=60)
  295.          {
  296.            miao=0;
  297.            fen++;
  298.          }
  299.     }
  300.         if((fen>=setfen)&&(miao>=setmiao)&&flag)         
  301.     {
  302.             flag=0;
  303.         jdq=0;
  304.                 miao=0;
  305.                 fen=0;
  306.     }
  307.         if((fen>=setdf)&&(miao>=setdm)&&(flag==0))         
  308.     {
  309.         jdq=1;
  310.                 miao=0;
  311.                 fen=0;
  312.                 flag=1;
  313.     }
  314. }
【简介】
一、 尺寸:88.1cmX44.7cmX2cm
工作电压:直流12;
特点:
1、可编程(通过下载排针可下载程序),比较灵活
2、具有两路(IN0IN1)控制/检测信号输入端(也可作为两路AD采样输入)
3、有三个按键输入可以用来编程作为调节参数
4、一路DS18B20温度采集            
5、具有继电器吸合指示灯
6、可控制交流220V/10A一下设备。(最大控制设备2000W
7、可实现一路信号(低电平有效)输入控制继电器延时闭合,延时通断功能
8、具有继电器吸合指示灯
四、默认功能:
l 温度设定要有存储功能,断电重新启动时,设定的温度值有记忆。
l 设定报警温度值,设定温度范围是0125
l 温度设定用三个按键完成。分别为:key1功能键、key2调节键
l 按键要有防抖动功能。
l 按功能键key1时显示上次的温度设定值。同时设定温度的百位值闪烁,按上调键一次温度升高一度,同理,再次按下功能键时,十位进行调节。。
l 开机显示设定温度值,过5秒后显示实测温度。
l 当超过设定温度值时继电器吸合,低于设定温度时断开
l 串口发送温度值(注:需要改动板子,外加晶振)
五、可以根据顾客要求设计各种产品模块,延时、温度报警、电脑控制等等
六、DS18B20简介
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的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电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接
alim0051.jpg alim0050.jpg 0.png

全部资料51hei下载地址:
带数码管可编程可调节延时模块DXP资料.rar (289.32 KB)
(下载次数: 65, 2018-3-2 11:26 上传)

下载积分: 黑币 -5


原理图.doc (30.5 KB)
(下载次数: 47, 2018-3-2 11:26 上传)

下载积分: 黑币 -5


例程.rar (271.33 KB)
(下载次数: 62, 2018-3-2 11:26 上传)

下载积分: 黑币 -5


产品使用手册.docx (4.54 MB)
(下载次数: 49, 2018-3-2 11:26 上传)

下载积分: 黑币 -5




沙发 ID:4021 只看他
2018-9-28 08:24
这个教程和说明对不上吧   
板凳 ID:439389 只看他
2019-8-20 14:02
看看,谢谢

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版