发布时间 : 星期二 文章基于单片机的红外遥控智能小车毕业设计报告更新完毕开始阅读
基于单片机的红外遥控小车
附录1:源程序
1 main.c
#include
bit MODE_ZIDONG=0; bit MODE_SHOUDONG=1; bit mode;
unsigned char dis1[]={%unsigned char dis2[]={\
void EX0_isr()interrupt 0 using 0 //切换小车运行模式 {
if(mode==MODE_ZIDONG) mode=MODE_SHOUDONG; if(mode==MODE_SHOUDONG) mode=MODE_ZIDONG; }
void Delay1ms(unsigned char x)//延时处理 { unsigned char i; while(x--)
{ for(i-0;i<250;i++) {
_nop_(); _nop_(); _nop_(); _nop_(); } } }
void display(unsigned char add,unsigned char *str) {
unsigned char i; lcd_pos(add); i=0;
while(str[i] != '\\0') {
lcd_wdat(str[i]); i++;
第29页
基于单片机的红外遥控小车
} }
void Ir_work(void) {
switch(IRcord[2])//判断第三个数码值 {
case 0:go; display(0x4c,\ case 1:back; display(0x4c,\ case 2:right;display(0x4c,\ case 3:left; display(0x4c,\ case 4:count0+=5;
if(count0>=100)count0=100;display(0x40,\add\加速
case 5:count0-=5;
if(count0<=0) count0=0; display(0x4c,\dec\减速
case 6:Flag=~Flag;break;//反转 case 8:;break; }
irpro_ok=0;//处理完成标志 }
void EX0_init()
{ EX0=1; //开启外部中断0
IT0=1; // 设置成下降沿触发方式 }
void main(void)
{mode=MODE_ZIDONG;//初始化为自动运行模式 TMOD=0x00;
lcd_init(); // 初始化LCD time1_init();//初始化T1定时采集温度 time0_init(); time2_init(); EX0_init();
EX1_init();
EA=1; //开启总中断 Eout=0; while(1) {
while(!mode) //自动控制状态 { display(0x00,dis1); if(hw) {go;
display(0x4c,\ }
第30页
基于单片机的红外遥控小车
if(!hw) {back;
display(0x4c,\ Delay1ms(100); right;
display(0x4c,\ Delay1ms(100); } }
while(mode)//遥控控制状态 {
display(0x00,dis2); if(irok) {
Ircordpro();//码值处理 irok=0; }
if(irpro_ok) { Ir_work(); } } } }
*******************************************************************
2 1602c.h
#include
typedef unsigned char BYTE; typedef unsigned int WORD; typedef bit BOOL ; sbit rs=P1^5; sbit rw=P1^6; sbit ep=P1^7; #define dis_data P2 delay(BYTE ms)
{ // 延时子程序 BYTE i; while(ms--) {
for(i = 0; i< 250; i++) {
_nop_();_nop_();_nop_();_nop_(); }
第31页
基于单片机的红外遥控小车
} }
BOOL lcd_bz()// 测试LCD忙碌状态 {BOOL result; rs = 0; rw = 1; ep = 1; _nop_(); _nop_(); _nop_(); _nop_();
result = (BOOL)(dis_data & 0x80); ep = 0;
return result; }
lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD while(lcd_bz()); rs = 0; rw = 0; ep = 0; _nop_(); _nop_();
dis_data = cmd; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }
lcd_pos(BYTE pos)
{ //设定显示位置 lcd_wcmd(pos | 0x80); }
lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD while(lcd_bz()); rs = 1; rw = 0;
第32页