知識點: //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)
2018-6-8 09:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|