找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7839|回復(fù): 16
收起左側(cè)

基于stc15w單片機(jī)的紅外解碼控制程序

  [復(fù)制鏈接]
ID:499469 發(fā)表于 2019-12-17 20:28 | 顯示全部樓層 |閱讀模式
基于stc15w的紅外控制程序(實(shí)測(cè)stc15w408as、15w204s、15w4k56s4均可用,使用外中斷P3.3接收信號(hào)),可以和萬(wàn)能紅外遙控器和智能音箱結(jié)合實(shí)現(xiàn)遠(yuǎn)程控制和語(yǔ)音控制,前提需要知道紅外碼 紅外解碼16位解碼.zip (57.26 KB, 下載次數(shù): 113) 紅外接收(P3.3中斷).zip (46.72 KB, 下載次數(shù): 105)

單片機(jī)源程序如下:
  1. /*********************************************************************************************
  2. 程序名:    DHT11-1602
  3. 編寫(xiě)人:    fby
  4. 硬件支持:  STC89C52RC  DHT11  LCD1602
  5. 接口說(shuō)明:  DHT11:VCC DATA NC GND
  6. *********************************************************************************************
  7. 說(shuō)明:1、單片機(jī)是STC89C52RC,晶振頻率11.0592MHz,實(shí)驗(yàn)成功。
  8.           2、好東西要共享,大家隨意折騰~~
  9. *********************************************************************************************/
  10. #include<reg51.h>
  11. #include<intrins.h>
  12. #include<stdio.h>

  13. #define uchar unsigned char        //無(wú)符號(hào)字符型類型數(shù)據(jù)
  14. #define uint unsigned int //無(wú)符號(hào)整型數(shù)據(jù)
  15.         #define ulong unsigned long //無(wú)符號(hào)整型數(shù)據(jù)
  16.         #define xiao float //xiaoshu
  17. #define IODATA  P0
  18. unsigned char IrValue[24]; //接收收據(jù)
  19. unsigned char Time;

  20. sbit RS=P2^6; //定義rs端口
  21. sbit RW=P2^5; //定義rw端口
  22. sbit E=P2^7;
  23.        
  24. sbit IRIN=P3^2;//紅外數(shù)據(jù)io

  25.              
  26. /*******************************************************************************
  27. * 函數(shù)名         : DelayMs()
  28. * 函數(shù)功能                   : 延時(shí)
  29. * 輸入           : x
  30. * 輸出                  : 無(wú)
  31. *******************************************************************************/

  32. void DelayMs(unsigned int x)   //0.14ms誤差 0us
  33. {
  34. unsigned char i;
  35.   while(x--)
  36. {
  37.   for (i = 0; i<13; i++)
  38. {}
  39. }
  40. }
  41. /*******************************************************************************
  42. * 函數(shù)名         : IrInit()
  43. * 函數(shù)功能                   : 初始化紅外線接收
  44. * 輸入           : 無(wú)
  45. * 輸出                  : 無(wú)
  46. *******************************************************************************/

  47. void IrInit()
  48. {
  49.         IT0=1;//下降沿觸發(fā)
  50.         EX0=1;//打開(kāi)中斷0允許
  51.         EA=1;        //打開(kāi)總中斷

  52.         IRIN=1;//初始化端口
  53. }
  54. /*******************************************************************************
  55. * 函數(shù)名         : ReadIr()
  56. * 函數(shù)功能                   : 讀取紅外數(shù)值的中斷函數(shù)
  57. * 輸入           : 無(wú)
  58. * 輸出                  : 無(wú)
  59. *******************************************************************************/

  60. void ReadIr() interrupt 0
  61. {
  62.         unsigned char j,k;
  63.         unsigned int err;
  64.         Time=0;                                         
  65.         DelayMs(70);

  66.         if(IRIN==0)                //確認(rèn)是否真的接收到正確的信號(hào)
  67.         {         
  68.                
  69.                 err=1000;                                //1000*10us=10ms,超過(guò)說(shuō)明接收到錯(cuò)誤的信號(hào)
  70.                 /*當(dāng)兩個(gè)條件都為真是循環(huán),如果有一個(gè)條件為假的時(shí)候跳出循環(huán),免得程序出錯(cuò)的時(shí)
  71.                 侯,程序死在這里*/       
  72.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低電平過(guò)去                 
  73.                 {                       
  74.                         DelayMs(1);
  75.                         err--;
  76.                 }
  77.                 if(IRIN==1)                        //如果正確等到9ms低電平
  78.                 {
  79.                         err=500;
  80.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高電平過(guò)去
  81.                         {
  82.                                 DelayMs(1);
  83.                                 err--;
  84.                         }
  85.                         for(k=0;k<8;k++)                //共有4組數(shù)據(jù)
  86.                         {                               
  87.                                 for(j=0;j<8;j++)        //接收一組數(shù)據(jù)
  88.                                 {

  89.                                         err=60;               
  90.                                         while((IRIN==0)&&(err>0))//等待信號(hào)前面的560us低電平過(guò)去
  91. //                                        while (!IRIN)
  92.                                         {
  93.                                                 DelayMs(1);
  94.                                                 err--;
  95.                                         }
  96.                                         err=500;
  97.                                         while((IRIN==1)&&(err>0))         //計(jì)算高電平的時(shí)間長(zhǎng)度。
  98.                                         {
  99.                                                 DelayMs(1);//0.14ms
  100.                                                 Time++;
  101.                                                 err--;
  102.                                                 if(Time>30)
  103.                                                 {
  104.                                                         EX0=1;
  105.                                                         return;
  106.                                                 }
  107.                                         }
  108.                                         IrValue[k]>>=1;         //k表示第幾組數(shù)據(jù)
  109.                                         if(Time>=8)                        //如果高電平出現(xiàn)大于565us,那么是1
  110.                                         {
  111.                                                 IrValue[k]|=0x80;
  112.                                         }
  113.                                         Time=0;                //用完時(shí)間要重新賦值                                                       
  114.                                 }
  115.                         }
  116.                 }
  117.                
  118.                         return;
  119.                
  120.         }                       
  121. }


  122.    //數(shù)據(jù)處理

  123. void sjcl()
  124. {
  125.                 IrValue[8]=IrValue[0]>>4;                          //高位  用戶碼
  126.                 IrValue[9]=IrValue[0]&0x0f;                //低位       

  127.     IrValue[10]=IrValue[1]>>4;                          //高位   用戶反碼
  128.                 IrValue[11]=IrValue[1]&0x0f;                //低位       

  129.     IrValue[12]=IrValue[2]>>4;                          //高位   數(shù)據(jù)碼
  130.                 IrValue[13]=IrValue[2]&0x0f;                //低位

  131.     IrValue[14]=IrValue[3]>>4;                          //高位  數(shù)據(jù)反碼
  132.                 IrValue[15]=IrValue[3]&0x0f;                //低位       
  133.        
  134.           IrValue[16]=IrValue[4]>>4;                          //高位  數(shù)據(jù)反碼
  135.                 IrValue[17]=IrValue[4]&0x0f;                //低位       

  136.           IrValue[18]=IrValue[5]>>4;                          //高位  數(shù)據(jù)反碼
  137.                 IrValue[19]=IrValue[5]&0x0f;                //低位       

  138.           IrValue[20]=IrValue[6]>>4;                          //高位  數(shù)據(jù)反碼
  139.                 IrValue[21]=IrValue[6]&0x0f;                //低位       

  140.           IrValue[22]=IrValue[7]>>4;                          //高位  數(shù)據(jù)反碼
  141.                 IrValue[23]=IrValue[7]&0x0f;                //低位       


  142. }

  143.        

  144. /*********************************************************************************************
  145. 函數(shù)名:延時(shí)函數(shù)
  146. 調(diào)  用:Delay30us();/Delay20ms();/Delay1s();
  147. 參  數(shù):無(wú)
  148. 返回值:無(wú)
  149. 結(jié)  果:延時(shí)相應(yīng)時(shí)間
  150. 備  注:振蕩晶體為11.0592MHz(所有延時(shí)函數(shù)Copy自STC-ISP(v6.85).exe)
  151. **********************************************************************************************/
  152. void Delay30us()                //@11.0592MHz-40
  153. {
  154.         unsigned char i;

  155.         i = 11;
  156.         while (--i);
  157. }


  158. void Delay20ms()                //@11.0592MHz
  159. {
  160.         unsigned char i, j;

  161.         i = 36;
  162.         j = 217;
  163.         do
  164.         {
  165.                 while (--j);
  166.         } while (--i);
  167. }


  168. void Delay1s()                //@11.0592MHz
  169. {
  170.         unsigned char i, j, k;

  171.         _nop_();
  172.         i = 8;
  173.         j = 1;
  174.         k = 243;
  175.         do
  176.         {
  177.                 do
  178.                 {
  179.                         while (--k);
  180.                 } while (--j);
  181.         } while (--i);
  182. }





  183. /********************************************************************
  184. * 名稱 : bit Busy(void)
  185. * 功能 : 這個(gè)是一個(gè)讀狀態(tài)函數(shù),讀出函數(shù)是否處在忙狀態(tài)
  186. * 輸入 : 輸入的命令值
  187. * 輸出 : 無(wú)
  188. ***********************************************************************/
  189. void Busy(void)
  190. {
  191. bit busy_flag = 1;
  192. IODATA  = 0xff;
  193. RS = 0;          //指令關(guān)
  194. Delay30us();
  195. RW = 1;          //讀狀態(tài)
  196. Delay30us();
  197. E = 1;        //使能高電平
  198. while(1)
  199. {
  200. busy_flag = (bit)(IODATA  & 0x80); //強(qiáng)制取最高位
  201. if(busy_flag == 0)
  202. {
  203. break;
  204. }
  205. }
  206. E = 0;           //E 1->0,rs=0,rw=1,
  207.            //將數(shù)據(jù)寄存器內(nèi)的數(shù)據(jù)讀到DB0~DB7,分別將狀態(tài)標(biāo)志BF和地址計(jì)數(shù)器(AC)內(nèi)容讀到DB7和DB6~DB0。

  208. }

  209. /********************************************************************
  210. * 名稱 : lcd1602_write_cmd(uchar del)
  211. * 功能 : 1602命令函數(shù)
  212. * 輸入 : 輸入的命令值
  213. * 輸出 : 無(wú)
  214. ***********************************************************************/
  215. void lcd1602_write_cmd(uchar del)
  216. {
  217. RS = 0;
  218. Delay30us();
  219. RW = 0;
  220. Delay30us();
  221. E = 0;
  222. Delay30us();
  223. IODATA  = del;
  224. Delay30us();
  225. E = 1;
  226. Delay30us();
  227. E = 0;                        //E 1->0,rs=0,rw=0, 將指令代碼寫(xiě)入指令寄存器中
  228. }

  229. /********************************************************************
  230. * 名稱 : lcd1602_write_data(uchar del)
  231. * 功能 : 1602寫(xiě)數(shù)據(jù)函數(shù)
  232. * 輸入 : 需要寫(xiě)入1602的數(shù)據(jù)
  233. * 輸出 : 無(wú)
  234. ***********************************************************************/

  235. void lcd1602_write_data(uchar del)
  236. {
  237. Busy();      
  238. Delay30us();
  239. RS = 1;
  240. Delay30us();
  241. RW = 0;
  242. Delay30us();
  243. E = 0;
  244. Delay30us();
  245. IODATA  = del;
  246. Delay30us();
  247. E = 1;
  248. Delay30us();
  249. E = 0;                          //E 1->0,rs=1,rw=0, 數(shù)據(jù)寫(xiě)入數(shù)據(jù)寄存器中
  250. }

  251. /********************************************************************
  252. * 名稱 : lcd1602_init()
  253. * 功能 : 1602初始化,請(qǐng)參考1602的資料
  254. * 輸入 : 無(wú)
  255. * 輸出 : 無(wú)
  256. ***********************************************************************/
  257. void lcd1602_init(void)
  258. {
  259. Delay20ms();
  260. lcd1602_write_cmd(0x38);         //8位數(shù)據(jù),雙列,5*7字形
  261. Delay20ms();
  262. lcd1602_write_cmd(0x38);
  263. Delay20ms();
  264. lcd1602_write_cmd(0x38);
  265. Busy();
  266. lcd1602_write_cmd(0x08);// 只開(kāi)顯示
  267. Busy();   
  268. lcd1602_write_cmd(0x01);        //清屏
  269. Busy();
  270. lcd1602_write_cmd(0x06);//顯示地址遞增,即寫(xiě)一個(gè)數(shù)據(jù)后,顯示位置右移一位
  271. Busy();
  272. lcd1602_write_cmd(0x0c);        //開(kāi)啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍
  273. }

  274. /********************************************************************
  275. * 名稱 : lcd1602_char(uchar hang,uchar lie,char sign)
  276. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符顯示"b" ,調(diào)用該函數(shù)如下
  277. L1602_char(1,5,'b')
  278. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  279. * 輸出 : 無(wú)
  280. ***********************************************************************/
  281. void lcd1602_char(uchar hang,uchar lie,char sign)
  282. {
  283. uchar a;
  284. if(hang == 1)
  285. {
  286. a = 0x80;
  287. }
  288. if(hang == 2)
  289. {
  290. a = 0xc0;
  291. }
  292. a = a + lie - 1;
  293. Busy();
  294. lcd1602_write_cmd(a);  //置數(shù)據(jù)存貯器地址
  295. Busy();
  296. lcd1602_write_data(sign);
  297. }




  298. /********************************************************************
  299. * 名稱 : lcd1602_string(uchar hang,uchar lie,uchar *p)
  300. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開(kāi)始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
  301. L1602_string(1,5,"ab cd ef;")
  302. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  303. * 輸出 : 無(wú)
  304. ***********************************************************************/

  305. void lcd1602_string(uchar hang,uchar lie,uchar *p)
  306. {
  307. uchar a;
  308. if(hang == 1)
  309. {
  310. a = 0x80;
  311. }
  312. if(hang == 2)
  313. {
  314. a = 0xc0;
  315. }
  316. a = a + lie - 1;
  317. while(1)
  318. {
  319. Busy();
  320. lcd1602_write_cmd(a);
  321. Busy();
  322. lcd1602_write_data(*p);
  323. a++;
  324. p++;   
  325. if((*p == '\0')||(a==0x90)||(a==0xd0)) //字符結(jié)束或每行最后一個(gè)字符
  326. {
  327. break;
  328. }
  329. ……………………

  330. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2019-12-17 21:24 | 顯示全部樓層
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說(shuō)明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復(fù)

使用道具 舉報(bào)

ID:499469 發(fā)表于 2019-12-19 08:54 | 顯示全部樓層
admin 發(fā)表于 2019-12-17 21:24
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說(shuō)明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)

不好意思 找不到重新編輯按鈕
回復(fù)

使用道具 舉報(bào)

ID:647132 發(fā)表于 2020-1-9 22:29 | 顯示全部樓層
正在學(xué)習(xí)紅外遙控,謝謝了。
回復(fù)

使用道具 舉報(bào)

ID:686739 發(fā)表于 2020-3-17 07:25 來(lái)自手機(jī) | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:272612 發(fā)表于 2020-5-17 01:23 | 顯示全部樓層
正在找這個(gè),發(fā)現(xiàn)STC1T單片機(jī)和傳統(tǒng)51還是有點(diǎn)不一樣的。
回復(fù)

使用道具 舉報(bào)

ID:253767 發(fā)表于 2020-5-17 06:57 | 顯示全部樓層
謝謝分享!!!
回復(fù)

使用道具 舉報(bào)

ID:432192 發(fā)表于 2020-11-12 21:56 來(lái)自手機(jī) | 顯示全部樓層
這個(gè)資料真的頂,剛想弄15得就遇到了
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2020-12-25 16:51 | 顯示全部樓層
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2020-12-25 16:51 | 顯示全部樓層
杰瑤電子 發(fā)表于 2020-11-12 21:56
這個(gè)資料真的頂,剛想弄15得就遇到了

這個(gè)也是15W的 http://www.torrancerestoration.com/bbs/dpj-200464-1.html
回復(fù)

使用道具 舉報(bào)

ID:398219 發(fā)表于 2024-5-17 16:03 | 顯示全部樓層
學(xué)習(xí)一下源程序,謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:398219 發(fā)表于 2024-5-20 15:14 | 顯示全部樓層
謝謝樓主程序,已經(jīng)調(diào)試成功,可以接收并解碼空調(diào)的遙控?cái)?shù)據(jù)了。
回復(fù)

使用道具 舉報(bào)

ID:990909 發(fā)表于 2024-5-26 13:28 | 顯示全部樓層
太頂了樓主
回復(fù)

使用道具 舉報(bào)

ID:832201 發(fā)表于 2024-10-23 17:04 | 顯示全部樓層
正需要這個(gè)代碼,非常感謝
回復(fù)

使用道具 舉報(bào)

ID:961114 發(fā)表于 2024-10-24 17:10 | 顯示全部樓層
可以用AI8051U, 兼容的
最大的特色:1,DMA支持外設(shè)直接到外設(shè);2,TFPU32@108MHz:【硬件三角函數(shù)/反三角函數(shù),硬件浮點(diǎn)運(yùn)算器】,算力全面超越 103
回復(fù)

使用道具 舉報(bào)

ID:1141083 發(fā)表于 2025-3-21 08:10 | 顯示全部樓層
感謝大佬,正要學(xué)習(xí),找不到資料呢
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表