每過一天,我就會發(fā)現學習的難度越來越大,越來越蒙,可能是沒基礎學起來會很吃力。。。資料越來越來有限,像AVR吧,本來就不會,加上關于內部PWM的資料又找不到。。。。。哎-。-怎么搞的。。。。今天沒進展啊。不過還是要打起精神,別逼我下載整套AVR來看 -。
- /**A/D轉換測試程序(ADC查詢方式)**/
- #include <reg51.h>
- #include <intrins.h>
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- /*Declare SFR associated with the ADC */
- sfr ADC_CONTR = 0xBC; //ADC control register
- //ADC控制寄存器
- sfr ADC_RES = 0xBD; //ADC high 8-bit result register
- //ADC的高8位結果寄存器
- sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
- //ADC的低2位結果寄存器
- sfr P1ASF = 0x9D; //P1 secondary function control register
- //P1的輔助功能控制寄存器
- /*Define ADC operation const for ADC_CONTR*/ //定義常量ADC_CONTR ADC操作
- #define ADC_POWER 0x80 //ADC power control bit
- //ADC的功率控制位
- #define ADC_FLAG 0x10 //ADC complete flag
- //ADC的完成標志
- #define ADC_START 0x08 //ADC start control bit
- //ADC啟動控制位
- #define ADC_SPEEDLL 0x00 //540 clocks //540時鐘
- #define ADC_SPEEDL 0x20 //360 clocks //360時鐘
- #define ADC_SPEEDH 0x40 //180 clocks //180時鐘
- #define ADC_SPEEDHH 0x60 //90 clocks //90時鐘
- /*Declare SFR associated with the PCA */ //SFR與PCA的相關聲明
- sfr CCON = 0xD8; //PCA control register //PCA的控制寄存器
- sbit CCF0 = CCON^0; //PCA module-0 interrupt flag //PCA模塊0中斷標志位
- sbit CCF1 = CCON^1; //PCA module-1 interrupt flag //PCA模塊1中斷標志
- sbit CR = CCON^6; //PCA timer run control bit //PCA定時器的運行控制位
- sbit CF = CCON^7; //PCA timer overflow flag //PCA定時器溢出標志
- sfr CMOD = 0xD9; //PCA mode register //PCA的模式寄存器
- sfr CL = 0xE9; //PCA base timer LOW //PCA的基礎定時器的低位
- sfr CH = 0xF9; //PCA base timer HIGH //PCA的基礎定時器的高位
- sfr CCAPM0 = 0xDA; //PCA module-0 mode register //PCA模塊- 0模式寄存器
- sfr CCAP0L = 0xEA; //PCA module-0 capture register LOW //PCA模塊0捕獲寄存器低
- sfr CCAP0H = 0xFA; //PCA module-0 capture register HIGH //PCA模塊0捕獲高字節(jié)
- sfr CCAPM1 = 0xDB; //PCA module- mode register //PCA模塊模式寄存器
- sfr CCAP1L = 0xEB; //PCA module- capture register LOW //PCA模塊捕獲寄存器的低
- sfr CCAP1H = 0xFB; //PCA module- capture register HIGH //PCA模塊捕獲寄存器高字節(jié)
- sfr PCAPWM0 = 0xf2;
- sfr PCAPWM1 = 0xf3;
- void PWMInit(void);
- void InitADC(void);
- void allinit(void);
- void AD_get(void);
- void control(void);
- void yk(void);
- void Delay(WORD n);
- BYTE GetADCResult(BYTE ch);
- sbit p25=P2^5;
- sbit p26=P2^6;
- sbit a1=P2^0; //電機a,b的方向控制
- sbit a2=P2^1;
- sbit b1=P2^2;
- sbit b2=P2^3;
- sbit p30=P3^0;
- sbit p33=P3^1;
- sbit p32=P3^2;
- sbit p31=P3^3;
- sbit beep=P2^7;
- WORD AD_hei=0x7f; //AD比較值
- WORD AD_value[5]; //AD采集值存儲數組
- BYTE pwma=0x00; //電機a,pwm控制
- BYTE pwmb=0x00; //電機b,pwm控制
- void main()
- {
- allinit();
- P3=0xff;
- while (1)
- {
- AD_get();
- control();
- yk();
- }
- }
- /*********************************************/
- void yk(void)
- {
- if(p30==1||p32==1||p33==1)
- { BYTE i=1;
- beep=0;
- Delay(10);
- beep=1;
- while(i)
- {
- if(p30==1) //前進
- {
- if(p30==1)
- {
- a1=1;
- a2=0;
- b1=1;
- b2=0;
- pwma=0x00,pwmb=0x00;
- CCAP0H = CCAP0L =pwma;
- CCAP1H = CCAP1L =pwmb;
-
- }
- }
- if(p30==1) //前進
- {
- if(p30==1)
- {
- a1=1;
- a2=0;
- b1=1;
- b2=0;
- pwma=0x00,pwmb=0x00;
- CCAP0H = CCAP0L =pwma;
- CCAP1H = CCAP1L =pwmb;
-
- }
- }
- if(p31==1) //后退
- {
- if(p31==1)
- {
- a1=0;
- a2=1;
- b1=0;
- b2=1;
- pwma=0x00,pwmb=0x00;
- CCAP0H = CCAP0L =pwma;
- CCAP1H = CCAP1L =pwmb;
-
- }
- }
- if(p32==1) //前左轉
- {
- if(p32==1)
- {
- pwma=0x80,pwmb=0x00;
- CCAP0H = CCAP0L =pwma;
- CCAP1H = CCAP1L =pwmb;
- }
- }
- if(p33==1) //前右轉
- {
- if(p33==1)
- {
- pwma=0x00,pwmb=0x80;
- CCAP0H = CCAP0L =pwma;
- CCAP1H = CCAP1L =pwmb;
- }
- }
- if(p31==1) //推出按鍵控制模式
- { Delay(250);
- if(p31==1)
- i=0;
- }
- if(p30==1) //停止
- {
- Delay(230);
- if(p30==1)
- pwma=0xff,pwmb=0xff;
- CCAP0H = CCAP0L =pwma;
- CCAP1H = CCAP1L =pwmb;
- }while(p30==1);
-
- }
- pwma=0xff,pwmb=0xff;
- CCAP0H = CCAP0L =pwma;
- CCAP1H = CCAP1L =pwmb;
- beep=0;
- Delay(10);
- beep=1;
- Delay(190);
- a1=1;
- a2=0;
- b1=1;
- b2=0;
-
- }
- }
- /********************AD采集**********************/
- void AD_get(void)
- {
- AD_value[0]=GetADCResult(0xc8); //Show Channel0 //顯示通道0
- AD_value[1]=GetADCResult(0xc9); //Show Channel1 //顯示通道1
- AD_value[2]=GetADCResult(0xca); //Show Channel2 //顯示通道2
- AD_value[3]=GetADCResult(0xcd); //Show Channel3 //顯示通道3
- AD_value[4]=GetADCResult(0xce); //Show Channel4 //顯示通道4
- }
-
- /*----------------------------
- Get ADC result //獲取ADC結果
- ----------------------------*/
- BYTE GetADCResult(BYTE ch)
- {
- ADC_CONTR =ch;
- _nop_(); //Must wait before inquiry
- //必須等待調查
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG)); //Wait complete flag
- //等待完成標志
- ADC_CONTR &= ~ADC_FLAG; //Close ADC
- //關閉的ADC
- return ADC_RES; //Return ADC result
- //返回ADC結果
- }
- /***************電機控制***********************/
- void control(void)
- {
- unsigned char turn_flag[5];
- if( AD_value[0]>=AD_hei) //通道0采集值與預置數比較
- turn_flag[0]=1; //產生標志位,LED做指示
- else turn_flag[0]=0;
-
- if( AD_value[1]>=AD_hei) //通道1采集值與預置數比較
- turn_flag[1]=1;
- else {turn_flag[1]=0;
-
- if( AD_value[2]>=AD_hei) //通道2采集值與預置數比較
- turn_flag[2]=1;
- else turn_flag[2]=0;
-
- if(AD_value[3]>=AD_hei) //通道5采集值與預置數比較
- turn_flag[3]=1;
- else turn_flag[3]=0;
-
- if(AD_value[4]>=AD_hei) //通道6采集值與預置數比較
- turn_flag[4]=1;
- else turn_flag[4]=0;}
- if(turn_flag[4]==1)
- if(turn_flag[0]==0)
- if(turn_flag[1]==0)
- if(turn_flag[2]==0)
- if(turn_flag[3]==0)
- pwma=0x00,pwmb=0x00;
- if(turn_flag[0]==0)
- if(turn_flag[1]==0)
- if(turn_flag[2]==0)
- if(turn_flag[3]==0)
- if(turn_flag[4]==0)
- pwma=0x00,pwmb=0x00;
- if(turn_flag[0]==1) pwma=0x00,pwmb=0xff;
- if(turn_flag[1]==1) pwma=0x00,pwmb=0xff;
- if(turn_flag[2]==1) pwma=0xff,pwmb=0x00;
- if(turn_flag[3]==1) pwma=0xff,pwmb=0x00;
- if(turn_flag[0]==1)
- if(turn_flag[4]==1)
- pwma=0x00,pwmb=0x80;
- if(turn_flag[2]==1)
- if(turn_flag[4]==1)
- pwma=0x80,pwmb=0x00;
- if(turn_flag[1]==1)
- if(turn_flag[3]==1)
- pwma=0xff,pwmb=0xff;
- CCAP0H = CCAP0L =pwma;
- CCAP1H = CCAP1L =pwmb;
- }
- /****************所有的初始化**************/
- void allinit()
- {
- p26=1;
- P0=0x00;
- p26=0;
- p25=1;
- a1=1;
- a2=0;
- b1=1;
- b2=0;
- beep=1;
- PWMInit();
- InitADC(); //Init ADC sfr //初始化的ADC的SFR
- }
- /*****************pwm口初始化***********************/
- void PWMInit(void)
- {
- CCON=0; //Initial PCA control register //初始PCA的控制寄存器
- //PCA timer stop running //PCA定時器停止運行
- //Clear CF flag //清除CF標志
- //Clear all module interrupt flag //清除所有模塊的中斷標志
- CL=0; //Reset PCA base timer //復位PCA的基定時器
- CH = 0;
- CMOD = 0x02; //Set PCA timer clock source as Fosc/2 //設置為fosc的PCA定時器/ 2的時鐘源
- //Disable PCA timer overflow interrupt //禁止PCA定時器溢出中斷
- CCAP0H = CCAP0L =pwma; //PWM0 port output 50% duty cycle square wave//PWM0的端口輸出50%占空比的方波
- CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode //PCA模塊0的工作在8位PWM模式
- //and no PCA interrupt //并沒有PCA中斷
- CCAP1H = CCAP1L =pwmb; //PWM1 port output 0% duty cycle square wave//PWM1的端口輸出0%占空比的方波
- // PCAPWM1 = 0x03;
- CCAPM1 = 0x42; //PCA module- work in 8-bit PWM mode //PCA模塊,工作在8位PWM模式
- //and no PCA interrupt //并沒有PCA中斷
- CR =1; //PCA timer start run //PCA定時器開始運行
- }
- /*----------------------------
- Initial ADC sfr //初步的ADC的SFR
- ----------------------------*/
- void InitADC()
- {
- P1ASF = 0x67; //Open 8 channels ADC function
- //打開8通道ADC功能
- ADC_RES = 0; //Clear previous result
- //清除以前的結果
- ADC_CONTR = 0xc0;
- Delay(2); //ADC power-on and delay
- //ADC的功耗和延遲
- }
-
- /*----------------------------
- Software delay function //軟件延時功能
- ----------------------------*/
- void Delay(WORD n)
- {
- WORD x;
- while (n--)
- {
- x = 5000;
- while (x--);
- }
- }
復制代碼
|