久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3052|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品视频在线观看 | 国产美女自拍视频 | 久草网址 | 91网站在线看 | 国产精品永久久久久久久www | 国产99久久精品 | 一级黄色毛片子 | 欧美日韩国产一区二区三区 | 伊人电影院av | 九热在线 | 欧美a在线 | 做a视频 | 欧美久久一区 | 啪啪免费网 | 日韩国产欧美 | 国产电影一区二区在线观看 | 二区亚洲 | 成人老司机| 日韩在线观看视频一区 | 免费一看一级毛片 | 亚洲一区二区三区在线 | 国产91久久久久久 | 国产在线一区二区三区 | 免费一级大片 | 欧美激情久久久 | 四虎永久免费影院 | 国产乱码久久久久久一区二区 | 久久久久久久久久久丰满 | 岛国精品 | 国产午夜久久久 | 国产精品日韩欧美一区二区三区 | 精品国产欧美一区二区三区成人 | 亚洲一区亚洲二区 | 午夜免费观看网站 | 久久99久久 | 久久久久亚洲 | 三级黄片毛片 | 久久久网| 红桃成人在线 | 久久久久久毛片免费观看 | 成人免费观看男女羞羞视频 |