樓主在大學里閑得無聊做的遙控2.4G小車的遙控器,用的單片機是KR51單片機,現在不是很常見,但是對于一個學生黨足夠做點在大學期間不后悔的作品了;
制作出來的實物圖如下:
1.jpg (163.49 KB, 下載次數: 61)
下載附件
2021-10-7 11:24 上傳
2.jpg (219.25 KB, 下載次數: 69)
下載附件
2021-10-7 11:37 上傳
下面介紹一下現在所需的材料,首先該款51單片機并不搭載AD轉換芯片,所以得需要另配模塊,我所用的即是PCF8591模塊,如下圖;
3edcb4034e72e68a824894da5626bb8.jpg (50.56 KB, 下載次數: 68)
下載附件
2021-10-7 11:32 上傳
推薦買上圖這種的,因為我用過其他種類的pcf8591,多多少少都是程序上不支持,而且該模塊可以檢測4路AD信號,對于需要做兩路控制的遙控器就可以滿足條件,話不多說,直接上pcf8591用LCD1602顯示程序,我的程序只適用于KR51單片機,需要改程序的根據自己實際需求修改即可;
單片機源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #define AddWr 0x90
- #define AddRd 0x91
- unsigned char AD_CHANNEL=0;
- unsigned char D[32];
- sbit scl=P1^0;
- sbit sda=P1^1;
- sbit rs=P2^0;
- sbit rw=P2^1;
- sbit lcden=P2^2;
- bit ack;
- unsigned char date;
- void Delay(unsigned char i);
- void init();
- void write_shige(unsigned char b,unsigned char m);
- /////////////////////////////////////////////////////////////////
- void start()
- {
- sda=1;
- _nop_();
- scl=1;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- sda=0;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- scl=0;
- _nop_();_nop_();
- }
- ////////////////////////////////////////////////////////////////
- void stop()
- {
- sda=0;
- _nop_();_nop_();
- scl=1;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- sda=1;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- }
- ////////////////////////////////////////////////////////////////
- void SendByte(unsigned char c)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- if((c<<i)&0x80)
- sda=1;
- else
- sda=0;
- _nop_();
- scl=1;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- scl=0;
- }
- _nop_();_nop_();
- sda=1;
- _nop_();_nop_();
- scl=1;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- if(sda==1)
- ack=0;
- else
- ack=1;
- scl=0;
- _nop_();_nop_();
- }
- ////////////////////////////////////////////////////////////////
- unsigned char RevByte()
- {
- unsigned char retc=0,i;
- sda=1;
- for(i=0;i<8;i++)
- {
- _nop_();
- scl=0;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- scl=1;
- _nop_();_nop_();
- retc=retc<<1;
- if(sda==1)
- {
- retc=retc+1;
- }
- _nop_();_nop_();
- }
- scl=0;
- _nop_();_nop_();
- return(retc);
- }
- ///////////////////////////////////////////////////////////////
- void Ack1(bit a)
- {
- if(a==0)
- {
- sda=0;
- }
- else
- sda=1;
- _nop_();_nop_();_nop_();
- scl=1;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- scl=0;
- _nop_();_nop_();
- }
- //////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////
- bit PCF8591_DACONVERSION(unsigned char addr,unsigned char channel,unsigned char Val)
- {
- start();
- SendByte(addr);
- if(ack==0)
- return(0);
- SendByte(0x40|channel);
- if(ack==0)
- return(0);
- SendByte(Val);
- if(ack==0)
- return(0);
- stop();
- return(1);
- }
- //////////////////////////////////////////////////////////////
- bit PCF8591_SendByte(unsigned char addr,unsigned char channel)
- {
- start();
- SendByte(addr);
- if(ack==0)
- return(0);
- SendByte(0x40|channel);
- if(ack==0)
- return(0);
- stop();
- return(1);
- }
- ////////////////////////////////////////////////////////////
- unsigned char PCF8591_RcvByte(unsigned char addr)
- {
- unsigned char dat;
- start();
- SendByte(addr+1);
- if(ack==0)
- return(0);
- dat=RevByte();
- Ack1(1);
- stop();
- return(dat);
- }
- //////////////////////////////////////////////////////////////////
- void Delay(unsigned char i)
- {
- unsigned char j,k;
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- /////////////////////////////////////////////////////////////////
- main()
- {
- rw=0;
- lcden=0;
- init();
- while(1)
- {
- switch(AD_CHANNEL)
- {
- case 0:
- PCF8591_SendByte(AddWr,1);
- D[0]=PCF8591_RcvByte(AddWr);
- write_shige(0,D[0]);
- break;
-
- case 1:
- PCF8591_SendByte(AddWr,2);
- D[1]=PCF8591_RcvByte(AddWr);
- write_shige(4,D[1]);
- break;
-
- case 2:
- PCF8591_SendByte(AddWr,3);
- D[2]=PCF8591_RcvByte(AddWr);
- write_shige(8,D[2]);
- break;
-
- case 3:
- PCF8591_SendByte(AddWr,0);
- D[3]=PCF8591_RcvByte(AddWr);
- write_shige(12,D[3]);
- break;
-
- case 4:
- PCF8591_DACONVERSION(AddWr,0,D[4]);
- break;
- }
- D[4]=D[3];
- if(++AD_CHANNEL>4)
- AD_CHANNEL=0;
-
- }
- }
- /////////////////////////////////////////////////////////////
- void write_com(unsigned char com)
- {
- rs=0;
- lcden=0;
- P0=com;
- Delay(10);
- lcden=1;
- Delay(10);
- lcden=0;
- }
- ///////////////////////////////////////////////////////////////
- void write_date(unsigned char date)
- {
- rs=1;
- lcden=0;
- P0=date;
- Delay(10);
- lcden=1;
- Delay(10);
- lcden=0;
- }
- /////////////////////////////////////////////////////////////
- void init()
- {
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80);
- }
- //////////////////////////////////////////////////////////////
- void write_shige(unsigned char b,unsigned char m)
- {
- unsigned char bai,shi,ge;
- bai=m/100;
- shi=m%100/10;
- ge=m%10;
- write_com(0x80+0x00+b);
- write_date(0x30+bai);
- write_date(0x30+shi);
- write_date(0x30+ge);
- }
- /////////////////////////////////////////////////////////
復制代碼 代碼:
AD轉換LCD顯示.zip
(20.41 KB, 下載次數: 22)
2021-10-7 11:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
這是我自己寫的AD轉換,所以沒有啥備注信息,這是做遙控的第一步,下一步就是將搖桿連在pcf8591上,下一篇有空更新;
|