标题:
注释很详细的单片机模块化智能循迹小车代码
[打印本页]
作者:
小啊诚
时间:
2021-10-7 15:57
标题:
注释很详细的单片机模块化智能循迹小车代码
/****************************************************************************
*File name: main.c
*Description:在第一个十字路口打开闸道
timer0:
timer1:
timer2: uart2/4
timer3: uart3
timer4: 1ms 时钟滴答
****************************************************************************/
/*引入头文件*/
#include <STC8.H>
#include "car_control.h"
#include "pwm_pca.h"
#include "delay.h"
#include "ir.h"
#include "hc-sr04.h"
#include "uart.h"
#include "timer.h"
#include "disp.h"
#include "user_string.h"
#include "intrins.h"
#include "color.h"
#define KEY4 P54
signed char temperature = 0; // 温度
signed char humidity = 0; // 湿度
signed long encode_count_chA = 0; // 通道A编码器计数值
signed long encode_count_chB = 0; // 通道B编码器计数值
unsigned char at_com_type = 0; // AT指令读数据状态
extern unsigned short R_data,G_data,B_data;
/****************************************************************************
* 名 称:main
* 功 能:程序入口
* 入口参数:无
* 出口参数:无
* 说 明:无
* 调用方法:无
****************************************************************************/
void main()
{
unsigned char t_10s = 10;
unsigned int dat=0;
unsigned char pre_tick = 0;
xdata unsigned char u4_txBuf[20];
P1M0 = 0xC0;
P1M1 = 0x0;
// P54口设为输入口
P5M0 &= ~0x10;
P5M1 |= 0x10;
uart4_init();
uart3_init();
uart2_init();
EA = 1; /* 开总中断 */
car_init(); /* 小车初始化 */
HC_SR04_Init(); /*超声波初始化*/
delay_ms(100);
MOTOR_GO_EN;
delay_ms(10);
// disp_number(temperature);
disp_number(distance); // 数码管显示距离
uart4_tx_idle = 10;
uart4_send_array("AT+EON\r\n", sizeof("AT+EON\r\n")); // 控制指令不返回OK
delay_ms(10);
uart4_tx_idle = 10;
Timer4Init();
tick = 0;
//Color_Init();//开启颜色检测
// 使能串口2/3接收状态
uart2_restart_rx();
uart3_restart_rx();
while(1)
{
if (pre_tick != tick)
{ // 每1ms刷新一次数码管
pre_tick = tick;
disp_isr_call();
if (carWorking.delay != 0) // 特殊任务计时
carWorking.delay--;
if (trafficLight_opevmv.tick != 0) // 摄像头计时
trafficLight_opevmv.tick--;
else
trafficLight_opevmv.light = 0;
}
if (tick >= 100)
{
tick = 0;
/*//disp_number(G_data);
u4_txBuf[0] = 'E';
u4_txBuf[1] = 'S';
u4_txBuf[2] = 'P';
u4_txBuf[3] = 1;
u4_txBuf[4] = 9;
u4_txBuf[5] = 6;
u4_txBuf[6] = R_data >> 8;
u4_txBuf[7] = R_data;
u4_txBuf[8] = G_data >> 8;
u4_txBuf[9] = G_data;
u4_txBuf[10] = B_data >> 8;
u4_txBuf[11] = B_data;
u4_txBuf[12] = 0xF8 + u4_txBuf[6] + u4_txBuf[7] + u4_txBuf[8] + u4_txBuf[9] + u4_txBuf[10] + u4_txBuf[11];
u4_txBuf[13] = 'E';
u4_txBuf[14] = 'N';
u4_txBuf[15] = 'D';
uart4_send_array(u4_txBuf, 16);*/
/*if (R_data >= G_data){
disp_number(R_data - G_data);
}
else{
disp_number(G_data - R_data);
disp_number_1(10);
}*/
dat = HC_SR04_Read();//读取超声波距离 每100ms测量一次
if(dat != -1)//距离采集成功
{
distance = dat;
disp_number(distance);
}
t_10s--;
if (t_10s == 0)
{
t_10s = 100;
uart4_send_array("AT+TEMPERATURE?\r\n", 17);
// 重新开始接收数据
uart4_restart_rx();
at_com_type = 1; // AT指令读数据类型 1温度 2湿度 3编码器计数值 4速度 5电池电量
}
}
if (uart4_rx_idle == 3)
{ // 驱动板接收数据解析
unsigned char rx_len = 100 - uart4_buf.r_free;
if (rx_len > 6)
{
// if (uart4_rx_buf[0] == '+')
{
unsigned char st;
switch (at_com_type)
{
case 1: // 温度
{
st = user_array_seek(uart4_rx_buf, rx_len, "+TEMPERATURE:", 13);
if (st != 0xFF)
{
signed long buf;
if (user_str_DECnumStr2num(uart4_rx_buf + st + 15, &buf) != 0)
{
temperature = buf;
// disp_number(temperature);
}
}
break;
}
case 2: // 湿度
{
st = user_array_seek(uart4_rx_buf, rx_len, "+HUMIDITY:", 10);
if (st != 0xFF)
{
signed long buf;
if (user_str_DECnumStr2num(uart4_rx_buf + st + 12, &buf) != 0)
{
humidity = buf;
//disp_number(humidity);
}
}
break;
}
case 3: // 编码器
{
st = user_array_seek(uart4_rx_buf, rx_len, "+MTENCODER:", 11);
if (st != 0xFF)
{
signed long buf;
register unsigned char len = user_str_DECnumStr2num(uart4_rx_buf + st + 13, &buf);
if (len != 0)
{ // <channel A>
encode_count_chA = buf;
st = len + st + 1;
len = user_str_DECnumStr2num(uart4_rx_buf + st + 13, &buf);
if (len != 0)
{ // <channel B>
encode_count_chB = buf;
}
}
}
break;
}
case 4: // 速度
{ // 需用户自行完善
st = user_array_seek(uart4_rx_buf, rx_len, "+MTRPM:", 6);
if (st != 0xFF)
{ // <channel A>,<channel B> 转/分钟
signed long buf;
register unsigned char len = user_str_DECnumStr2num(uart4_rx_buf + st + 8, &buf);
if (len != 0)
{ // <channel A>
}
}
break;
}
case 5: // 电池电量
{ // 需用户自行完善
st = user_array_seek(uart4_rx_buf, rx_len, "+BATTERY:", 8);
if (st != 0xFF)
{ // <电压>,<电流>,<剩余电量>,<节数>,<已消耗电量>
signed long buf;
register unsigned char len = user_str_DECnumStr2num(uart4_rx_buf + st + 10, &buf);
if (len != 0)
{ // <电压>
}
}
break;
}
case 6: // 报警状态
{ // 需用户自行编写
break;
}
}
at_com_type = 0;
}
}
if (rx_len != 0)
{ // 重新开始接收数据
uart4_restart_rx();
}
}
else if (uart4_rx_idle >= 50)
{
uart4_rx_idle = 5;
if (at_com_type != 0)
{
at_com_type = 0;
}
}
if((distance<300) && //距离小于300mm 如果有路障重新规划路线,则建议将此部分屏蔽掉
(carWorking.type == 0)) // 非特殊任务时,才执行
{
MOTOR_GO_STOP;//停车
}
else
{
car_FollowLine();//循迹
}
if (uart3_rx_idle == 5)
{ // lora通信测试
unsigned char len = 100 - uart3_buf.r_free;
if ((len >= 6) && (uart3_rx_buf[4] + 6 <= len))
{ // 红绿灯命令解析,用户可根据实际情况进行修改
if (uart3_rx_buf[5] == 'r')
disp_number_1(1);
else if (uart3_rx_buf[5] == 'g')
disp_number_1(0);
else if (uart3_rx_buf[5] == 'y')
disp_number_1(2);
disp_number_2(0);
disp_number_3(uart3_rx_buf[7] / 10);
disp_number_4(uart3_rx_buf[7] % 10);
uart3_restart_rx();
}
}
if (uart2_rx_idle == 5)
{ // 摄像头通信测试
unsigned char len = 100 - uart2_buf.r_free;
if (len > 17)
{ // 摄像头检测到红绿灯时,发送以下字符串
// "traffic light is red"
// "traffic light is green"
// "traffic light is yellow"
if (user_str_cmp(uart2_rx_buf, "traffic light is ") >= 17)
{ //
if (uart2_rx_buf[17] == 'r')
{ // "red"
trafficLight_opevmv.light = 'r';
//disp_number_1(1);
}
else if (uart2_rx_buf[17] == 'g')
{ // "green"
trafficLight_opevmv.light = 'g';
//disp_number_1(3);
}
else if (uart2_rx_buf[17] == 'y')
{ // "yellow"
trafficLight_opevmv.light = 'y';
//disp_number_1(2);
}
trafficLight_opevmv.tick = 250;
}
uart2_restart_rx();
}
else
uart2_restart_rx();
}
}
}
复制代码
Keil代码工程:
小车综合任务-源码.rar
(157.88 KB, 下载次数: 16)
2021-10-7 15:56 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1