找回密码
 立即注册

QQ登录

只需一步,快速开始

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

红外遥控开关 220V供电+485通信+DS18B20+继电器控制电路+蜂鸣器电路PCB+单片机程序

[复制链接]
跳转到指定楼层
楼主
   本来想着做一块红外遥控的开关,来控制家里面的灯,在做的过程中,不断增加了一些功能,最后做成了一块开发板

原理图:
原理图PDF Schematic_HS038.pdf (102.18 KB, 下载次数: 51)
板子的PCB图:


PCB源文件: HS038.zip (20.71 KB, 下载次数: 49)



代码: 源程序.zip (788.14 KB, 下载次数: 54)   源程序用于测试开发板各个部分的功能。(3P端子用于接温度传感器或者红外接收头)

单片机源程序如下:
  1. #include<reg52.h>            //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. #include "ds18b20.h"
  3. #define DataPort P0         //定义数据端口 程序中遇到DataPort 则用P0 替换
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6.         
  7. uint wendu;

  8. uchar cmd[12]={'\0'};
  9. uchar str[]={'0','0','\0'};
  10. uchar str1[]="℃  \n";

  11. uchar cmd_count = 1;//字符数量计数器
  12. uchar max_length = 10;//最大接收字符长度
  13. uchar cmd_length = 0;//记录字符串长度
  14.         
  15. P3M1 = 0x00;//0000 0000
  16. P3M0 = 0X04;//0000 0100

  17. sbit IR=P3^2;                          //红外接口标志
  18. sbit LED1 = P1^0;//指示
  19. sbit LED2 = P1^1;//运行
  20. //sbit JDQ = P2^3;//继电器
  21. sbit FMQ = P2^2;//蜂鸣器
  22. bit  write=0;//写24C02的标志;
  23. sbit sda=P2^0;//数据线                        
  24. sbit scl=P2^1;//时钟线
  25. sbit RST=P2^5;   //时钟  不需要,可以关掉
  26. sbit CS_DA =P2^4 ;  //HJ-3G DAC HL-1不需要,可以关掉
  27. sbit JD=P0^6;


  28. unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
  29. unsigned char  irtime;        //红外用全局变量

  30. bit irpro_ok,irok;
  31. unsigned char IRcord[4];
  32. unsigned char irdata[33];

  33. unsigned char Ir_work();
  34. void Ircordpro(void);

  35. void delay1ms(unsigned int z)
  36. {
  37.         unsigned int x,y;
  38.         for(x=z;x>0;x--)
  39.                 for(y=510;y>0;y--);
  40. }
  41. void tim0_isr (void) interrupt 1
  42. {
  43.   irtime++;  //用于计数2个下降沿之间的时间
  44. }

  45. void EX0_ISR (void) interrupt 0 //外部中断0服务函数
  46. {
  47.         static unsigned char  i;             //接收红外信号处理
  48.         static bit startflag;                //是否开始处理标志位

  49.         if(startflag)                        
  50.         {
  51.                 if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
  52.             i=0;
  53.                     irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
  54.                     irtime=0;
  55.                     i++;
  56.                            if(i==33)
  57.                       {
  58.                                   irok=1;
  59.                                 i=0;
  60.                           }
  61.         }
  62.         else
  63.         {
  64.                 irtime=0;
  65.                 startflag=1;
  66.         }
  67. }

  68. void TIM0init(void)//定时器0初始化
  69. {
  70.         TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  71.         TH0=0x00; //重载值
  72.         TL0=0x00; //初始化值
  73.         ET0=1;    //开中断
  74.         TR0=1;   
  75. }
  76. void uart_init()
  77. {
  78. 以下是使用独立波特率发生器
  79.         SCON=0x50; //[bit6:5]SM1 SM2 = 1 0;[bit4]REN=1
  80.         AUXR=0x11; //[bit4]BRTR=1,允许独立波特率发生器运行;[bit0]SIBRS=1,独立波特率作为串口1的波特率发生器,此时定时器1释放
  81.         BRT=0XF4;   //独特波特率发生器定时器(产生波特率9600)
  82.         EA=1;
  83.         //ES=1;
  84.         TMOD = 0x20;//定时器1 工作模式2
  85.         TH1 = TL1 = 0XFD;//9600
  86.         
  87.         SCON = 0X40;
  88.         //SM0 = 0;SM1 = 1;//方式1 8位波特率可变
  89.         REN = 1;
  90.         
  91.         EA = 1;
  92.         ES = 1;//关闭串口中断,防止程序进入中断,无法正常工作。
  93.         TR1 = 1;
  94. }
  95. void EX0init(void)
  96. {
  97.         IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
  98.         EX0 = 1;   //使能外部中断
  99.         EA = 1;    //开总中断
  100. }
  101. unsigned char Ir_work()//红外键值散转程序
  102. {
  103.         unsigned char temp = 0;
  104.        switch(IRcord[2])//判断第三个数码值
  105.                  {
  106.                          case 0x0c:temp = 1;break;//1 显示相应的按键值
  107.                          case 0x18:temp = 2;break;//2
  108.                          case 0x5e:temp = 3;break;//3
  109.                          case 0x08:temp = 4;break;//4
  110.                          case 0x1c:temp = 5;break;//5
  111.                          case 0x5a:temp = 6;break;//6
  112.                          case 0x42:temp = 7;break;//7
  113.                          case 0x52:temp = 8;break;//8
  114.                          case 0x4a:temp = 9;break;//9
  115.              default:break;
  116.                          }

  117.                   irpro_ok=0;//处理完成标志
  118.                 return temp;
  119. }
  120. void Ircordpro(void)//红外码值处理函数
  121. {
  122.         unsigned char i,j,k,cord,value;
  123.         k=1;
  124.         for(i=0;i<4;i++)      //处理4个字节
  125.         {
  126.                 for(j=1;j<=8;j++) //处理1个字节8位
  127.                 {
  128.                         cord=irdata[k];
  129.                         if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
  130.                         value=value|0x80;
  131.                         if(j<8)
  132.                         {
  133.                                 value>>=1;
  134.                         }
  135.                         k++;
  136.                 }
  137.                 IRcord[i]=value;
  138.                 value=0;     
  139.         }
  140.         irpro_ok=1;//处理完毕标志位置1
  141. }
  142. //void bee()
  143. //{
  144. //        FMQ = 1;
  145. //        delay1ms(100);
  146. ////        FMQ = 1;
  147. ////        delay1ms(1000);
  148. //}

  149. void delay()
  150. { ;; }
  151. void start()  //开始信号
  152. {        
  153.         sda=1;
  154.         delay();
  155.         scl=1;
  156.         delay();
  157.         sda=0;
  158.         delay();
  159. }
  160. void stop()   //停止
  161. {
  162.         sda=0;
  163.         delay();
  164.         scl=1;
  165.         delay();
  166.         sda=1;
  167.         delay();
  168. }
  169. void respons()  //应答
  170. {
  171.         uchar i;
  172.         scl=1;
  173.         delay();
  174.         while((sda==1)&&(i<250))i++;
  175.         scl=0;
  176.         delay();
  177. }
  178. void init()
  179. {
  180.    RST=0; //总线时钟低电评
  181.    CS_DA =0 ;
  182.         sda=1;
  183.         delay();
  184.         scl=1;
  185.         delay();
  186. }
  187. void write_byte(uchar date)
  188. {
  189.         uchar i,temp;
  190.         temp=date;
  191.         for(i=0;i<8;i++)
  192.         {
  193.                 temp=temp<<1;
  194.                 scl=0;
  195.             delay();
  196.                 sda=CY;
  197.                 delay();
  198.                 scl=1;
  199.                 delay();
  200.         }
  201.         scl=0;
  202.         delay();
  203.         sda=1;
  204.         delay();
  205. }
  206. uchar read_byte()
  207. {
  208.         uchar i,k;
  209.         scl=0;
  210.         delay();
  211.         sda=1;
  212.         delay();
  213.         for(i=0;i<8;i++)
  214.         {
  215.                 scl=1;
  216.                 delay();        
  217.                 k=(k<<1)|sda;
  218.                 scl=0;
  219.                 delay();        
  220.         }
  221.         return k;
  222. }
  223. void write_add(uchar address,uchar date)
  224. {
  225.         start();
  226.         write_byte(0xa0);
  227.         respons();
  228.         write_byte(address);
  229.         respons();
  230.         write_byte(date);
  231.         respons();
  232.         stop();
  233. }
  234. uchar read_add(uchar address)
  235. {
  236.         uchar date;
  237.         start();
  238.         write_byte(0xa0);
  239.         respons();
  240.         write_byte(address);
  241.         respons();
  242.         start();
  243.         write_byte(0xa1);
  244.         respons();
  245.         date=read_byte();
  246.         stop();
  247.         return date;
  248. }

  249. void Buzzer(uint Number,uchar Time)          //可以选择鸣响次数和音频
  250. {
  251.         uchar h,j;
  252.         uint i ;
  253.         for (h = 0; h < Number; h ++)
  254.         {
  255.                 for (i = 0; i < Time; i ++)
  256.                 {
  257.                         FMQ = ~FMQ;              //BUZZER取反
  258.                         for (j = 0 ; j < 100 ; j ++);   //需要产生方波,调节音频
  259.                 }
  260.                 delay1ms(10);                         //间隔时间
  261.         }
  262.         FMQ = 0;                      //注意PNP=0;NPN=1关闭蜂鸣器,否则三极管电流会很大。
  263. }

  264. void send_char(unsigned char *str)
  265. {
  266.         while(*str != '\0')
  267.         {
  268.                 SBUF = *str;
  269.                 while(TI == 0);
  270.                 TI = 0;
  271.                 str++;
  272.         }
  273. }

  274. uchar wendu_filter(uchar count)
  275. {
  276.         uchar i=0;
  277.         uint  sum = 0;
  278.         for(i=0;i<count;i++)
  279.         {
  280.                 sum += ((uchar)(rd_temperature()));
  281.         }
  282.         return (uint)(sum/count);
  283. }

  284. void main(void)
  285. {
  286.         uchar temp,high,med,low,min;
  287. //        uint wendu;
  288. //        uchar str[]={'0','0','\0'};
  289. //        uchar str1[]="℃  ";
  290.         uchar str2[]="send 1 and receive temperature\n";
  291.         uchar str5[12]={'\0'};
  292.         uchar i,rev_flag=0;
  293.         
  294.         init();

  295.         EX0init(); //初始化外部中断
  296.         TIM0init();//初始化定时器
  297.         uart_init(); //定时器1 工作模式2
  298.         while(!init_ds18b20())//初始化失败
  299.                 LED1 = 0;
  300.         TMOD = 0X22;//LED1 = 1;JDQ = 0;
  301.         
  302.         write_add(2,2);
  303.         delay1ms(50);
  304.         FMQ = 0;
  305.         delay1ms(100);
  306. //        FMQ = 0;
  307.         while(1)//主循环
  308.         {
  309.                 if(irok)                        //如果接收好了进行红外处理
  310.                 {   
  311.                         Ircordpro();
  312.                         irok=0;
  313.                 }
  314.                 if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
  315.                 {
  316.                         temp = Ir_work();
  317.                         if(temp == 1)
  318.                         {
  319.                                 JDQ = 1;
  320.                                 Buzzer(20,10);
  321.                         }
  322.                         if(temp == 2)
  323. ……………………

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


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:414771 发表于 2019-8-3 19:21 | 只看该作者
第一次发帖子,希望和大家交流学习
回复

使用道具 举报

板凳
ID:472165 发表于 2019-8-15 12:49 | 只看该作者
前排支持~~~~~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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