標題:
單片機+PNP三極管紅外線發(fā)射與接受程序Proteus仿真 實現(xiàn)遙控車
[打印本頁]
作者:
馬永練
時間:
2021-4-23 19:42
標題:
單片機+PNP三極管紅外線發(fā)射與接受程序Proteus仿真 實現(xiàn)遙控車
單片機與紅外收發(fā)裝置及數(shù)碼管,獨立按鍵實現(xiàn)的遙控車仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png
(15.35 KB, 下載次數(shù): 94)
下載附件
2021-4-24 17:20 上傳
51hei.png
(14.93 KB, 下載次數(shù): 73)
下載附件
2021-4-24 17:20 上傳
單片機紅外線發(fā)射源程序如下:
/***************************************************************
作品:紅外線發(fā)射
單片機:STC89C52RC
晶振:12M
編譯環(huán)境:Keil uVision4 V9.00
***************************************************************/
//
// 發(fā)射引腳(接PNP三極管b極)
// PNP三極管e極接2Ω電阻,c極接紅外發(fā)射管
#include <REG51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define SBM 0x80 //識別碼
#define m9 (65536-9000) //約9mS
#define m4_5 (65536-4500) //約4.5mS
#define m1_6 (65536-1630) //約1.65mS
#define m_65 (65536-580) //約0.65mS
#define m_56 (65536-560) //約0.56mS
#define m40 (65536-40000) //約40mS
#define m56 (65536-56000) //56mS
#define m2_25 (65536-2250) //約2.25mS
sbit IR = P3^6; //定義發(fā)射引腳(接PNP三極管基極)
//按鍵
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit key4=P1^4;
sbit key5=P1^5;
sbit key6=P1^6;
sbit key7=P1^7;
void keyscan(void);
void ZZ(uchar x);
void Z0(uchar temp);
void TT0(bit BT,uint x);
void YS(uchar time);
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù)功能:主函數(shù)
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{
TMOD = 0x01; //T0 16位工作方式
IR=1; //發(fā)射端口常態(tài)為高電平
while(1)
{
keyscan();
}
}
/***************************************************************
函數(shù)功能:散轉(zhuǎn)程序
入口參數(shù):v
//
// 13 14 15 16
// 9 10 11 12
// 5 6 7 8
// 1 2 3 4
***************************************************************/
void keyscan(void)
{
//發(fā)送0x01
if(key1==0)
{
YS(5);
if(key1==0)
{
ZZ(0x01);
while(!key1);//等待按鍵釋放
}
}
//發(fā)送0x02
if(key2==0)
{
YS(5);
if(key2==0)
{
ZZ(0x02);
while(!key2);//等待按鍵釋放
}
}
//發(fā)送0x03
if(key3==0)
{
YS(5);
if(key3==0)
{
ZZ(0x03);
while(!key3);//等待按鍵釋放
}
}
//發(fā)送0x04
if(key4==0)
{
YS(5);
if(key4==0)
{
ZZ(0x04);
while(!key4);//等待按鍵釋放
}
}
//發(fā)送0x05
if(key5==0)
{
YS(5);
if(key5==0)
{
ZZ(0x05);
while(!key5);//等待按鍵釋放
}
}
//發(fā)送0x06
if(key6==0)
{
YS(5);
if(key6==0)
{
ZZ(0x06);
while(!key6);//等待按鍵釋放
}
}
//發(fā)送0x07
if(key7==0)
{
YS(5);
if(key7==0)
{
ZZ(0x07);
while(!key7);//等待按鍵釋放
}
}
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù)功能:發(fā)送主程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void ZZ(uchar x)
{
TT0(1,m9); //高電平9mS
TT0(0,m4_5); //低電平4.5mS
/*┈ 發(fā)送4幀數(shù)據(jù) ┈*/
Z0(SBM);
Z0(~SBM);
Z0(x);
Z0(~x);
/*┈┈ 結(jié)束碼 ┈┈*/
TT0(1,m_65);
TT0(0,m40);
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù)功能:單幀發(fā)送程序
入口參數(shù):1幀數(shù)據(jù)
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Z0(uchar temp)
{
uchar v;
for (v=0;v<8;v++) //循環(huán)8次移位
{
TT0(1,m_65); //高電平0.65mS
if(temp&0x01) TT0(0,m1_6); //發(fā)送最低位
else TT0(0,m_56);
temp >>= 1; //右移一位
}
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù)功能:38KHz脈沖發(fā)射 + 延時程序
入口參數(shù):(是否發(fā)射脈沖,延時約 x (uS))
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void TT0(bit BT,uint x)
{
TH0 = x>>8; //輸入T0初始值
TL0 = x;
TF0=0; //清0
TR0=1; //啟動定時器0
if(BT == 0) while(!TF0); //BT=0時不發(fā)射38KHz脈沖只延時;BT=1發(fā)射38KHz脈沖且延時;
else while(1) //38KHz脈沖,占空比5:26
{
IR = 0;
if(TF0)break;
if(TF0)break;
IR = 1;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
}
TR0=0; //關(guān)閉定時器0
TF0=0; //標志位溢出則清0
IR =1; //脈沖停止后,發(fā)射端口常態(tài)為高電平
}
/***************************************************************
函數(shù)功能:按鍵消抖 延時程序
入口參數(shù):1ms×time (晶振=12MHz)
***************************************************************/
void YS(uchar time)
{
uchar i,j;
for(i=0; i<time; i++)
for(j=0; j<247; j++)_nop_();
}
復(fù)制代碼
#include <REGX52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define duanma P0
#define weima P2
//按鍵
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit key4=P1^4;
sbit key5=P1^5;
sbit key6=P1^6;
sbit key7=P1^7;
//紅外接收頭
sbit IR=P3^2;
//電機接口
sbit motor1=P3^4;
sbit motor2=P3^5;
sbit motor3=P3^6;
sbit motor4=P3^7;
uchar code table[]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF};//數(shù)碼管顯示0~9和 -
uchar N[4]; //識別碼,操作碼存放
uchar num,count;//狀態(tài),加減選擇
uint speed=100;//速度
//延時函數(shù)
void delay(uint mux)
{
uint i,j;
for(i=mux;i>0;i--)
for(j=100;j>0;j--);
}
//數(shù)碼管顯示內(nèi)容函數(shù)
void display()
{
delay(1);
weima=0x01;
duanma=table[num];//顯示狀態(tài)
delay(1);
weima=0x02;
duanma=table[10];//顯示-
delay(1);
weima=0x04;
duanma=table[10];//顯示-
delay(1);
weima=0x08;
duanma=table[speed/100];//顯示檔位
delay(1);
}
//前進
void go()
{
uint i;
for(i=speed;i>0;i=i-5)
{
if(i>10)
{
motor1=0;
motor2=1;
motor3=1;
motor4=0;
}
if(i<11)
{
motor1=0;
motor2=0;
motor3=0;
motor4=0;
}
}
}
//后退
void back()
{
uint i;
for(i=speed;i>0;i=i-5)
{
if(i>10)
{
motor1=1;
motor2=0;
motor3=0;
motor4=1;
}
if(i<11)
{
motor1=0;
motor2=0;
motor3=0;
motor4=0;
}
}
}
//停止
void stop()
{
motor1=0;
motor2=0;
motor3=0;
motor4=0;
}
//左轉(zhuǎn)
void turn_left()
{
uint i;
for(i=speed;i>0;i=i-5)
{
if(i>10)
{
motor1=1;
motor2=0;
motor3=1;
motor4=0;
}
if(i<11)
{
motor1=0;
motor2=0;
motor3=0;
motor4=0;
}
}
}
//右轉(zhuǎn)
void turn_right()
{
uint i;
for(i=speed;i>0;i=i-5)
{
if(i>10)
{
motor1=0;
motor2=1;
motor3=0;
motor4=1;
}
if(i<11)
{
motor1=0;
motor2=0;
motor3=0;
motor4=0;
}
}
}
//按鍵控制
void keyscan()
{
//加速
if(key1==0)
{
delay(10);
if(key1==0)
{
count=1;
while(!key1);//等待按鍵釋放
}
}
//左轉(zhuǎn)
if(key2==0)
{
delay(10);
if(key2==0)
{
num=3;
while(!key2);//等待按鍵釋放
}
}
//前進
if(key3==0)
{
delay(10);
if(key3==0)
{
num=1;
while(!key3);//等待按鍵釋放
}
}
//停止
if(key4==0)
{
delay(10);
if(key4==0)
{
num=0;
while(!key4);//等待按鍵釋放
}
}
//后退
if(key5==0)
{
delay(10);
if(key5==0)
{
num=2;
while(!key5);//等待按鍵釋放
}
}
//減速
if(key6==0)
{
delay(10);
if(key6==0)
{
count=2;
while(!key6);//等待按鍵釋放
}
}
//右轉(zhuǎn)
if(key7==0)
{
delay(10);
if(key7==0)
{
num=4;
while(!key7);//等待按鍵釋放
}
}
}
//主函數(shù)
void main(void)
{
IT0 = 1;
EX0 = 1;
EA = 1;
while(1)
{
display();
keyscan();
switch(num)
{
case 0: stop(); break;//暫停
case 1: go(); break;//前進
case 2: back(); break; //后退
case 3: turn_left(); break;// 左轉(zhuǎn)
case 4: turn_right(); break; // 右轉(zhuǎn)
}
if((count==1)&&(speed<410)){speed=speed+100;count=0;} //加速
if((count==2)&&(speed>110)){speed=speed-100;count=0;}//減速
}
}
/********************** 外部中斷函數(shù)************************/
void exint0() interrupt 0
{
uint cnt;
uchar i;
EX0 = 0;
cnt = 0;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載,仿真必須要Proteus7.5版本才能打開:
紅外遙控車 獨立按鍵.zip
(191.29 KB, 下載次數(shù): 121)
2021-4-23 19:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
xjlfh
時間:
2021-5-14 13:09
請教這個發(fā)射線路程序如何移植到STC15F104W上去運行?我只需要簡單的1到4按鍵按下發(fā)射對應(yīng)的鍵碼就可以,網(wǎng)上所有的發(fā)射程序我試了都可以在AT89和stc89系列上運行,但在STC15F100系列上郡運行不了,對C不太懂,只會看簡單的程序。正在學(xué)習(xí)中。
作者:
wcf101
時間:
2021-5-20 16:11
完全不用定時器中斷能做出來這個嗎
作者:
gyn20022002
時間:
2022-9-18 01:12
樓主把這個做出來需要什么零件呢,有沒有清單什么的
作者:
15775075193
時間:
2023-5-4 19:10
樓主,為什么我用的時候兩個電機同時動的。還有左邊遙控器用了沒反應(yīng)的
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1