找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2214|回复: 1
收起左侧

基于51单片机+0038红外发射与接收C程序

[复制链接]
ID:574921 发表于 2020-9-8 19:58 | 显示全部楼层 |阅读模式




红外发射程序
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit key1=P3^3;
  6. sbit key2=P3^4;
  7. sbit key3=P3^5;
  8. sbit LED=P1^0; //发射指示灯
  9. sbit out=P3^7;
  10. uchar i,a,num1;
  11. void init()//初始化作用
  12. {
  13.               key1=1;
  14.               key2=1;
  15.               key3=1;
  16. }
  17. void delay(uchar aa)
  18. {
  19.               uchar bb,cc;
  20.               for(bb=aa;bb>0;bb--)
  21.                             for(cc=200;cc>0;cc--);
  22. }
  23. void delayms(uchar aa)//延时程序
  24. {
  25.               for(a=aa;a>0;a--)
  26.               {
  27.                             _nop_();
  28.                             _nop_();
  29.                             _nop_();
  30.                             _nop_();
  31.                             _nop_();
  32.                             _nop_();
  33.                             _nop_();
  34.                             _nop_();
  35.               }
  36. }

  37. void khz(uchar aa)//是发射38KHZ的程序
  38. {
  39.               for(a=aa;a>0;a--)   //这个for语句可以得到准确的26.3波特率
  40.                             {
  41.                                           out=0;
  42.                                           i=7;                            //低了17us
  43.                                           while(i>0)i--;                            //   38kHZ
  44.                                           out=1;
  45.                                                         //高了9us      17+9=26us   比26.3快一点点
  46.                             }

  47. }
  48.               //khz(116);//3.028ms   精确的时间
  49.               //khz(64);//2.006ms
  50.               //khz(40); //1.052ms
  51.               //delayms(125);//2.012ms      这里是一些时间的介绍
  52.               //delayms(65);//1.054ms
  53.               //delayms(93);//1.5ms
  54. void fashu(uchar num)
  55. {
  56.               khz(116);//发射3ms 38khz
  57.               delayms(125);
  58.               for(num1=8;num1>0;num1--) //原来用的是a  后来出错,肯定在这里!
  59.               {
  60.                             khz(40);
  61.                             if(num&0x01)
  62.                                           delayms(93);//delay 1.5ms
  63.                             else
  64.                                           delayms(65);//delay 1ms
  65.                             num=num>>1;
  66.               }
  67.               khz(20);

  68. }
  69. void tishi()
  70. {
  71.                               LED=0;
  72.                             delay(50);
  73.                             LED=1;
  74.                             delay(50);
  75.                             LED=0;
  76.                             delay(50);
  77.                             LED=1;
  78. }
  79. void keyscan()//按键扫描
  80. {
  81.               if(key1==0)
  82.               {
  83.                             _nop_();_nop_();_nop_();_nop_();
  84.                             _nop_();_nop_();_nop_();_nop_();
  85.                             if(key1==0)
  86.                             {
  87.                                           while(!key1);
  88.                                           fashu(0xf3);
  89.                                           tishi();
  90.                             }

  91.               }
  92.               if(key2==0)
  93.               {
  94.                             _nop_();_nop_();_nop_();_nop_();
  95.                             _nop_();_nop_();_nop_();_nop_();
  96.                             if(key2==0)
  97.                             {
  98.                                           while(!key2);
  99.                                           fashu(0x3f);
  100.                                           tishi();
  101.                                          
  102.                             }

  103.               }
  104.               if(key3==0)
  105.               {
  106.                             _nop_();_nop_();_nop_();_nop_();
  107.                             _nop_();_nop_();_nop_();_nop_();
  108.                             if(key3==0)
  109.                             {
  110.                                           while(!key3);
  111.                                           fashu(0xf5);
  112.                                           tishi();
  113.                             }

  114.               }            
  115. }
  116. void main()
  117. {
  118.               init();
  119.               while(1)
  120.               {
  121.                             keyscan();
  122.               }
  123. }
  124. 红外接收程序
  125. #include<reg51.h>
  126. #include<intrins.h>
  127. #define uchar unsigned char
  128. #define uint unsigned int
  129. sbit led1=P1^0;
  130. sbit led2=P1^1;
  131. sbit led3=P1^2;
  132. sbit in=P3^2;
  133. uchar i,a,num;
  134. bit fleg;
  135. void init()
  136. {
  137.               fleg=1;
  138.               in=1;
  139.               EA=1;
  140.               EX0=1;
  141.               IT0=1;
  142. }
  143. void delayms(uchar aa)
  144. {
  145.               for(i=aa;i>0;i--)
  146.               {
  147.                             _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  148.               }            
  149. }

  150. void main()
  151. {
  152.               init();
  153.               //delayms(45);//0.642ms
  154.               //delayms(35);//0.502ms
  155.               //delayms(115);//1.623ms
  156.               //delayms(72);//1.02ms
  157.               //delayms(84);//1.188ms
  158.               //delayms(31);//0.446ms
  159.               while(1);
  160. }
  161. void sieasdf() interrupt 0
  162. {
  163.               EX0=0;
  164.               for(a=5;a>0;a--)
  165.               {
  166.                             delayms(35);//延时0.5ms 判断5次  5*0.5=2.5ms
  167.                             if(in)fleg=0;
  168.               }
  169.               if(fleg)
  170.               {
  171.                             delayms(72);//延时1ms  判断是不是高电平了
  172.                             if(in)
  173.                             {
  174.                                           delayms(115);//延时让它超过2ms; 2.5+1+1.623=5.123ms  开始读数据
  175.                                           delayms(118);//若偏移一位,可以去掉。
  176.                                           for(a=8;a>0;a--)
  177.                                           {
  178.                                                         while(!in);
  179.                                                         delayms(86);//延时1.188ms 判断IO高低,从而得0或1
  180.                                                         num=num>>1;
  181.                                                         if(in)
  182.                                                                       {
  183.                                                                                     num=num|0x80;
  184.                                                                                     delayms(31);//延时0.6ms 因为上面延时1.2ms+0.6 刚好跳过1.5ms
  185.                                                                       }
  186.                                           }            
  187.                                           P2=num;
  188.                            
  189.                             }
  190.               }
  191.               fleg=1;
  192.               EX0=1;
  193. }
复制代码


回复

使用道具 举报

ID:663576 发表于 2020-10-14 17:58 | 显示全部楼层
您好,您这两个程序是可以放在一起的吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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