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

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

QQ登錄

只需一步,快速開始

搜索
查看: 1632|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

這個(gè)單片機(jī)紅外自收自發(fā)代碼怎么改?我把發(fā)送和接受放在一個(gè)while循環(huán)里只能接受

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:947749 發(fā)表于 2021-7-8 17:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
有誰能教教我這個(gè)代碼怎么改嗎
內(nèi)容在附件里,謝謝
  1. //適用于市場(chǎng)上用量最大的HT6121/6122及其兼容的IC編碼。
  2. //使用外部中斷0接收P3.2
  3. //發(fā)射引腳(接PNP三極管b極)
  4. //PNP三極管e極接2Ω電阻,c極接紅外發(fā)射管
  5. #include<reg52.h>
  6. #include "lcd1602.h"        
  7. #include <intrins.h>
  8. #define uchar unsigned char
  9. #define uint  unsigned int
  10. #define LCD_DATA P0
  11. #define SBM   0x80                //識(shí)別碼
  12. #define m9    (65536-9000)               //約9mS
  13. #define m4_5  (65536-4500)               //約4.5mS
  14. #define m1_6  (65536-1630)               //約1.65mS
  15. #define m_65  (65536-580)               //約0.65mS
  16. #define m_56  (65536-560)               //約0.56mS
  17. #define m40   (65536-40000)         //約40mS
  18. #define m56   (65536-56000)         //56mS
  19. #define m2_25  (65536-2250)          //約2.25mS
  20. sbit IRR  = P3^6;                                  //定義發(fā)射引腳(接PNP三極管基極)
  21. sbit LED  = P2^3;
  22. uchar KEY(void);//按鍵
  23. void  SanZhuan(void);//鍵值和ASCII碼值的轉(zhuǎn)換
  24. void  ZZ(uchar x);//
  25. void  Z0(uchar temp);
  26. void  TT0(bit BT,uint x);
  27. void  YS(uchar time);
  28. uchar code tab[] = {0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39};
  29. uchar code set[] = {0X30,0X31,0X30,0X30,0X30,0X30,0X30,0X30,0X30,0X30};
  30. uchar code tab1[] = {0X4F,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X4F,0X39};
  31. uchar code tab2[] = {0X46,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X4E,0X39};
  32. sbit IR = P3^3;                 //接收引腳
  33. sbit LCD_RS=P2^0;
  34. sbit LCD_RW=P2^1;
  35. sbit LCD_EN=P2^2;
  36. uchar  N[4];                                 //識(shí)別碼,操作碼存放
  37. uchar   X1,X2,X3,X4;
  38. void XSQ(void);


  39. typedef unsigned int u16;          //???????????
  40. typedef unsigned char u8;


  41. sbit IRIN=P3^2; //????
  42. u8 IrValue[4] = {'\0'};
  43. u8 Time;

  44. /*????,i=1?,????10us*/
  45. void delay(u16 i)
  46. {
  47.         while(i--);        
  48. }


  49. /*????*/
  50. void DigDisplay()
  51. {
  52.         u8 i;
  53.         write_com(0x83);
  54.         for(i=0;i<4;i++)
  55.         {
  56.                         if(IrValue[i]/16<10)
  57.                         {
  58.                                 write_data(IrValue[i]/16 + 0x30);        
  59.                         }
  60.                         else
  61.                         {
  62.                                 write_data(IrValue[i]/16 + 0x37);        
  63.                         }

  64.                         if(IrValue[i]%16<10)
  65.                         {
  66.                                 write_data(IrValue[i]%16 + 0x30);        
  67.                         }
  68.                         else
  69.                         {
  70.                                 write_data(IrValue[i]%16 + 0x37);        
  71.                         }
  72.         }               
  73. }


  74. /*??????0(????????)*/
  75. void IrInit()
  76. {
  77.         IT0=1;//?????
  78.         EX0=1;//????0??
  79.         EA=1;        //?????

  80.         IRIN=1;//?????
  81. }


  82. /*???*

  83. /*???????????*/
  84. void ReadIr() interrupt 0
  85. {
  86.         u8 j,k;
  87.         u16 err;
  88.         Time=0;                                         
  89.         delay(700);        //7ms
  90.         if(IRIN==0)                //??????????????
  91.         {         
  92.                
  93.                 err=1000;                                //1000*10us=10ms,????????????
  94.                 /*???????????,????????????????,????????
  95.                 ?,??????*/        
  96.                 while((IRIN==0)&&(err>0))        //????9ms??????                  
  97.                 {                        
  98.                         delay(1);
  99.                         err--;
  100.                 }
  101.                 if(IRIN==1)                        //??????9ms???
  102.                 {
  103.                         err=500;
  104.                         while((IRIN==1)&&(err>0))                 //??4.5ms????????
  105.                         {
  106.                                 delay(1);
  107.                                 err--;
  108.                         }
  109.                         for(k=0;k<4;k++)                //??4???
  110.                         {                                
  111.                                 for(j=0;j<8;j++)        //??????
  112.                                 {

  113.                                         err=60;               
  114.                                         while((IRIN==0)&&(err>0))//???????560us?????
  115.                                         {
  116.                                                 delay(1);
  117.                                                 err--;
  118.                                         }
  119.                                         err=500;
  120.                                         while((IRIN==1)&&(err>0))         //???????????
  121.                                         {
  122.                                                 delay(10);         //0.1ms  
  123.                                                 Time++;
  124.                                                 err--;
  125.                                                 if(Time>30)        //??3ms  ????
  126.                                                 {
  127.                                                         return;
  128.                                                 }
  129.                                         }
  130.                                         IrValue[k]>>=1;         //k???????
  131.                                         if(Time>=8)                        //?????????0.8ms,???1
  132.                                         {
  133.                                                 IrValue[k]|=0x80;
  134.                                         }
  135.                                         Time=0;                //?????????                                                        
  136.                                 }
  137.                         }
  138.                 }
  139.                 if(IrValue[2]!=~IrValue[3]) //?? ??? ????? ???? ?????
  140.                 {
  141.                         return;
  142.                 }
  143.         }                        
  144. }




  145. /***************************************************************
  146. 函數(shù)功能:             4×4矩陣鍵盤
  147. ***************************************************************/
  148. uchar KEY(void)
  149. {
  150. uchar H,L;            //行值,列值
  151. H=0;
  152. L=0;
  153. P1 = 0xf0;            //將鍵盤端口行值設(shè)為1,列值設(shè)為0
  154. if(P1!= 0xf0)         //檢測(cè)是否有按鍵按下,如果有則hangval必不為0x0f
  155.    {
  156.     YS(10);            //按鍵去抖動(dòng),延時(shí)10毫秒
  157.     if(P1!=0xf0)       //確實(shí)有按鍵按下
  158.       {
  159.        H  = P1&0xf0;   //按鍵后得到按鍵的行標(biāo)志位,將行標(biāo)志位賦值給hangval
  160.        P1 =  0x0f;      //翻轉(zhuǎn)鍵盤接口輸出
  161.        L  = P1&0x0f;   //得到列標(biāo)志位
  162.       }
  163.         return (H+L);
  164.    }
  165.   return 0;
  166. }
  167. /***************************************************************
  168. 函數(shù)功能:散轉(zhuǎn)程序
  169. 入口參數(shù):v
  170. //  13  14  15  16
  171. //  9   10  11  12
  172. //  5   6   7   8
  173. //  1   2   3   4
  174. ***************************************************************/
  175. void SanZhuan(void)
  176. {
  177. uchar v;
  178. v =KEY();
  179. switch(v)
  180. {
  181.   case 0x77:ZZ(0x00);v=0;break;                //"0"
  182.   case 0xb7:ZZ(0x01);v=0;break;                //"1 "
  183.   case 0xd7:ZZ(0x02);v=0;break;                //"2 "
  184.   case 0xe7:ZZ(0x03);v=0;break;                //"3"
  185.   case 0x7b:ZZ(0x04);v=0;break;                //"4 "
  186.   case 0xbb:ZZ(0x05);v=0;break;                //"5"
  187.   case 0xdb:ZZ(0x06);v=0;break;                //"6"
  188.   case 0xeb:ZZ(0x07);v=0;break;                //"7"
  189.   case 0x7d:ZZ(0x08);v=0;break;                //"8"
  190.   case 0xbd:ZZ(0x09);v=0;break;                //"9"
  191.   case 0xdd:ZZ(0x0a);v=0;break;                //"a"
  192.   case 0xed:ZZ(0x0b);v=0;break;                //"b"
  193.   case 0x7e:ZZ(0x0c);v=0;break;                //"c"
  194.   case 0xbe:ZZ(0x0d);v=0;break;                //"d"
  195.   case 0xde:ZZ(0x1e);v=0;break;                //"e"
  196.   case 0xee:ZZ(0x1f);v=0;break;                //"f"
  197.   default:v=0;break;
  198. }

  199. }
  200. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  201. 函數(shù)功能:發(fā)送主程序
  202. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  203. void ZZ(uchar x)
  204. {
  205.   TT0(1,m9);                       //高電平9mS
  206.   TT0(0,m4_5);               //低電平4.5mS引導(dǎo)
  207.   /*┈ 發(fā)送4幀數(shù)據(jù) ┈*/
  208.   Z0(SBM);                                //識(shí)別碼                                                                                                      
  209.   Z0(~SBM);
  210.   Z0(x);                 //數(shù)據(jù)碼
  211.   Z0(~x);
  212.   /*┈┈ 結(jié)束碼 ┈┈*/
  213.   TT0(1,m_65);
  214.   TT0(0,m40);
  215.   /*┈┈ 重復(fù)碼 ┈┈*/
  216.         

  217.   while(KEY())
  218.    {
  219.         TT0(1,m9);
  220.         TT0(0,m2_25);
  221.         TT0(1,m_56); //38khz
  222.         TT0(0,m40);
  223.                 TT0(0,m56);
  224.                 LED = !LED;                  //指示燈                                          
  225.     }
  226.    LED = 1;                    
  227. }
  228. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  229. 函數(shù)功能:?jiǎn)螏l(fā)送程序
  230. 入口參數(shù):1幀數(shù)據(jù)
  231. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  232. void Z0(uchar temp)
  233. {
  234.   uchar v;
  235.   for (v=0;v<8;v++)                     //循環(huán)8次移位
  236.        {     
  237.                  TT0(1,m_65);                        //高電平0.65mS         
  238.                          if(temp&0x01==1) TT0(0,m1_6); //發(fā)送最低位
  239.                          else          TT0(0,m_56);     
  240.                          temp >>= 1;                //右移一位
  241.         }   
  242. }
  243. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  244. 函數(shù)功能:38KHz脈沖發(fā)射 + 延時(shí)程序
  245. 入口參數(shù):(是否發(fā)射脈沖,延時(shí)約 x (uS))
  246. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  247. void TT0(bit BT,uint x)
  248. {
  249.   TH0 = x/256;                    //輸入T0初始值
  250.   TL0 =x%256;
  251.   TF0=0;                                //清0
  252.   TR0=1;                                //啟動(dòng)定時(shí)器0
  253.   if(BT == 0)
  254.           while(!TF0);        //BT=0時(shí)不發(fā)射38KHz脈沖只延時(shí);BT=1發(fā)射38KHz脈沖且延時(shí);
  255.   else while(1)                            //38KHz脈沖,占空比5:26
  256.          {
  257.                   IRR = 0;
  258.                   if(TF0)break;
  259.                if(TF0)break;
  260.                   IRR = 1;
  261.                 if(TF0)break;
  262.                  if(TF0)break;
  263.                  if(TF0)break;
  264.                   if(TF0)break;
  265.                  if(TF0)break;
  266.                  if(TF0)break;
  267.                  if(TF0)break;
  268.                  if(TF0)break;
  269.                  if(TF0)break;
  270.                   if(TF0)break;
  271.                  }
  272.   TR0=0;                                //關(guān)閉定時(shí)器0
  273.   TF0=0;                                //標(biāo)志位溢出則清0
  274.   IRR =1;                                //脈沖停止后,發(fā)射端口常態(tài)為高電平
  275. }
  276. /***************************************************************
  277. 函數(shù)功能:按鍵消抖    延時(shí)程序
  278. 入口參數(shù):1ms×time       (晶振=12MHz)
  279. ***************************************************************/
  280. void YS(uchar time)
  281. {
  282.      uchar i,j;
  283.          for(i=0; i<time; i++)
  284.      for(j=0; j<247; j++)_nop_();
  285. }
  286. /*******************************接收*********************************************/
  287. void delay1(unsigned char t) {
  288.     unsigned char i;
  289.     while(t--)
  290.         for(i = 200; i > 0; i--);
  291. }

  292. void LCD_write_instruction(unsigned char LCD_instruction) { //寫指令到LCD
  293.     LCD_RS = 0;
  294.     LCD_RW = 0;
  295.     LCD_DATA = LCD_instruction;
  296.     LCD_EN = 1;
  297.     _nop_();
  298.     LCD_EN = 0;
  299.     delay(1);
  300. }

  301. void LCD_write_data(unsigned char LCD_data) {         //輸出一個(gè)字節(jié)數(shù)據(jù)到LCD
  302.     LCD_RS = 1;
  303.     LCD_RW = 0;
  304.     LCD_DATA = LCD_data;
  305.     LCD_EN = 1;
  306.     _nop_();
  307.     LCD_EN = 0;
  308.     delay(1);
  309. }

  310. void LCD_set_position(unsigned char x) {              //LCD光標(biāo)定位到x處
  311.     LCD_write_instruction(0x80|x);
  312. }

  313. void LCD_printc(unsigned char lcd_data) {             //輸出一個(gè)字符到LCD
  314.     LCD_write_data(lcd_data);
  315. }
  316. void LCD_prints(unsigned char *lcd_string) {           //輸出一個(gè)字符串到 LCD
  317.     unsigned char i = 0;
  318.     while(lcd_string[i] != 0x00) {
  319.         LCD_write_data(lcd_string[i]);
  320.         i++;
  321.     }
  322. }

  323. void LCD_initial(void) {                           //初始化 LCD
  324.     LCD_write_instruction(0x38);
  325.     LCD_write_instruction(0x0c);
  326.     LCD_write_instruction(0x06);
  327.     LCD_write_instruction(0x01);
  328. }

  329. /**********************LCD顯示函數(shù)************************/
  330. void XSQ(void)
  331. {
  332.    while(1) {
  333.                            uchar temp1,temp2,temp3,temp4;
  334.                         temp1=tab[X4];
  335.                         temp2=set[X3];
  336.                         temp3=tab1[X1];
  337.                         temp4=tab2[X1];
  338.                         LCD_set_position(0x88); //LCD換行顯示
  339.             LCD_printc(temp3);
  340.                         LCD_set_position(0x89); //LCD換行顯示
  341.             LCD_printc(temp4);
  342.                         LCD_set_position(0xC8); //LCD換行顯示
  343.             LCD_printc(temp2);  
  344.       LCD_set_position(0xC9); //LCD換行顯示
  345.             LCD_printc(temp1);
  346.                                  SanZhuan();
  347.       }
  348. }
  349. /********************** 外部中斷函數(shù)************************/
  350. void exint0() interrupt 1
  351. {         
  352.    uint cnt;
  353.    uchar i;
  354.    EX0 =0;
  355.    cnt = 0;        
  356.    while(!IR) cnt++;                        //記錄引導(dǎo)碼時(shí)間
  357.    if(cnt < 1000){EX0=1;return;}             //9ms的計(jì)數(shù)值(12MHz:1000< cnt <1500)
  358.               cnt =0;                        
  359.    while(IR) if(cnt++ > 400){EX0=1;return;}     //防卡死,超時(shí)保護(hù)(12MHz: > 300)
  360.    if(cnt < 200){EX0=1;return;}               //(12MHz不分頻: <260)
  361.    for(i=0; i<32; i++)                       //讀取32位位碼
  362.        {
  363.          cnt =0;        
  364.          while(!IR);                       
  365.          while(IR) if(cnt++ > 200){EX0=1;return;}  //超時(shí)保護(hù)(12MHz:>=200)
  366.          N[i/8] >>= 1;
  367.          if(cnt>60) N[i/8] |= 0x80;                //0和1的計(jì)數(shù)界線(12MHz:< 109)
  368.        }
  369.          if(N[0] == ~N[1] && N[2] == ~N[3])         //校驗(yàn)識(shí)別碼,操作碼        
  370.            {
  371.                    X1 =N[0]/16;
  372.                 X2 =N[0]%16;
  373.                 X3 = N[2]/16;
  374.                 X4 = N[2]%16;
  375.            }
  376.         EX0 =1;         
  377. }

  378. /****************** 主函數(shù) *******************/
  379. void main(void)
  380. {

  381.         TMOD = 0x01;         //T0 16位工作方式                                   //發(fā)射端口常態(tài)為高電平
  382.   IRR=1;        //發(fā)射端口常態(tài)為高電平
  383.         IrInit(); //????0(?????)
  384.         init_lcd(); //???1602
  385.         while(1)
  386.         {        
  387.                 DigDisplay();        //??        
  388.           SanZhuan();
  389.         }
  390.                
  391.   
  392. }
復(fù)制代碼
代碼.rar (45.91 KB, 下載次數(shù): 5)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:584814 發(fā)表于 2021-7-14 08:27 | 只看該作者
自收自發(fā)是啥東東 ?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久综合一区 | 嫩草视频网 | 欧美精品福利视频 | 国产精品视频一二三区 | www.久久99| 色婷婷精品国产一区二区三区 | 国产a视频 | 国精产品一品二品国精在线观看 | 99re国产精品 | 日韩精品 电影一区 亚洲 | 亚洲电影一区二区三区 | 在线观看欧美日韩视频 | 视频一区在线播放 | 国产日韩欧美一区二区在线播放 | 精品国产精品三级精品av网址 | 久久久123 | 精品国产乱码久久久久久丨区2区 | 久久久久久久久久久久91 | 久久国产区 | 91av视频在线观看 | 久草视频在线播放 | 国产亚洲成av人片在线观看桃 | 麻豆精品国产91久久久久久 | 激情国产 | 久久青青| 欧美国产日韩在线观看成人 | 亚洲免费片 | 麻豆亚洲| 欧美国产一区二区三区 | 一区二区三区在线看 | 欧美理伦片在线播放 | 欧美亚洲另类丝袜综合网动图 | 亚洲一区精品在线 | 日本一区二区高清视频 | 国产一区二区电影 | 免费视频二区 | 精品无码久久久久久国产 | 欧美片网站免费 | 成人免费一区二区三区视频网站 | 999视频 | 亚州成人 |