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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4805|回復: 1
打印 上一主題 下一主題
收起左側

用51單片機做個2.4G遙控器(一)

[復制鏈接]
跳轉到指定樓層
樓主
       樓主在大學里閑得無聊做的遙控2.4G小車的遙控器,用的單片機是KR51單片機,現在不是很常見,但是對于一個學生黨足夠做點在大學期間不后悔的作品了;
制作出來的實物圖如下:



下面介紹一下現在所需的材料,首先該款51單片機并不搭載AD轉換芯片,所以得需要另配模塊,我所用的即是PCF8591模塊,如下圖;



推薦買上圖這種的,因為我用過其他種類的pcf8591,多多少少都是程序上不支持,而且該模塊可以檢測4路AD信號,對于需要做兩路控制的遙控器就可以滿足條件,話不多說,直接上pcf8591用LCD1602顯示程序,我的程序只適用于KR51單片機,需要改程序的根據自己實際需求修改即可;

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define AddWr 0x90
  4. #define AddRd 0x91
  5. unsigned char AD_CHANNEL=0;
  6. unsigned char D[32];
  7. sbit scl=P1^0;
  8. sbit sda=P1^1;
  9. sbit rs=P2^0;
  10. sbit rw=P2^1;
  11. sbit lcden=P2^2;
  12. bit ack;
  13. unsigned char date;
  14. void Delay(unsigned char i);
  15. void init();
  16. void write_shige(unsigned char b,unsigned char m);
  17. /////////////////////////////////////////////////////////////////
  18. void start()
  19. {
  20.         sda=1;
  21.         _nop_();
  22.         scl=1;
  23.         _nop_();_nop_();_nop_();_nop_();_nop_();
  24.         sda=0;
  25.         _nop_();_nop_();_nop_();_nop_();_nop_();
  26.         scl=0;
  27.         _nop_();_nop_();
  28. }
  29. ////////////////////////////////////////////////////////////////
  30. void stop()
  31. {
  32.         sda=0;
  33.         _nop_();_nop_();
  34.         scl=1;
  35.         _nop_();_nop_();_nop_();_nop_();_nop_();
  36.         sda=1;
  37.         _nop_();_nop_();_nop_();_nop_();_nop_();
  38. }
  39. ////////////////////////////////////////////////////////////////
  40. void SendByte(unsigned char c)
  41. {
  42.         unsigned char i;
  43.         for(i=0;i<8;i++)
  44.         {
  45.                 if((c<<i)&0x80)
  46.                         sda=1;
  47.                 else
  48.                         sda=0;
  49.                 _nop_();
  50.                 scl=1;
  51.                 _nop_();_nop_();_nop_();_nop_();_nop_();
  52.                 scl=0;
  53.         }
  54.         _nop_();_nop_();
  55.         sda=1;
  56.         _nop_();_nop_();
  57.         scl=1;
  58.         _nop_();_nop_();_nop_();_nop_();_nop_();
  59.         if(sda==1)
  60.                 ack=0;
  61.         else
  62.                 ack=1;
  63.         scl=0;
  64.         _nop_();_nop_();
  65. }
  66. ////////////////////////////////////////////////////////////////
  67. unsigned char RevByte()
  68. {
  69.         unsigned char retc=0,i;
  70.         sda=1;
  71.         for(i=0;i<8;i++)
  72.         {
  73.                 _nop_();
  74.                 scl=0;
  75.                 _nop_();_nop_();_nop_();_nop_();_nop_();
  76.                 scl=1;
  77.                 _nop_();_nop_();
  78.                 retc=retc<<1;
  79.                 if(sda==1)
  80.                 {
  81.                         retc=retc+1;
  82.                 }
  83.                 _nop_();_nop_();
  84.         }
  85.         scl=0;
  86.         _nop_();_nop_();
  87.         return(retc);
  88. }
  89. ///////////////////////////////////////////////////////////////
  90. void Ack1(bit a)
  91. {
  92.         if(a==0)
  93.         {
  94.                 sda=0;
  95.         }
  96.         else
  97.                 sda=1;
  98.         _nop_();_nop_();_nop_();
  99.         scl=1;
  100.         _nop_();_nop_();_nop_();_nop_();_nop_();
  101.         scl=0;
  102.         _nop_();_nop_();
  103. }
  104. //////////////////////////////////////////////////////////////

  105. //////////////////////////////////////////////////////////////
  106. bit PCF8591_DACONVERSION(unsigned char addr,unsigned char channel,unsigned char Val)
  107. {
  108.         start();
  109.         SendByte(addr);
  110.         if(ack==0)
  111.                 return(0);
  112.         SendByte(0x40|channel);
  113.         if(ack==0)
  114.                 return(0);
  115.         SendByte(Val);
  116.         if(ack==0)
  117.                 return(0);
  118.         stop();
  119.         return(1);
  120. }
  121. //////////////////////////////////////////////////////////////
  122. bit PCF8591_SendByte(unsigned char addr,unsigned char channel)
  123. {
  124.         start();
  125.         SendByte(addr);
  126.         if(ack==0)
  127.                 return(0);
  128.         SendByte(0x40|channel);
  129.         if(ack==0)
  130.                 return(0);
  131.         stop();
  132.         return(1);
  133. }
  134. ////////////////////////////////////////////////////////////
  135. unsigned char PCF8591_RcvByte(unsigned char addr)
  136. {
  137.         unsigned char dat;
  138.         start();
  139.         SendByte(addr+1);
  140.         if(ack==0)
  141.                 return(0);
  142.         dat=RevByte();
  143.         Ack1(1);
  144.         stop();
  145.         return(dat);
  146. }
  147. //////////////////////////////////////////////////////////////////
  148. void Delay(unsigned char i)
  149. {
  150.   unsigned char j,k;
  151.   for(j=i;j>0;j--)
  152.     for(k=125;k>0;k--);
  153. }
  154. /////////////////////////////////////////////////////////////////
  155. main()
  156. {
  157.         rw=0;
  158.         lcden=0;
  159.         init();
  160.         while(1)
  161.         {
  162.                         switch(AD_CHANNEL)
  163.                         {
  164.                                 case 0:
  165.                                         PCF8591_SendByte(AddWr,1);
  166.                                 D[0]=PCF8591_RcvByte(AddWr);
  167.                                 write_shige(0,D[0]);
  168.                                 break;
  169.                               
  170.                                 case 1:
  171.                                         PCF8591_SendByte(AddWr,2);
  172.                                 D[1]=PCF8591_RcvByte(AddWr);
  173.                                 write_shige(4,D[1]);
  174.                                 break;
  175.                               
  176.                                 case 2:
  177.                                         PCF8591_SendByte(AddWr,3);
  178.                                 D[2]=PCF8591_RcvByte(AddWr);
  179.                                 write_shige(8,D[2]);
  180.                                 break;
  181.                               
  182.                                 case 3:
  183.                                         PCF8591_SendByte(AddWr,0);
  184.                                 D[3]=PCF8591_RcvByte(AddWr);
  185.                                 write_shige(12,D[3]);
  186.                                 break;
  187.                               
  188.                                 case 4:
  189.                                 PCF8591_DACONVERSION(AddWr,0,D[4]);
  190.                                 break;
  191.                 }
  192.                         D[4]=D[3];
  193.                 if(++AD_CHANNEL>4)
  194.                         AD_CHANNEL=0;
  195.                
  196.         }
  197. }
  198. /////////////////////////////////////////////////////////////
  199. void write_com(unsigned char com)
  200. {
  201.         rs=0;
  202.         lcden=0;
  203.         P0=com;
  204.         Delay(10);
  205.         lcden=1;
  206.         Delay(10);
  207.         lcden=0;
  208. }
  209. ///////////////////////////////////////////////////////////////
  210. void write_date(unsigned char date)
  211. {
  212.         rs=1;
  213.         lcden=0;
  214.         P0=date;
  215.         Delay(10);
  216.         lcden=1;
  217.         Delay(10);
  218.         lcden=0;
  219. }
  220. /////////////////////////////////////////////////////////////
  221. void init()
  222. {
  223.         write_com(0x38);
  224.         write_com(0x0c);
  225.         write_com(0x06);
  226.         write_com(0x01);
  227.         write_com(0x80);
  228. }
  229. //////////////////////////////////////////////////////////////
  230. void write_shige(unsigned char b,unsigned char m)
  231. {
  232.         unsigned char bai,shi,ge;
  233.         bai=m/100;
  234.         shi=m%100/10;
  235.         ge=m%10;
  236.         write_com(0x80+0x00+b);
  237.         write_date(0x30+bai);
  238.         write_date(0x30+shi);
  239.         write_date(0x30+ge);
  240. }
  241. /////////////////////////////////////////////////////////
復制代碼
代碼: AD轉換LCD顯示.zip (20.41 KB, 下載次數: 22)

這是我自己寫的AD轉換,所以沒有啥備注信息,這是做遙控的第一步,下一步就是將搖桿連在pcf8591上,下一篇有空更新;

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:861806 發表于 2021-10-7 18:31 | 只看該作者
感謝帥氣樓主分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天干.com | 福利视频一二区 | 久久久精品综合 | 国产高清精品网站 | 精品国产高清一区二区三区 | 欧美电影在线观看网站 | 又黄又爽的网站 | 国产一区免费 | wwwxxx日本在线观看 | 欧美一区二区三区在线观看 | 精品国产欧美一区二区三区成人 | 国产高清视频一区二区 | 国产精品久久视频 | 亚洲午夜一区二区 | 亚洲成av人片在线观看无码 | 成人福利视频网站 | 高清久久久 | 亚洲xxxxx| 91在线精品秘密一区二区 | 国产高清精品一区二区三区 | 夜夜爽99久久国产综合精品女不卡 | 久久精品视频播放 | 国产精品福利久久久 | 国产高清精品一区 | 亚洲精品1区 | www久久久 | 中文字幕动漫成人 | 国产精品国产三级国产aⅴ浪潮 | 国产精品亚洲精品久久 | 久久大| 成年人在线观看视频 | 国产成人短视频在线观看 | 精品国产免费一区二区三区五区 | 成人免费一区二区三区视频网站 | 欧美一级特黄aaa大片在线观看 | 日韩中文字幕在线观看 | 国产色婷婷精品综合在线手机播放 | 国产福利资源在线 | 欧美一区二区另类 | 免费看啪啪网站 | 国产中文一区二区三区 |