找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5828|回复: 1
打印 上一主题 下一主题
收起左侧

单片机无线遥控继电器电路原理图PCB与源程序 带数码管显示

[复制链接]
跳转到指定楼层
楼主
Altium Designer画的STC12C2052AD单片机主控的无线单路可编程遥控带数码管延时模块电路原理图和PCB图如下:(51hei附件中可下载工程文件)


【简要说明】
通过遥控控制继电器定时吸合或者定时断开。(总之遥控与编程结合控制的开发板)

资料正在更新中.
一、板子尺寸:长54mmX宽72mmX18mm
二、主要器件:单片机、数码管、继电器
三、工作电压:宽电压供电(直流6V至24V均可以)
四、板子功耗:小于300mA


单片机源程序如下:
  1. /********************************************************************
  2.                             汇诚科技
  3. 实现功能:测试程序
  4. 使用芯片:STC12C2052AD
  5. 晶振:11.0592MHZ
  6. 波特率:9600
  7. 编译环境:Keil
  8. 作者:zhangxinchunleo
  9. 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!     
  10. /********************************************************************
  11. ********************************************************************/
  12. /********************************************************************
  13. 程序说明:
  14. 1、P1.7口输入模拟量数据。
  15. 2、将数据与设定程序做比较控制继电器吸合。

  16. 注意:通道口必须有模拟量输入数据才有效。

  17. ********************************************************************/

  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. #define ADC_POWER   0x80            //ADC 电源控制位
  30. #define ADC_FLAG    0x10            //ADC 转换结束标志位
  31. #define ADC_START   0x08            //ADC 开始转换控制位
  32. #define ADC_SPEEDLL 0x00            //210 个时钟周期转换一次
  33. #define ADC_SPEEDL  0x20            //420 个时钟周期转换一次
  34. #define ADC_SPEEDH  0x40            //630 个时钟周期转换一次
  35. #define ADC_SPEEDHH 0x60            //840 个时钟周期转换一次

  36. /********************************************************************
  37.                              IO口定义
  38. ********************************************************************/

  39. bit  write=0;
  40. uchar playdate;
  41. uint XS;
  42. sbit P10=P1^0;//数码管段
  43. sbit P11=P1^1;//数码管段
  44. sbit P12=P1^2;//数码管段
  45. sbit P13=P1^3;//数码管段
  46. sbit P14=P1^4;//数码管段
  47. sbit P15=P1^5;//数码管段
  48. sbit P16=P1^6;//数码管段
  49. sbit P17=P1^7;//AD信号输入

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

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


  66. /********************************************************************
  67. 禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
  68. *********************************************************************/
  69. void IapIdle()
  70. {
  71.     IAP_CONTR = 0;           //
  72.         IAP_CMD = 0;           //
  73.         IAP_TRIG = 0;           //
  74.         IAP_ADDRH = 0x80;  //
  75.         IAP_ADDRL = 0;           //
  76. }

  77. /********************************************************************
  78.                              读数据
  79. *********************************************************************/

  80. uchar IapReadByte(uint addr)
  81. {
  82.    uchar dat;
  83.    IAP_CONTR = ENABLE_IAP;
  84.    IAP_CMD = CMD_READ;
  85.    IAP_ADDRL = addr;
  86.    IAP_ADDRH = addr >> 8;
  87.    IAP_TRIG = 0x46;
  88.    IAP_TRIG = 0xb9;
  89.    _nop_();
  90.    dat = IAP_DATA;
  91.    IapIdle();
  92.    return dat;
  93. }
  94. /********************************************************************
  95.                                写数据
  96. *********************************************************************/

  97. void IapProgramByte(uint addr, uchar dat)
  98. {
  99.    IAP_CONTR = ENABLE_IAP;
  100.    IAP_CMD = CMD_PROGRAM;
  101.    IAP_ADDRL = addr;
  102.    IAP_ADDRH = addr >> 8;
  103.    IAP_DATA = dat;
  104.    IAP_TRIG = 0x46;
  105.    IAP_TRIG = 0xb9;
  106.    _nop_();
  107.    IapIdle();
  108. }
  109. /********************************************************************
  110.                                擦除数据
  111. *********************************************************************/

  112. void IapEraseSector(uint addr)
  113. {
  114.    IAP_CONTR = ENABLE_IAP;
  115.    IAP_CMD = CMD_ERASE;
  116.    IAP_ADDRL = addr;
  117.    IAP_ADDRH = addr >> 8;
  118.    IAP_TRIG = 0x46;
  119.    IAP_TRIG = 0xb9;
  120.    _nop_();
  121.    IapIdle();
  122. }

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

  127. /********************************************************************
  128.                             延时函数
  129. *********************************************************************/
  130. void delay1(uchar t)
  131. {
  132.   uchar i,j;
  133.    for(i=0;i<t;i++)
  134.    {
  135.             for(j=13;j>0;j--);
  136.          { ;
  137.          }
  138.    }
  139. }
  140. /********************************************************************
  141.                             延时函数
  142. *********************************************************************/
  143. void delay()//延时程序 0.1秒
  144. {
  145. uchar m,n,s;
  146. for(m=10;m>0;m--)
  147. for(n=20;n>0;n--)
  148. for(s=248;s>0;s--);
  149. }
  150. /********************************************************************
  151.                             显示函数
  152. *********************************************************************/        
  153. void Led(uint date) //显示函数
  154. {
  155. /*****************数据转换*****************************/
  156. uint z,x,c,v;
  157.   z=date/1000;                         //求千位
  158.   x=date%1000/100;                 //求百位
  159.   c=date%100/10;                 //求十位
  160.   v=date%10;                         //求个位

  161.       P32=0;P33=0;P34=0;P35=0;
  162.           P1=seg7code[x];
  163.           P32=1;P33=0;P34=0;P35=0;
  164.           delay1(80);
  165.           P32=0;P33=0;P34=0;P35=0;  
  166.       P1=seg7code[c];
  167.           P32=0;P33=1;P34=0;P35=0;
  168.           delay1(80);
  169.           P32=0;P33=0;P34=0;P35=0;  
  170.              P1=seg7code[v];
  171.           P32=0;P33=0;P34=0;P35=1;
  172.           delay1(80);
  173.           P32=0;P33=0;P34=0;P35=0;  
  174.       //P1=seg7code[v];
  175.           //P32=0;P33=0;P34=1;P35=0;
  176.           //delay1(80);
  177.           //P32=0;P33=0;P34=0;P35=0;
  178. }

  179. /********************************************************************
  180.                功能:串口初始化,波特率9600,方式1
  181. *********************************************************************/
  182. /*
  183. void Init_Com(void)
  184. {
  185. TMOD = 0x20;
  186. PCON = 0x00;
  187. SCON = 0x50;
  188. TH1 = 0xFd;
  189. TL1 = 0xFd;
  190. TR1 = 1;
  191. }
  192.                   
  193. /********************************************************************
  194.                          AD转换初始化程序
  195. *********************************************************************/

  196. void InitADC()
  197. {
  198.     P1 = P1M0 = P1M1 = 0xff;        //设置P1口为开漏模式,使用AD功能
  199.     ADC_DATA = 0;                   //AD数据寄存器清空
  200.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打开AD电源,转换周期210
  201.     delay();                       //延时
  202. }

  203. /********************************************************************
  204.                          AD转换控制程序
  205. *********************************************************************/


  206. uchar GetADCResult(uchar px)          //转换输出的数据 (PX为通道口)
  207. {
  208.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//开始转换
  209.     _nop_();                        //延时一个机器周期
  210.     _nop_();                                                //延时一个机器周期
  211.     _nop_();                                                //延时一个机器周期
  212.     _nop_();                                                //延时一个机器周期
  213.     while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
  214.     ADC_CONTR &= ~ADC_FLAG;         //关闭AD转换
  215.     return ADC_DATA;                //返回数据
  216. }
  217. /********************************************************************
  218.                          串口数据发送
  219. *********************************************************************/
  220. /*void SendData(uchar dat)
  221. {
  222.         SBUF = dat;                                                //发送数据
  223.     while (!TI);                    //等待数据
  224.     TI = 0;                         //清零标志位
  225. }
  226. /********************************************************************
  227.                             编辑数据函数
  228. *********************************************************************/
  229. /*void show(uchar ch)
  230. {
  231.     SendData(ch);                   //发送显示通道
  232.     SendData(GetADCResult(ch));     //发送对应通道的数据
  233. }
  234. /********************************************************************
  235.                                按键函数
  236. *********************************************************************/
  237. void key()
  238. {
  239. if((P30==0)&&(P31==0))
  240. {
  241. while(1)
  242. {
  243. Led(playdate);
  244. if((P30==0)&&(playdate<255)){delay1(80);playdate++;delay1(80);write=1;while(!P30);delay1(80);delay1(80);}
  245. if((P31==0)&&(playdate>0)){delay1(80);playdate--;delay1(80);write=1;while(!P31);delay1(80);delay1(80);}
  246. if(playdate<=0){playdate=0;delay1(80);}
  247. if(playdate>=255){playdate=255;delay1(80);}
  248. if(write==1)
  249.   {
  250.    write=0;
  251.    IapEraseSector(1);  //擦除扇区
  252.    IapProgramByte(1,playdate);//写入数据
  253.   }        

  254. }
  255. }
  256. }
  257. /********************************************************************
  258.                                主函数
  259. *********************************************************************/
  260. void main()
  261. ……………………

  262. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
GYJ-0069_无线单路可编程遥控带数码管延时模块DXP.rar (478.74 KB, 下载次数: 56)
GYJ-0069_无线单路可编程遥控带数码管延时模块原理图及PCB图.pdf (379.47 KB, 下载次数: 45)
GYJ-0069_模拟量输入数字量显示可编程模块产品使用手册.doc (2.22 MB, 下载次数: 38)
测试程序(成功).rar (39.09 KB, 下载次数: 44)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:334781 发表于 2021-12-7 17:17 | 只看该作者
看了电路图,想问一下,那个RV1压敏电阻是不是应该并接到继电器的常开点呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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