每过一天,我就会发现学习的难度越来越大,越来越蒙,可能是没基础学起来会很吃力。。。资料越来越来有限,像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捕获高字节
- 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模块捕获寄存器高字节
- 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--);
- }
- }