c语言实现避障游戏开始结束,智能小车的四路避障C程序

这篇博客详细介绍了基于STC12C5410AD单片机的智能小车避障系统,利用C语言编程实现四路避障传感器和三路寻线传感器的控制。程序包括红外信号的接收和解析,通过PCA中断计数判断信号区域,实现对小车行驶状态的控制,如前进、后退、左转、右转等。同时,还具备红外遥控功能,能够根据接收到的设备码和命令字改变小车状态。
摘要由CSDN通过智能技术生成

《智能小车的四路避障C程序》由会员分享,可在线阅读,更多相关《智能小车的四路避障C程序(20页珍藏版)》请在人人文库网上搜索。

1、智能小车的四路避障C程序默认分类 2009-08-24 10:35 阅读164评论4 字号: 大大 中中 小小 前,左,后避障传感器现在对应中,右,左三路寻线传感器. #include #include #include STC12C5410AD.H#include sio.h#define MIN9MS 0x0120 /9ms中心是0x0159#define MAX9MS 0x01a0#define MIN45MS 0x0090 /4.5ms中心是0x00ac#define MAX45MS 0x00d0#define MIN225MS 0x0040 /2.25ms中心是0x0056#defi。

2、ne MAX225MS 0x0080#define MIN056MS 0x000e /0.56ms中心是0x0015#define MAX056MS 0x001b#define MIN168MS 0x0020 /1.68ms中心是0x0040#define MAX168MS 0x0060sfr ISP_CUNTR = 0xE7;sbit LED1 = P11;sbit LED2 = P12;sbit IR_FRONT = P33;sbit IR_LEFT = P34;sbit IR_RIGHT = P35;sbit IR_BACK = P13;sbit IR_OUT = P10;sbit PW。

3、M0 = P37;sbit MOTO_IN_A1 = P17;sbit MOTO_IN_A2 = P16;sbit MOTO_IN_B1 = P15;sbit MOTO_IN_B2 = P14;bit power_stat;static unsigned char car_stat; /小车状态:0,停止;1,前进;2,后退;3,左转;4,右转;ff,自控寻线模式static unsigned char code led_mod_table320 = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,。

4、1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0;unsigned char idata led_mod = 0;static unsigned char idata led_tick = 0;static unsigned char idata led_ptr = 0;#define IR_SIGNAL_TOTAL 21#define IR_SIGNAL_VALID 18static unsigned char code ir_tableIR_SIGNAL_TOTAL = 1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0。

5、,0,0;static unsigned char code ir_check_tableIR_SIGNAL_TOTAL = 0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0;static unsigned char idata ir_ptr = 0;static unsigned char idata front_signal = 0;static unsigned char idata back_signal = 0;static unsigned char idata left_signal = 0;static unsigned char idata 。

6、right_signal = 0;static bit front_obj = 0, back_obj = 0, left_obj = 0, right_obj = 0;static void delay(unsigned long v) while (v-) /* * PCA中断计数,根据位置判断信号区域和定义,位置0表示初始,1代表引导码信号,2表示引导码间隔,* 3表示第一个bit的信号,4表示第一个bit的间隔,以次类推.* 更具体见对应的红外线协议.*/static unsigned char idata pca_tick;static unsigned char idata pca。

7、_int_count;static unsigned char data pca_int_total; /* 根据引导头确定总长度 */static unsigned int idata period; /* 红外信号占或空周期计数 */static unsigned char idata data_buf6; /* 红外线协议数据缓冲区 */static unsigned int idata ccap1; /PCA0上一次的的计数static unsigned char idata frame_dog; /红外帧看门狗,限定时间未接收完成清除工作void time0_isr() interr。

8、upt 1unsigned char tmp;if (ir_tableir_ptr+) IR_OUT = 0; else IR_OUT = 1;ir_ptr %= IR_SIGNAL_TOTAL;tmp = ir_check_tableir_ptr;if (!IR_FRONT & tmp) | (IR_FRONT & !tmp)front_signal+;if (!IR_LEFT & tmp) | (IR_LEFT & !tmp)left_signal+;if (!IR_RIGHT & tmp) | (IR_RIGHT & !tmp)right_signal+;if (!IR_BACK & t。

9、mp) | (IR_BACK & !tmp)back_signal+;if (ir_ptr = 0) / com_putchar(front_signal);if (front_signal = IR_SIGNAL_VALID)front_obj = 1;elsefront_obj = 0;if (back_signal = IR_SIGNAL_VALID)back_obj = 1;elseback_obj = 0;if (left_signal = IR_SIGNAL_VALID)left_obj = 1;elseleft_obj = 0;if (right_signal = IR_SIGN。

10、AL_VALID)right_obj = 1;elseright_obj = 0;front_signal = 0;back_signal = 0;left_signal = 0;right_signal = 0;void time0_initialize(void)TMOD &= 0x0F; /* clear timer 0 mode bits */TMOD |= 0x02; /* put timer 0 into MODE 2 */TH0 = 0x5C; /* 256 - XTAL*dur/T1_12/, dur=定时器的周期,以us为单位*/TL0 = 0x5C; /* 100us */。

11、PT0 = 0; /* 时钟0中断低优先级 */TR0 = 1;ET0 = 1;static void wakeup (void) interrupt 2static void pca_isr (void) interrupt 6unsigned char i, j;if (CCF1) CCF1 = 0; /清PCA1中断标志LED1 = IR_RIGHT;LED2 = IR_RIGHT;if (!pca_int_count) /第一次收到信号if (!IR_RIGHT) ccap1 = pca_tick * 256 + CCAP1H;pca_int_count+; else /已经收到一些信。

12、号period = pca_tick * 256 + CCAP1H - ccap1;ccap1 = pca_tick * 256 + CCAP1H;/com_putchar(period / 256);/com_putchar(period % 256);if (pca_int_count = 1) if (period MAX9MS) /9mspca_int_count = 0;frame_dog = 0; elsepca_int_count+; else if (pca_int_count = 2) if (period MIN225MS & period MIN45MS & period。

13、 MIN056MS & period = pca_int_total) /帧接收完毕,下面进行有效分析.if (pca_int_total = 67) /完整信号,含有引导信号,设备码8bit,设备反码8bit,命令字8bit,命令字反码8bitif (data_buf0 data_buf1 = 0xff) & (data_buf2 data_buf3 = 0xff) com_putchar(data_buf0);com_putchar(data_buf2);if (data_buf0 = 0x40) switch (data_buf2) case 0x5F: /左car_stat = 3;b。

14、reak;case 0x5B: /右car_stat = 4;break;case 0x5A: /上car_stat = 1;break;case 0x5E: /下car_stat = 2;break;case 0x56: /菜单car_stat = 0;break;case 0x0: /数字0car_stat = 0xff;break;case 0x12: /POWER/ power_stat = power_stat;break;default:break; else /重复信号,仅含有引导信号pca_int_count = 0;frame_dog = 0; else pca_int_co。

15、unt+; else pca_int_count = 0;frame_dog = 0; else j = (pca_int_count - 3) / 2;i = j / 8;j = j % 8;if (period MIN168MS & period MIN056MS & period = 10) led_tick = 0;if (led_mod_tableled_modled_ptr+) LED1 = 0;LED2 = 0; else LED1 = 1;LED2 = 1;led_ptr %= 20;if (pca_int_count) frame_dog+;if (frame_dog = 1。

16、5) /100ms后重新开始分析新的红外线数据包pca_int_count = 0;frame_dog = 0;void auto_power_down() delay(30000);ISP_CUNTR = 0x20; /从AP复位并从AP执行void main (void)unsigned char i;unsigned long j;MOTO_IN_A1 = 0;MOTO_IN_A2 = 0;MOTO_IN_B1 = 0;MOTO_IN_B2 = 0;P1M1 = 0xf0; /P1.7P1.4 强推挽输出EA = 0;power_stat = 0;time0_initialize();c。

17、om_initialize (); /* initialize interrupt driven serial I/O */com_baudrate (4800); /* setup for 1200 baud */*CMOD = 0x01; / #B,PCA空闲计数,PCA计数源=Fosc/12,PCA溢出中断(做一个定时器使用)CCON = 0x00; /PCA中断标志清0,PCA停止计数CL = 0x0;CH = 0x0;CCAPM1 = 0x31; /PCA1上升下降沿捕获*/CMOD = 0x03; /* #B,PCA空闲计数,PCA计数源=fosc/2,PCA溢出中断 */CCON。

18、 = 0x00; /PCA中断标志清0,PCA停止计数CL = 0x0;CH = 0x0;CCAPM1 = 0x31; /PCA1上升下降沿捕获CCAPM0 = 0x42; /PCA0工作模式:8位pwmPCA_PWM0 = 0x00;CCAP0L = 0x20;CCAP0H = 0x20;EPCA_LVD = 1; /允许PCA和低压检测中断 car_stat = 0;pca_tick = 0;pca_int_count = 0;frame_dog = 0;EA = 1; /* Enable Interrupts */CR = 1; /启动PCA计数while (1)if (power_st。

19、at) / auto_power_down();if (left_obj | right_obj | front_obj | back_obj) LED1 = 0;LED2 = 0;switch (car_stat) case 0:MOTO_IN_A1 = 0;MOTO_IN_A2 = 0;MOTO_IN_B1 = 0;MOTO_IN_B2 = 0;break;case 0xff:if (!front_obj) /中线传感器检测到黑线MOTO_IN_A1 = 1;MOTO_IN_A2 = 0;MOTO_IN_B1 = 1;MOTO_IN_B2 = 0;j = 50000;while (j) j。

20、-;if (front_obj)break; else TURNLEFT:MOTO_IN_A1 = 0;MOTO_IN_A2 = 1;MOTO_IN_B1 = 1;MOTO_IN_B2 = 0;j = ;while (1) j-;if (!front_obj) goto EXIT;if (!left_obj)goto TURNLEFT;if (!back_obj)goto TURNRIGHT;if (j = 0)goto EXIT;TURNRIGHT:MOTO_IN_A1 = 1;MOTO_IN_A2 = 0;MOTO_IN_B1 = 0;MOTO_IN_B2 = 1;j = ;while (j) j-;if (!front_obj)goto EXIT;if (!back_obj)goto TURNRIGHT;if (!left_obj)goto TURNLEFT;EXIT:/*MOTO_IN_A1 = 0;MOTO_IN_A2 = 0;MOTO_IN_B1 = 0;MOTO_IN_B2 = 0;delay(5000);*/break;default:break; PCON |= 0x01。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值