找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12264|回复: 2
收起左侧

单片机模拟量输入数字量显示电路图 上位机与源程序(实现各种触发控制与报警功能)

[复制链接]
ID:280979 发表于 2018-2-8 00:38 | 显示全部楼层 |阅读模式
核心是一个51单片机,这个模拟量输入数字量显示可编程模块电路原理图及PCB图:
0.png 0.png

AD接收UART发送模块AD转换数值显示的vb上位机源码(51hei附件中可下载)
0.png

单片机下位机的配套源程序:
0.png

【简要说明】
一、板子尺寸:长72mmX54mmX18mm
二、主要器件:单片机、数码管、继电器
三、工作电压:DC5V~40V
四、板子功耗:小于200mA
五、特点:
         1、具有继电器输出信号指示功能。
         2供电即可工作无需外部触发。
         3具有电源指示灯,四位数码管显示功能。
         4如果您会单片机,可以根据自己需要,任意编程,我们可提供参考程序和相关资料。
         5、两个按键任意调节设置参数。
         6、0~5V模拟量输入
         7、可以和72MM卡槽板配合安装在DIN导轨上
         8、继电器触点干接点输出,可以控制交流或者直流250V以内任何负载。     
     
9、端子采用螺旋压接端子           

         10、工作温度-40度至 +70度
         11、工作湿度 10%  ~ 80%RH
         12、四周有4个固定安装孔
         13、具有电磁抗干扰能力
         14、板子稳定工作可靠

此控制电路的应用举例与接线图分享:
应用举例.JPG 应用举2例.JPG 接线图.JPG 复件 标示图1.JPG 标示图1.JPG 标示图.JPG
数码管程序延时程序 - 厕所冲水延时25秒可调
1.继电器使用5V   
2.输入引脚使用下载口排针的VCC GND 和AIN 三个引脚
3.R11电阻不焊接   
4.数码管使用四位一体共阴数码管

单片机源程序如下:
  1. /********************************************************************
  2.                             汇诚科技
  3. 实现功能:测试程序
  4. 使用芯片:STC12C2052AD
  5. 晶振:11.0592MHZ
  6. 波特率:9600
  7. 编译环境:Keil
  8. 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!     
  9. /********************************************************************
  10. ********************************************************************/
  11. /********************************************************************
  12. 程序说明:
  13. 1、P1.7口输入模拟量数据。
  14. 2、将数据与设定程序做比较控制继电器吸合。
  15. 注意:通道口必须有模拟量输入数据才有效。
  16. ********************************************************************/
  17. //#include<reg52.h>
  18. #include<STC12C2052AD.h>                 //库文件
  19. #include<intrins.h>
  20. #define uchar unsigned char //宏定义字符型变量
  21. #define uint  unsigned int        //宏定义整型变量

  22. /*声明 SFR 相关 与 的 IAP*/
  23. sfr IAP_DATA = 0xE2;
  24. sfr IAP_ADDRH = 0xE3;
  25. sfr IAP_ADDRL = 0xE4;
  26. sfr IAP_CMD = 0xE5;
  27. sfr IAP_TRIG = 0xE6;
  28. sfr IAP_CONTR = 0xE7;


  29. /********************************************************************
  30.                              IO口定义
  31. ********************************************************************/

  32. bit  write=0;
  33. uchar playdate;
  34. unsigned char T0RH=0,T0RL=0;
  35. unsigned char ms=0;

  36. sbit P10=P1^0;//数码管段
  37. sbit P11=P1^1;//数码管段
  38. sbit P12=P1^2;//数码管段
  39. sbit P13=P1^3;//数码管段
  40. sbit P14=P1^4;//数码管段
  41. sbit P15=P1^5;//数码管段
  42. sbit P16=P1^6;//数码管段
  43. sbit P17=P1^7;//AD信号输入

  44. sbit P30=P3^0;//按键输入
  45. sbit P31=P3^1;//按键输入
  46. sbit P32=P3^2;//数码管位
  47. sbit P33=P3^3;//数码管位
  48. sbit P34=P3^4;//数码管位
  49. sbit P35=P3^5;//数码管位
  50. sbit P37=P3^7; //继电器输出
  51. /********************************************************************
  52.                             定义 ISP/IAP/EEPROM 命令
  53. *********************************************************************/
  54. #define CMD_IDLE 0
  55. #define CMD_READ 1
  56. #define CMD_PROGRAM 2
  57. #define CMD_ERASE 3

  58. #define ENABLE_IAP 0x83//SYSCLK<12MH
  59. #define IAP_ADDRESS 0x0000        //存储地址


  60. /********************************************************************
  61. 禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
  62. *********************************************************************/
  63. void IapIdle()
  64. {
  65.     IAP_CONTR = 0;           //
  66.         IAP_CMD = 0;           //
  67.         IAP_TRIG = 0;           //
  68.         IAP_ADDRH = 0x80;  //
  69.         IAP_ADDRL = 0;           //
  70. }

  71. /********************************************************************
  72.                              读数据
  73. *********************************************************************/

  74. uchar IapReadByte(uint addr)
  75. {
  76.    uchar dat;
  77.    IAP_CONTR = ENABLE_IAP;
  78.    IAP_CMD = CMD_READ;
  79.    IAP_ADDRL = addr;
  80.    IAP_ADDRH = addr >> 8;
  81.    IAP_TRIG = 0x46;
  82.    IAP_TRIG = 0xb9;
  83.    _nop_();
  84.    dat = IAP_DATA;
  85.    IapIdle();
  86.    return dat;
  87. }
  88. /********************************************************************
  89.                                写数据
  90. *********************************************************************/

  91. void IapProgramByte(uint addr, uchar dat)
  92. {
  93.    IAP_CONTR = ENABLE_IAP;
  94.    IAP_CMD = CMD_PROGRAM;
  95.    IAP_ADDRL = addr;
  96.    IAP_ADDRH = addr >> 8;
  97.    IAP_DATA = dat;
  98.    IAP_TRIG = 0x46;
  99.    IAP_TRIG = 0xb9;
  100.    _nop_();
  101.    IapIdle();
  102. }
  103. /********************************************************************
  104.                                擦除数据
  105. *********************************************************************/

  106. void IapEraseSector(uint addr)
  107. {
  108.    IAP_CONTR = ENABLE_IAP;
  109.    IAP_CMD = CMD_ERASE;
  110.    IAP_ADDRL = addr;
  111.    IAP_ADDRH = addr >> 8;
  112.    IAP_TRIG = 0x46;
  113.    IAP_TRIG = 0xb9;
  114.    _nop_();
  115.    IapIdle();
  116. }

  117. /********************************************************************
  118.                             初始定义
  119. *********************************************************************/
  120. code uchar seg7code[10]={ 0x84,0xf6,0x8a,0xa2,0xf0,0xa1,0x81,0xb6,0x80,0xa0}; //显示段码 数码管字跟

  121. /********************************************************************
  122.                             延时函数
  123. *********************************************************************/
  124. void delay1(uchar t)
  125. {
  126.   uchar i,j;
  127.    for(i=0;i<t;i++)
  128.    {
  129.             for(j=13;j>0;j--);
  130.          { ;
  131.          }
  132.    }
  133. }
  134. /********************************************************************
  135.                             显示函数
  136. *********************************************************************/        
  137. void Led(uchar date) //显示函数
  138. {
  139. uint z,x,c,v;
  140.   z=date/1000;                         //求千位
  141.   x=date%1000/100;                 //求百位
  142.   c=date%100/10;                 //求十位
  143.   v=date%10;                         //求个位

  144.           P3M0=0X00;
  145.       P3M1=0XFF;
  146.       P32=0;P33=0;P34=0;P35=0;
  147.           P1=seg7code[x];
  148.           P32=1;P33=0;P34=0;P35=0;
  149.           delay1(80);
  150.           P32=0;P33=0;P34=0;P35=0;  
  151.       P1=seg7code[c];
  152.           P32=0;P33=1;P34=0;P35=0;
  153.           delay1(80);
  154.           P32=0;P33=0;P34=0;P35=0;  
  155.              P1=seg7code[v];
  156.           P32=0;P33=0;P34=0;P35=1;
  157.           delay1(80);
  158.           P32=0;P33=0;P34=0;P35=0;  
  159.       //P1=seg7code[v];
  160.           //P32=0;P33=0;P34=1;P35=0;
  161.           //delay1(80);
  162.           //P32=0;P33=0;P34=0;P35=0;
  163. }
  164.                   
  165. void key()
  166. {
  167.    if(P30==0)
  168.    {
  169.        delay1(80);
  170.            if(P30==0)
  171.            {
  172.                playdate++;
  173.                    if(playdate>50)
  174.                       playdate=50;
  175.                    while(!P30);
  176.                         IapEraseSector(1);  //擦除扇区
  177.                         IapProgramByte(1,playdate);//写入数?
  178.            }
  179.    }
  180.    if(P31==0)
  181.    {
  182.        delay1(80);
  183.            if(P31==0)
  184.            {
  185.                playdate--;
  186.                    if(playdate<1)
  187.                       playdate=1;
  188.                                 while(!P31);
  189.                                 IapEraseSector(1);  //擦除扇区
  190.                                 IapProgramByte(1,playdate);//写入?
  191.            }
  192.    }                  

  193. }
  194. //定时器0初始化
  195. void t0_init(unsigned char ms0)           //ms0最大71
  196. {
  197.         /***********************************************
  198.         一个机器周期=12*时钟周期。
  199.         11059200为时钟周期,一共为11059200/12=921600,就是每秒为921600Hz,
  200.     八位定时器 最大计时     0.2777778ms
  201.         十六位定时器最大计时          71.111111ms
  202.         11.0592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。
  203.   65536-9216=56320(dc00)
  204.   TH0=0xdc,TL0=0x00
  205.         ***********************************************/
  206.          long tmp;  //临时变量
  207.      tmp = 11059200 / 12;
  208.          tmp = (tmp * ms0) / 1000;
  209.          tmp = 65536 - tmp;
  210.          tmp = tmp + 3;
  211.          T0RH = (unsigned char)(tmp>>8);
  212.          T0RL = (unsigned char)tmp;                                          
  213.      TMOD &=0XF0;
  214.          TMOD |=0X01;  //方式一  一共四种方式   GATE0 C/T0  M0_1  M0_0         C/T0选择时钟计数还是外部计数  方式0是十三位定时器 ,方式1是十六位定时器,方式2是八位自动 方式4是两个八位
  215.          TH0=T0RH;
  216.          TL0=T0RL;
  217.          ET0=1;   //使能T0中断
  218.          EA=1;
  219. //         TR0=1;
  220. }
  221. /********************************************************************
  222.                                主函数
  223. *********************************************************************/
  224. void main()
  225. {   unsigned char flag=1,flag2=0;;
  226.         playdate = IapReadByte(0x01);                //读取0x01中的数据  并附给ca
  227.         t0_init(10);
  228.         while(1)
  229.         {
  230.                 if((P17==1)&&(flag==0))           //如果松开手了       1
  231.                         {
  232.                             delay1(200);
  233.                                 if((P17==1)&&(flag==0))
  234.                             {   
  235.                                         TR0=1;
  236.                                         P37=0;
  237.                                         flag=1;
  238.                                         flag2=0;
  239.                            }
  240.                         }
  241.                     if((P17==0)&&(flag2==0))                                   //   2
  242.                         {
  243.                             delay1(200);
  244.                                 if((P17==0)&&flag2==0)
  245.                                 {
  246.                                     flag=0;
  247.                                         flag2=1;
  248.                                 }
  249.                         }

  250.                         key();
  251.                         Led(playdate);//调用显示函数显示数据display_date        
  252.         }                 
  253. }
  254. void t0(void) interrupt 1 using 0 //定时中断服务函数
  255. {
  256.           TH0=T0RH;
  257.         TL0=T0RL;
  258.         ms++;
  259.         if(ms==100)  //ms=100是1秒
  260.         {
  261.             ms=0;
  262.                 if(playdate>0)
  263.                 {
  264.                    playdate--;
  265.                    if(playdate==0)
  266.                    {   P37=1;
  267.                        TR0=0;
  268.                            playdate = IapReadByte(0x01);                //读取0x01中的数据  并附给ca
  269.                    }
  270.                 }
  271.             else
  272.                 {   P37=1;
  273.                     TR0=0;
  274.                     playdate = IapReadByte(0x01);                //读取0x01中的数据  并附给ca
  275. ……………………

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

还附带如下完整源码:
59板配合3461as数码管进行触发加操作
59板配合3461as数码管进行 温度 控制
DS18B20温度报警模块
EEPROM测试程序(成功)
厕所冲水系统延时程序
客户订做
延时程序59分99秒
延时程序60分00秒
数码管程序延时程序
模拟量转换显示程序
测试程序(成功)
测试程序(成功)0~5000可调
测试程序(成功)20150317完整
数码管程序延时程序.rar
DSC_0175.JPG DSC_0174.JPG

0.png

全部资料51hei下载地址:
模拟量输入数字量显示.rar (3.32 MB, 下载次数: 93)
回复

使用道具 举报

ID:397804 发表于 2018-9-14 10:32 | 显示全部楼层
谢谢,十分又用
回复

使用道具 举报

ID:411225 发表于 2018-10-17 17:00 | 显示全部楼层
谢谢,十分又用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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