源程序:
#include #include #define uint unsigned int #define uchar unsigned char #define Left OCR1A #define Right OCR1B #define ADD 1.15; //宏定义,加速系数 uchar i; uchar flag; //是否减速标志位 uchar TCRT5000_IN; uint Max_Speed; uchar Min_Speed; /************************************************* 函数名称:Init_TCRT5000 函数功能:初始化红外传感器TCRT5000 函数说明:设置PA口为输入,监测传感器信号*********/ void Init_TCRT5000() { DDRA = 0X00; PORTA = 0XFF; } /************************************************* 函数名称:Max() 函数功能:判断最大速度 函数说明:判断最大速度,将其值放入Max_Speed中*****/ void Max() { if(Left >= Right) { Max_Speed = Left * ADD; } else { Max_Speed = Right * ADD; } if(Max_Speed >= 0xf7) { Max_Speed = 0xf7; } Min_Speed = 0x20 ; } /************************************************* 函数名称:Scan_TCRT5000 函数功能:TCRT5000进行扫描,返回跑到信息 函数说明:*********/ void Scan_TCRT5000() { TCRT5000_IN = PINA&0x1F; switch(TCRT5000_IN) { /* OOOOO *///全灭 case 0x00: break; /* ***** *///全亮 case 0x1f: OCR1A=0x00; OCR1B=0x00; break; /* O*OOO */ case 0x08: OCR1A=Min_Speed; OCR1B=Max_Speed; break; /* *OOOO */ case 0x10: OCR1A=Min_Speed; OCR1B=Max_Speed; break; /* O**OO */ case 0x0c: OCR1A=Min_Speed; OCR1B=Max_Speed; break; /* **OOO */ case 0x18: OCR1A=Min_Speed; OCR1B=Max_Speed; break; /* ***00*/ case 0x1c: OCR1A=Min_Speed; OCR1B=Max_Speed; break; /* OOO*O */ case 0x02: OCR1A=Max_Speed; OCR1B=Min_Speed; break; /* OOOO* */ case 0x01: OCR1A=Max_Speed; OCR1B=Min_Speed; break; /* OO**O */ case 0x06: OCR1A=Max_Speed; OCR1B=Min_Speed; break; /* OOO** */ case 0x03: OCR1A=Max_Speed; OCR1B=Min_Speed; break; /* OO*** */ case 0x07: OCR1A=Max_Speed; OCR1B=Min_Speed; break; default: break; } } /************************************************* 函数名称:Init_Speed 函数功能:定时器1初始化,产生两路PWM信号 函数说明:通过改变全局变Left,Right控制小车速度**/ void Init_Speed() { DDRD |= 0X30; TCCR1A=0xA1; TCCR1B=0x0A; OCR1A=0xa0; OCR1B=0xa0; } /********************************************** 函数名称:Stop 函数功能:小车停止 函数说明:Right=0,Left=0*********************/ void Stop() { OCR1A=0x00; OCR1B=0x00; } /********************************************** 函数名称:Init_Timer0 函数功能:初始化定时器0 函数说明:初始化定时器0 设1024分频 100ms触发一次中断,速度加1**********/ void Init_Timer0() { TCCR0 = 0x05; TCNT0 = 0x00; TIMSK |= BIT(2); SREG |= BIT(7); } void main() { uchar speed; TCRT5000_IN = PINA&0x1F; Init_Speed(); Init_TCRT5000(); Init_Timer0(); while(1) { TCRT5000_IN = PINA&0x1F; while(TCRT5000_IN != 0x04) { SREG &= ~BIT(7); //关闭中断 Scan_TCRT5000(); TCRT5000_IN = PINA&0x1F; flag = 1; } while(TCRT5000_IN == 0x04) { if(flag == 1) { Left = 0xb0; Right = 0xb0; flag =0; SREG |= BIT(7); //打开中断 } TCRT5000_IN = PINA&0x1F; } } } /*定时器0中断函数*/ #pragma interrupt_handler Timer0:10 void Timer0() { TCNT0 = 0x00; i++; if(i == 100) { i=0; Left++; if(Left >= 0xfe) { Left = 0xfe; } OCR1B++; if(OCR1B >= 0xfe) { OCR1B = 0xfe; } Max(); } }
上一篇:一款高性能avr单片机频率计程序 10khz
下一篇:使用excel制作的AVR寄存器配置助手---轻松搞定AVR
推荐阅读最新更新时间:2024-11-06 16:19
设计资源 培训 开发板 精华推荐
- MC34072DR2G 二阶低通有源滤波器的典型应用
- SY89221U,SY89221 时钟缓冲器评估板
- 低成本单芯片移动电源充电宝电路设计
- EVAL-ADF7020-1DBZ7,ADF7020-1 ISM 频段收发器评估板
- LTC6990IDCB#TRMPBF 全范围 VCO 振荡器的典型应用,具有任何 NDIV 设置(fMAX 至 fMIN,VIN = 0V 至 VSET)
- LT8570IDD 1.2MHz 升压转换器的典型应用从 9V-16V 输入产生 48V
- 仪器模拟放大
- LT6656ACDC-2.5、2.5V 扩展电源范围电压基准的典型应用
- 【训练营】dogdogdog
- V2-EVAL,用于 FT4232H USB 至 UART 桥接器的 Vinculum II 评估板