知识点: //PCA 寄存器内存单元分配 sfr CCON = 0xD8; //PCA 控制寄存器 sbit CCF0 = CCON^0;//PCA 模块0中断标志 sbit CR = CCON^6;//PCA 计数器计数允许位 sbit CF = CCON^7;//PCA 计数器溢出标志 sfr CMOD = 0xD9; //PCA 工作模式寄存器 sfr CL = 0xE9; //PCA 计数器低位 sfr CH = 0xF9; //PCA 计数器高位 sfr CCAPM0 = 0xDA; //PCA 模块0比较/捕获寄存器 sfr CCAP0L = 0xEA; //PCA 模块0比较/捕获寄存器低位字节 sfr CCAP0H = 0xFA; //PCA 模块0比较/捕获寄存器高位字节 sfr PCAPWM0 = 0xf2; //PCA PWM0寄存器 sfr AUXR = 0x8E; //PCA 辅助寄存器 PCA模块0输出PWM。要用作PWM,因不需要进中断处理,程序更为简单,关键是设置模式CCAPM0=0x42即可。 void Init_PWM()//初始化PWM模块,注意此时只到pwm0即P1.3 { CCON=0;//PCA停止计数,清零溢出标志和所有中断标志 CL=0;//PCA计数器低位清零 CH=0;//PCA计数器清高位清零 CMOD=0x04;//0x04:定时器时钟 CCAP0H=CCAP0L=236; //*PWM0 占空比控制舵机居中 CCAPM0=0x42;//0X42:8位PWM P1.3输出,无中断; CR=1; //PCA 计数器开始工作 } - 定时器0方式2作为PWM时钟源; 定时器1方式1作为红外传感器时钟源;
工作方式1 的编程要点: 1、THx/TLx赋初值:THx赋高8位,TLx赋低8位, 2、TMOD选方式: 写“M1,M0”=01 选方式1, 3、若不用门控位,直接用软件写TRx控制启/停,若使用门控位,先置位TRx,然后由INTx端的高/低电平来控制其启/停 。 4、若要允许中断,还须先置位ETx、EA等中断允许控制位,并编写中断服务程序, 若不用中断,可查询“计数溢出标志TFx”的方式工作,但溢出标志TFx须软件清0。 编程要点:TH0=TL0=184;//PWM 50Hz 20ms 11.0592M 184 工作方式2 的编程要点: 1、THx/TLx赋相同初值 2、在TLx计数达到0FFH 再加“1”时,TL0将溢出,进位位直接进入“TFx”去申请中断,同时打开三态门,使THx中的值自动重装(Copy)进TLx 3、TMOD寄存器选方式: 写“M1,M0” = 10选中方式2 4、其他用法与各种方式1完全相同 CCAPnH=256(1-占空比) 占空比=高电平时间/周期 0.5ms -90° 1ms -45° 1.5ms 0° 2ms 45° 2.5ms 90° 例如:舵机需输出角度为0°,高电平时间1.5ms, 则CCAPnH=CCAPnL=256 ×(1-1.5/20)=236.8 , 取236或者237 常用占空比设计 舵机居中:236 左45°:241 左27°:238 右45°:229 右27°:234 编程要点:CCAP0H=CCAP0L=相应占空比。 自行选择传感器个数,完成程序设计。
单片机源程序如下:
- #include <reg52.h>
- #include <math.h>
- (对所用到的传感器逐个位定义 方便程序中使用 例如sbit left=P1^0;)
- //PCA 寄存器内存单元分配
- sfr CCON = 0xD8; //PCA 控制寄存器
- sbit CCF0 = CCON^0;//PCA 模块0中断标志
- sbit CCF1 = CCON^1;//PCA 模块1中断标志
- sbit CR = CCON^6;//PCA 计数器计数允许位
- sbit CF = CCON^7;//PCA 计数器溢出标志
- sfr CMOD = 0xD9; //PCA 工作模式寄存器
- sfr CL = 0xE9; //PCA 计数器低位
- sfr CH = 0xF9; //PCA 计数器高位
- sfr CCAPM0 = 0xDA; //PCA 模块0比较/捕获寄存器
- sfr CCAP0L = 0xEA; //PCA 模块0比较/捕获寄存器低位字节
- sfr CCAP0H = 0xFA; //PCA 模块0比较/捕获寄存器高位字节
- sfr PCAPWM0 = 0xf2; //PCA PWM0寄存器
- sfr AUXR = 0x8E; //PCA 辅助寄存器
- //*****************************************************************************/
- //PWM初始化设置
- void Init_PWM()//初始化PWM模块,
- {
- CCON=0;//PCA停止计数,清零溢出标志和所有中断标志
- CL=0;//PCA计数器低位清零
- CH=0;//PCA计数器清高位清零
- CMOD=0x04;//时钟源 0X00:系统时钟/12,0X02:系统时钟/2,0x04:定时器时钟 0x08:系统时钟
- CCAP0H=CCAP0L=236; //*PWM0 占空比控制 0时占空比 100% 255占空比为0
- CCAPM0=0x42;//0X42:8位PWM P1.3输出,无中断;
- CR=1; //PCA 计数器开始工作
- }
- //定时器0初始化设置
- void Init_Timer0()
- {
- AUXR= 0x00;//定时器工作在12T模式
- TMOD = 0x12;//设置定时器0为8位自动重装模式
- TH0=TL0=184;//PWM 50Hz 20ms 11.0592M 18412M178 20M 126
- EA = 1;
- TR0 = 1;//打开定时器作为PWM时钟
- ET0 = 1;
- }
- //定时器1初始化设置
- void Init_Timer1()
- {
- TMOD=0x12;//定时器1工作方式1 (超声波)
- TH1=0x00;
- TL1=0x00;
- EA=1;
- TR1=1;
- ET1=1;
-
- }
- 这部分可编写相应的避障子程序,例如
- Void避障程序名 ()
- {
- 避障程序设计
- }
- void main()
- {
- Init_PWM();
- Init_Timer0();
- Init_Timer1();
- while(1)
- {
- 避障子程序调用
- }
- }
复制代码
完整的Word格式文档51黑下载地址:
无碳小车编程指导.docx
(47.07 KB, 下载次数: 16)
|