《2022年ATc智能小车编程[归 .pdf》由会员分享,可在线阅读,更多相关《2022年ATc智能小车编程[归 .pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、#include /包含 51 相关的头文件typedef unsigned char uchar; /重定义 char 数据类型typedef unsigned int uint; /重定义 int 数据类型#define ShowPort P2 /定义数码管显示端口uchar code LedShowData=0 x03,0 x9F,0 x25,0 x0D,0 x99, /定义数码管显示数据0 x49,0 x41,0 x1F,0 x01,0 x19;/0,1,2,3,4,5,6,7,8,9 static unsigned int RecvData; /定义接收红外数据变量static un
2、signed char CountData; /定义红外个数计数变量static unsigned char AddData; /定义自增变量static unsigned int LedFlash; /定义闪动频率计数变量unsigned char HeardData; /定义接收到数据的高位变量bit RunFlag=0; /定义运行标志位bit EnableLight=0; /定义指示灯使能位/*完成基本数据变量定义*/ sbit S1State=P10; /定义 S1 状态标志位sbit S2State=P11; /定义 S2 状态标志位sbit B1State=P12; /定义 B1
3、 状态标志位sbit IRState=P13; /定义 IR 状态标志位sbit RunStopState=P14; /定义运行停止标志位sbit FontIRState=P15; /定义 FontIR 状态标志位sbit LeftIRState=P16; /定义 LeftIR 状态标志位sbit RightIRState=P17; /定义 RightIRState 状态标志位/*完成状态指示灯定义*/ sbit S1=P32; /定义 S1 按键端口sbit S2=P34; /定义 S2 按键端口/*完成按键端口的定义*/ sbit LeftLed=P20; /定义前方左侧指示灯端口sbit
4、 RightLed=P07; /定义前方右侧指示灯端口/*完成前方指示灯端口定义*/ sbit LeftIR=P35; /定义前方左侧红外探头sbit RightIR=P36; /定义前主右侧红外探头sbit FontIR=P37; /定义正前方红外探头/*完成红外探头端口定义*/ sbit M1A=P00; /定义电机1 正向端口sbit M1B=P01; /定义电机1 反向端口sbit M2A=P02; /定义电机2 正向端口sbit M2B=P03; /定义电机2 反向端口/*完成电机端口定义*/ sbit B1=P04; /定义话筒传感器端口sbit RL1=P05; /定义光敏电阻端
5、口sbit SB1=P06; /定义蜂鸣端口/*完成话筒 ,光敏电阻 ,蜂鸣器 .端口定义 */ sbit IR1=P33; /定义红外接收端口/*完成红外接收端口的定义*/ void Delay() /定义延时子程序 uint DelayTime=30000; /定义延时时间变量while(DelayTime-); /开始进行延时循环return; /子程序返回 void ControlCar(uchar CarType) /定义小车控制子程序名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - -
6、 - 第 1 页,共 7 页 - - - - - - - - - M1A=0; /将电机 1 正向电平置低M1B=0; /将电机 1 反向电平置低M2A=0; /将电机 2 正向电平置低M2B=0; /将电机 2 反向电平置低LeftLed=1; /关闭前方左侧指示灯RightLed=1; /关闭前方右侧指示灯Delay(); /将此状态延时一段时间switch(CarType) /判断小车控制指令类型 case 1: /前进/判断是否是前进 M1A=1; /将电机 1 正向端口置高M2A=1; /将电机 2 正向端口置高ShowPort=LedShowData1; /数码管显示前进状态bre
7、ak; /退出判断 case 2: /后退/判断是否是后退 M1B=1; /将电机 1 反向端口置高M2B=1; /将电机 2 反向端口置高ShowPort=LedShowData2; /数码管显示后退状态RightLed=0; /将前方右侧指示灯置低(亮) LeftLed=0; /将前方左侧指示灯置低(亮) break; /退出判断 case 3: /左转/判断是否是左转 M1B=1; /将电机 1 反向端口置高M2A=1; /将电机 2 正向端口置高ShowPort=LedShowData3; /数码管显示左转状态LeftLed=0; /将前方左侧指示灯置低(亮) break; / 退出判
8、断 case 4: /右转/判断是否是右转 M1A=1; /将电机 1 正向端口置高M2B=1; /将电机 2 反向端口置高ShowPort=LedShowData4; /数码管显示右转状态RightLed=0; /将前方右侧指示灯置低(亮) break; / 退出判断 default: /默认情况下的判断 break; / 直接退出判断 void Timer0_IR1() interrupt 1 using 3 /定义红外定时器子程序 TH0=0 xFF; /向定时器定时间寄存器填入高八位值TL0=0 x19; /向定时器定时间寄存器填入低八位值AddData+; /自增变量加1 名师资料总
9、结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - void Int1_IR1() interrupt 2 /定义红外接收中断子程序 TR1=0; /将定时 /计数器 1 关闭IRState=!IRState; /将红外接收指示灯状态取反if(4=AddData) /0 /判断接收到的数据是0 RecvData=RecvData | 0; /判断到 0 就将当前位写0 RecvData=RecvData 1; /将当前位向左移动1 位 els
10、e if(8=AddData)/1 /判断接收到的数据是1 RecvData=RecvData | 1; /将当前位写1 RecvData=RecvData 1; /将当前位向左移动1 位 CountData+; /将红外接收位计数器加1 if(CountData=8) /判断是否接收到8 位数据 HeardData=RecvData; /是 8 位数据时 ,则将数据暂存到高位变量中 else if(CountData=16) /判断是否接收到16 位数据 ET0=0; /关闭红外定时器0 EX1=0; /关闭红外外部中断1 TR1=1; /打开定时 /计数器 1 AddData=0; /定时
11、时间间隔变量清零if(HeardData=226 | HeardData=112) /判断用户码是否正确 HeardData=RecvData; /取出接收到的低八位数据switch(HeardData) /判断低八位数据的值下列那一位 case 32: /电源/说明按下了电源键 / 在这里填写你自己的代码/根据你的功能自己写ControlCar(8); /将小车停止RunFlag=1; /将运行标志位置1 break; /返回 case 46: /TV/AV /说明按下了TV/AV键 / 在这里填写你自己的代码/根据你的功能自己写break; /返回 case 0: /1 /说明按下数字1
12、键ShowPort= LedShowData1; /数码管显示数字1 ControlCar(1); /将小车置于前进状态break; /返回 case 8: /2 /说明按下了数字2 键ShowPort= LedShowData2; /数码管显示数字2 ControlCar(2); /将小车置于后退状态break; /返回 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - case 4: /3 /说明按下了数字3 键ShowPor
13、t= LedShowData3; /数码管显示数字3 ControlCar(3); /将小车置于左转状态break; /返回 case 12: /4 /说明按下了数字4 键ShowPort= LedShowData4; /数码管显示数字4 ControlCar(4); /将小车置于右转状态break; /返回 case 2: /5 /说明按下了数字5 键ShowPort= LedShowData5; /数码管显示数字5 break; /返回 case 10: /6 /说明按下了数字6 键ShowPort= LedShowData6; /数码管显示数字6 break; /返回 case 6: /
14、7 /说明按下了数字7 键ShowPort= LedShowData7; /数码管显示数字7 break; /返回 case 14: /8 /说明按下了数字8 键ShowPort= LedShowData8; /数码管显示数字8 break; /返回 case 64: /9 /说明按下了数字9 键ShowPort= LedShowData9; /数码管显示数字9 break; /返回 case 72: /0/30 /说明按下0/30 键ShowPort= LedShowData0; /数码管显示数字0 break; /返回 case 68: /10+ /说明按下10+键/ 在这里填写你自己的代
15、码/根据你的功能写代码break; /返回 case 76: /20+ /说明按下了20+键/ 在这里填写你自己的代码/根据你的功能写代码break; /返回 case 36: /CH- /说明按下了CH- 键/ 在这里填写你自己的代码/根据你的功能写代码break; /返回 case 40: /CH+ /说明按下了CH+键/ 在这里填写你自己的代码/根据你的功能写代码break; /返回 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - -
16、 - - RecvData=0; /将接收到的数据清零CountData=0; /将接收计数器清零HeardData=0; /将接收高低数据变量清零return; /返回 AddData=0; /将定时器计数器清零ET0=1; /打开定时器中断 void ComBreak() interrupt 4 /定义串口通信子程序unsigned char RecvData; /定义串口数据接收变量if(RI=1) /判断是否接收数据 RecvData=SBUF; /将接收到的数据放入暂时变量if(RecvData10) /判断接收到的数据是否小于10 ShowPort=LedShowDataRecvD
17、ata; /将接收到的数据通过数码管显示出来ControlCar(RecvData); /将串口数据置于小于状态 SBUF=RecvData; /向电脑返回当前接收到的数据RI=0; /清除接收中断标志位 if(TI=1) /判断是否是发送中断 TI=0; /清除发送中断标志位 void main(void) /主程序入口 bit ExeFlag=0; /定义可执行标志位变量RecvData=0; /将接收变量数值初始化CountData=0; /将计数器变量数值初始化AddData=0; /将定时器计数器初始化HeardData=0; /将高低计数器初始化LedFlash=1000; /对闪
18、灯数据进行初始化TMOD=0 x01; /选择定时器0 为两个 16 位定时器TH0=0 xFF; /对定时器进行计数值进行初始化TL0=0 x19; /同上 ,时间大约为25uS TR0=1; /同意开始定时器0 EX1=1; /同意开启外部中断1 IT1=1; /设定外部中断1 为低边缘触发类型ET0=0; SCON=80; /设置串口模式为8 位数据TMOD=33; /设置定时 /计数器模式TH1=0 xFD; /给定时器 1 高八位初始化初值TL1=0 xFD; /给定时器1 低八位初始化初值TR1=1; /开启定时器1 ES=1; /开启串口通信功能REN=1; /开启接收中断标志E
19、A=1; /总中断开启ControlCar(1); /将小车置于前进状态ShowPort=LedShowData0; /数码管显示数字0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - while(1) /程序主循环 while(LedFlash-) /闪灯总延时 if(RL1=0) /判断光敏电阻的状态 RightLed=1; /将前方右侧指示灯点亮LeftLed=1; /将前方左侧指示灯点亮 else /在光敏电阻为不通的状
20、态下 RightLed=0; /将前方右侧指示灯熄灭LeftLed=0; /将前方左侧指示灯熄灭 if(IR1=0) /判断延时期间是否有红外信号输入ExeFlag=1; /将可执行标志位置1 if(S1=0) /判断是否有S1 按下 ControlCar(8); /将小车置于停止状态RunFlag=1; /改变小车运行状态标志位S1State=!S1State; /改变 S1 按键标志位goto NextRun; /跳转到 NextRun 标签 if(S2=0) /判断是否有S2 按下 ControlCar(1); /将小车置于前进状态RunFlag=0; /改变小车运行状态标志位S2Sta
21、te=!S2State; /改变 S2 按键标志位goto NextRun; /跳转到 NextRun 标签 FontIRState=FontIR; /前方红外指示灯显示正前方红外探头状态LeftIRState=LeftIR; /左侧红外指示灯显示前方左侧红外探头状态RightIRState=RightIR; /右侧红外指示灯显示前主右侧红外探头状态if(FontIR=0 | LeftIR=1 | RightIR=1) /判断正前方 ,前左侧 ,前右侧红外探头状态ControlCar(2); /改变小车状态为后退SB1=!SB1; /将蜂鸣器取反Delay(); /调用延时子程序SB1=!SB
22、1; /将蜂鸣器取反Delay(); /调用延时子程序SB1=!SB1; /将蜂鸣器取反Delay(); /调用延时子程序SB1=!SB1; /将蜂鸣器取反Delay(); /调用延时子程序SB1=!SB1; /将蜂鸣器取反Delay(); /调用延时子程序SB1=!SB1; /将蜂鸣器取反Delay(); /调用延时子程序SB1=!SB1; /将蜂鸣器取反名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - ControlCar(3
23、); /改变小车左转状态Delay(); /调用延时子程序SB1=!SB1; /将蜂鸣器取反Delay(); /调用延时子程序SB1=!SB1; /将蜂鸣器取反Delay(); /调用延时子程序SB1=!SB1; /将蜂鸣器取反Delay(); /调用延时子程序SB1=!SB1; /将蜂鸣器取反Delay(); /调用延时子程序SB1=!SB1; /将蜂鸣器取反ControlCar(1); /改变小车为前进状态SB1=1; /关闭蜂鸣器声音 if(B1=0) /判断是否有话筒信号输入 if(RunFlag=0) /判断小车当前的运行标志位 ControlCar(8); /将小车置于停止状态Ru
24、nFlag=1; /改变小车运行标志位 else ControlCar(1); /将小车置于前进状态RunFlag=0; /改变小车运行标志位 B1State=!B1State; /将话筒信号指示灯取反 NextRun: /跳转标签if(RunFlag=0) /判断运行标志位 RunStopState=!RunStopState; /改变小车运行停止状态标志位 else RunStopState=1; /将运行停止状态标志位置1 LedFlash=1000; /运行闪动时间重设定if(ExeFlag=0) /判断可执行标志位 EX1=1; /开启外部中断1 TR1=1; /开启定时 /计数器 1 ExeFlag=0; /可执行标志位置0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -