1.題目要求
為了使ADC的知識能配合其他模塊實現(xiàn)不同功能,這里我們打算通過扭動電位器(滑動變阻器)來控制舵機(jī)槳的位置,如果我們順時針扭一圈電位器,那么舵機(jī)槳也會跟著從一端旋轉(zhuǎn)到另一端。
2.main.c測試代碼
#include <reg52.h> #include <function.h>//詳見第六章第8講 #include <timer.h> //詳見第八章第11講 #include <lcd.h> //詳見第十一章第3講 #include <adc.h> //詳見第十四章 sbit PWMOUT=P1^7; //舵機(jī)信號線接口 u8 flag20ms = 0; u8 PWM_VAL = 0; void main() { u8 val; u8 str[10]; EA = 1; InitLcd1602(); //初始化液晶屏 TIM1_Init(20000,6); //定時20ms,6是微調(diào)使定時精度更高 TIM0_Init(100,9); //定時0.1ms,舵機(jī)專用,9是微調(diào)使定時精度更高 LcdShowStr(6, 0, "AIN0"); while (1) { if (flag20ms) //每隔20ms獲取一次ADC通道0的轉(zhuǎn)換值 { flag20ms = 0; val = GetADCValue(0); //獲取ADC通道0的轉(zhuǎn)換值 ValueToString(str, val); //轉(zhuǎn)為字符串格式的電壓值 LcdShowStr(6, 1, str); //顯示通道0的電壓 PWM_VAL=val/14+5; //此時PWM_VAL的取值范圍是5~23 } } } void TIM0_IRQHandler() interrupt 1 { static u8 pwm=0; TH0 = T0RH; //重新加載重載值 TL0 = T0RL; pwm++; if(pwm>=200)pwm=0; //pwm在0~199之間間隔0.1ms變化,周期為20ms if(pwm<PWM_VAL)PWMOUT=1; //PWM_VAL的值決定舵機(jī)槳的停留位置 else PWMOUT=0; } void TIM1_IRQHandler() interrupt 3 { TH1 = T1RH; //重新加載重載值 TL1 = T1RL; flag20ms = 1; }
我們把上一章測試AD,DA所拔下的跳線帽插回去先。開發(fā)板底部中間處有一個電位器,大家用一字螺絲刀來旋轉(zhuǎn)電位器就可以觀察到舵機(jī)槳跟著旋轉(zhuǎn)了。此外舵機(jī)的電源供電最好使用外部電源,用開發(fā)板來給舵機(jī)供電會導(dǎo)致液晶屏失壓閃爍,而且舵機(jī)的穩(wěn)定性也不是很好,筆者測試的時候是使用另外的5V電源電壓給舵機(jī)供電,連接圖如下
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程