|
用電位器經(jīng)過(guò)單片機(jī)片內(nèi)AD再由定時(shí)器產(chǎn)生PWM控制舵機(jī)角度- /*****************************************************
- 穩(wěn)定的電位器控制舵機(jī)程序在多功能實(shí)驗(yàn)板通過(guò)驗(yàn)證
- 沒(méi)用單片機(jī)片內(nèi)PWM
- 功能 :用電位器通過(guò)單片機(jī)片內(nèi)AD再經(jīng)過(guò)定時(shí)器產(chǎn)生
- PWM信號(hào)控制舵機(jī)角度,
- 舵機(jī)角度隨電位器旋轉(zhuǎn)同步轉(zhuǎn)動(dòng).
- 1602顯示2路AD采集電壓值
- 單片機(jī):STC12C5A60S2
- 晶振 :11.0592M
- 作者 :蘇義江
- 時(shí)間 :2016-6-5
- 注 釋; 單片機(jī)電壓由7805穩(wěn)壓供給。舵機(jī)電壓由7806穩(wěn)壓供給,
-
- ******************************************************/
- #include<stc12c5a60s2.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- /*Define ADC operation const for ADC_CONTR*/
- #define ADC_POWER 0x80 //ADC power control bit
- #define ADC_FLAG 0x10 //ADC complete flag 模數(shù)轉(zhuǎn)換結(jié)束標(biāo)志位
- #define ADC_START 0x08 //ADC start control bit 模數(shù)轉(zhuǎn)換啟動(dòng)控制位
- //轉(zhuǎn)換速度控制位SPEED0和SPEED1,共四種狀態(tài),對(duì)應(yīng)四種轉(zhuǎn)換速度
- #define ADC_SPEEDLL 0x00 //540 clocks
- #define ADC_SPEEDL 0x20 //360 clocks
- #define ADC_SPEEDH 0x40 //180 clocks
- #define ADC_SPEEDHH 0x60 //90 clocks
- sbit rs=P2^7;
- sbit rw=P2^6; //已接地
- sbit lcden=P2^5;
- sbit pwm=P1^3; //第一路舵機(jī)
- sbit pwm1=P1^4;//第二路舵機(jī)
-
- uint temp,bai,shi,ge;
- uint ADtemp,ADtemp1; //定義全局變量
- uint high,low;
- static uint count1;
- void write_com(uchar);
- void write_data(uchar);
- void delay(uint x) //簡(jiǎn)單延時(shí)
- {
- uint a,b;
- for(a=x;a>0;a--)
- for(b=400;b>0;b--);
- }
- //AD初始化
- void InitADC()
- {
- P1ASF = 0x03; //設(shè)置P1,0.P1,1口為AD口
- ADC_RES = 0;
- //清除結(jié)果寄存器
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
- delay(2); //ADC上電并延時(shí)
- }
- /*********************************
- 讀取第幾路ADC結(jié)果
- ***********************************/
- uint GetADCResult(uchar ch)
- {
- int V;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
- _nop_(); //等待4個(gè)NOP
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成
- ADC_CONTR &= ~ADC_FLAG; //Close ADC
- V=ADC_RES;
- return V;
- }
- void display(float ver) //液晶顯示 第一路AD
- {
- temp=(int)ver;
- bai=temp/100+0x30;
- shi=temp%100/10+0x30;
- ge=temp%10+0x30;
- write_com(0x87) ;
- write_data(bai);
- write_data('.');
- write_data(shi);
- write_data(ge);
- }
- void display1(float ver) //液晶顯示 第二路AD
- {
- temp=(int)ver;
- bai=temp/100+0x30;
- shi=temp%100/10+0x30;
- ge=temp%10+0x30;
- write_com(0x80+0x47) ;
- write_data(bai);
- write_data('.');
- write_data(shi);
- write_data(ge);
- }
- void write_com(uchar com) //寫(xiě)指令
- {
-
- rs=0;
- rw=0;
- lcden=0;
- P0=com;
- delay(10);
- lcden=1;
- delay(10);
- lcden=0;
- }
- void write_data(uchar date) //寫(xiě)數(shù)據(jù)
- {
-
- rs=1;
- rw=0;
- lcden=0;
- P0=date;
- delay(10);
- lcden=1;
- delay(10);
- lcden=0;
- }
- void LCD_init() //液晶顯示初始化
- {
- write_com(0x38);
- _nop_();
- write_com(0x06);
- _nop_();
- write_com(0x01);
- _nop_();
- write_com(0x0c);
- _nop_();
- write_com(0x83) ;
- write_data('V');
- write_data('1');
- write_data('=');
- write_com(0x80+0X43) ;
- write_data('V');
- write_data('2');
- write_data('=');
- }
- void pwm_init_t0() //PWM波初始化
- {
- TMOD |=0x01;
- //定時(shí)器設(shè)置 0.1ms in 11.0592M crystal
- TH0=(65536-78)/256;
- TL0=(65536-78)%256; //定時(shí)0.1mS
- ET0=1;//定時(shí)器中斷打開(kāi)
- EA=1;//總中斷
- TR0=1; //啟動(dòng)定時(shí)器0
- }
- void main() //主函數(shù)
- {
- uint angle,angle1;
- pwm_init_t0(); //PWM波初始化
- LCD_init();
- InitADC();
- ADtemp=GetADCResult(0);
- high=65075-7.2*ADtemp;
- low=47563+7.2*ADtemp;
- ADtemp1=GetADCResult(1);
- high=65075-7.2*ADtemp1;
- // ( high=65035-7.8*ADtemp;12MHz)
- //(65535-(460+7.2*ADtemp 11.0592MHz)
- low=47563+7.2*ADtemp1;
- // ( low=46035+7.8*ADtemp; )
- //( 65535-(17972-7.2*ADtemp 11.0592MHz )
-
-
- while(1)
- { angle=ADtemp*1.8;
- angle1=ADtemp1*1.8;
- ADtemp=GetADCResult(0);
- high=65075-7.2*ADtemp;
- low=47563+7.2*ADtemp;
- ADtemp1=GetADCResult(1);
- high=65075-7.2*ADtemp1;
- low=47563+7.2*ADtemp1;
- display(angle);
- display1(angle1);
- }
- }
- void time0() interrupt 1 //定時(shí)器T1
- {
- static uchar count;
-
- if (!count)
- {
- pwm = 1; //第一路給高電平
- pwm1= 1; //第二路給高電平
- TH0=high/256;
- TL0=high%256; //定時(shí)0.05mS,經(jīng)過(guò)示波器的測(cè)量
- }
- else
- {
- pwm =0 ; //第一路給低電平
- pwm1=0; //第二路給低電平
- TH0=low/256;
- TL0=low%256; //定時(shí)0.05mS,經(jīng)過(guò)示波器的測(cè)量
- }
- count=~count;
-
- }
復(fù)制代碼
|
|