您的当前位置:首页嵌入式课程设计--红外遥控小车程序

嵌入式课程设计--红外遥控小车程序

2021-09-09 来源:飒榕旅游知识分享网
#include #include

#define uchar unsigned char #define uint unsigned int sbit IRIN = P3^3; sbit P1_0=P1^0; //数码管动态扫描接口 sbit P1_1=P1^1;

sbit P1_5=P1^5; //蜂鸣器报警接口

sbit P2_0=P2^0; //控制两个直流电机的控制端口 sbit P2_1=P2^1; sbit P2_2=P2^2; sbit P2_3=P2^3; sbit P2_4=P2^4; sbit P2_5=P2^5;

bit flag; //红外解码判断标志位,0有效

uchar IR_buf[4]={0x00,0x00,0x00,0x00};//IR_buf[0]、IR_buf[1]为用户码低位、用户码高位接收缓冲区 // IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区 uchar disp_buf[4]={0x00,0x00,0x40,0x00}; //显示缓冲单元 uchar

seg_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //0~F符的显示码(字形码)

void delay(uchar x); //延时函数 void Delay_ms(uint xms); //延时

void init();

void car_forward(); //小车前进函数 void car_back(); //小车后退函数 void car_Leftturn(); //小车左转弯函数 void car_Rightturn(); //小车右转弯函数 void car_stop(); //小车停止函数

void Display(uint m); //数码管显示函数 void aralm();

void car_jiaspeed(); void car_jianspeed();

/********以下是主函数********/ void main() {

init(); while(1) { Display(disp_buf[2]); switch(disp_buf[2]) { case 0x46: car_forward();break; case 0x15: car_back();break; case 0x44: car_Leftturn();break; case 0x43: car_Rightturn();break; case 0x40: car_stop();break; case 0x47:car_jiaspeed();break; case 0x45:car_jianspeed();break; default: aralm();break; } } }

void init() {

EA=1;EX1=1; //允许总中断中断,使能 INT1 外部中断 IT1 = 1; //触发方式为脉冲负边沿触发 IRIN=1; //遥控输入脚置1 P2_0=0; P2_1=0; P2_2=0; P2_3=0; P2_4=1; P2_5=1; }

void car_jiaspeed() {

P2_4=1; P2_5=1; }

void car_jianspeed() {

while(1) {

P2_4=1; P2_5=0; Delay_ms(200); P2_4=0; P2_5=1; Delay_ms(200); if(disp_buf[2]!=0x45) { break; } } }

/********以下是0.14ms的x倍延时函数********/ void delay(uchar x) //延时x*0.14ms {

uchar i; while(x--)

for (i = 0; i<13; i++); }

/********以下是延时函数********/ void Delay_ms(uint xms) { uint i,j; for(i=xms;i>0;i--) //i=xms即延时约xms毫秒 for(j=110;j>0;j--); }

/********以下是显示函数********/ void Display(uint m) {

uint a,b; a=m; b=m; a=a>>4; b=b&0x0f;

P1_0=0; P1_1=1; P0=seg_data[a]; Delay_ms(5); P1_0=1; P1_1=0; P0=seg_data[b]; Delay_ms(5); }

void car_forward() {

P2_4=1; P2_5=1; P2_0=1; P2_1=0; P2_2=1; P2_3=0; }

void car_back() {

P2_4=1; P2_5=1; P2_0=0; P2_1=1; P2_2=0; P2_3=1; }

void car_Leftturn() {

P2_0=1; P2_1=0; P2_2=0; P2_3=0; }

void car_Rightturn()

{

P2_0=0; P2_1=0; P2_2=1; P2_3=0; }

void car_stop() {

P2_0=0; P2_1=0; P2_2=0; P2_3=0; }

void aralm() {

P1_5=0;

Delay_ms(500); P1_5=1;

Delay_ms(500); }

/********以下是外中断1函数********/ void IR_decode() interrupt 2 { uchar i,j,k,count=0; EX1 = 0; //暂时关闭外中断1中断请求 delay(20); //延时20*0.14=2.8ms if (IRIN==1) //等待 IRIN低电平出现 { EX1 =1; //开外中断0 return; //中断返回 }

while (!IRIN) delay(1); //等待IRIN变为高电平,跳过9ms的低电平引导码 for (j=0;j<4;j++) //收集四组数据,即用户码低位、用户码高位、键值数据码和键值数码反码 {

for (k=0;k<8;k++) //每组数据有8位 {

while (IRIN) //等待IRIN变为低电平,跳过4.5ms的高电平引导码信号。 delay(1); while (!IRIN) //等待IRIN变为高电平 delay(1); while (IRIN) //对IRIN高电平时间进行计数 { delay(1); //延时0.14ms count++; //对0.14ms延时时间进行计数 if (count>=30) { EX1=1; //开外中断0 return; //0.14ms计数过长则返回 } } IR_buf[j]=IR_buf[j] >> 1; //若计数小于6,数据最高位补\"0\",说明收到的是\"0\" if (count>=6) {IR_buf[j] = IR_buf[j] | 0x80;} //若计数大于等于6,数据最高位补\"1\",说明收到的是\"1\" count=0; //计数器清0 } } if (IR_buf[2]!=~IR_buf[3]) //将键数据反码取反后与键数据码码比较,若不等,表示接收数据错误,放弃 { EX1=1; return; }

for(i=0;i<4;i++) {

disp_buf[i]=IR_buf[i]; }

EX1 = 1; //开外中断0 }

因篇幅问题不能全部显示,请点此查看更多更全内容