最近買了一個(gè)51單片機(jī)最小系統(tǒng)板葛作,準(zhǔn)備學(xué)習(xí)單片機(jī)腕柜。
最小系統(tǒng)板:只是一塊板子济似,相當(dāng)于電腦主板,如果想要通電盏缤,需要插芯片砰蠢。
于是買了一個(gè)stc89c52rc芯片,對著b站江協(xié)科技的教程開始學(xué)唉铜。(只不過教程里的芯片不一樣台舱,用keil編程的時(shí)候選at89c51RC2)
晶振:11.0592MHz。11.0592MHz除12為921600Hz潭流,就是一秒921600次機(jī)器周期竞惋,10ms=9216次機(jī)器周期。
機(jī)器周期可以掌管計(jì)數(shù)器和中斷灰嫉,比如下面是讓led燈每1秒切換一次狀態(tài)的代碼:
#include <at89c51RC2.h>
#include <intrins.h>
#define TIMER_VALUE 65536-46080
static unsigned int cnt = 0;
void Timer0_ISR() interrupt 1
{
TF0 = 0;
TH0 = (unsigned char)(TIMER_VALUE >> 8);
TL0 = (unsigned char)(TIMER_VALUE & 0xff);
cnt ++;
if (cnt >= 20) {
cnt = 0;
P2_0 = ~P2_0;
}
}
void main()
{
TMOD = 0x01;
TH0 = (unsigned char)(TIMER_VALUE >> 8);
TL0 = (unsigned char)(TIMER_VALUE & 0xff);
ET0 = 1;
TR0 = 1;
EA = 1;
while (1)
{
}
}
舵機(jī)
180度舵機(jī)的控制需要MCU產(chǎn)生一個(gè)20ms的脈沖信號拆宛,以0.5ms到2.5ms的高電平來控制舵機(jī)的角度。0.5ms 0度讼撒;1.0ms 45度浑厚;1.5ms 90度;2.0ms 135度根盒;2.5ms 180度钳幅。
360度舵機(jī)只能控制轉(zhuǎn)速和轉(zhuǎn)向,不能控制角度炎滞。0.5ms 正向最大轉(zhuǎn)速贡这;1.5ms 速度為0;2.5ms 反向最大轉(zhuǎn)速厂榛。
不過其實(shí)0.5毫秒是無法整除9216對應(yīng)的10毫秒的,所以只能近似了丽惭。比如下面是一段產(chǎn)生1ms高電平的20ms的pwm:
#include <at89c51RC2.h>
#include <intrins.h>
void Timer0_ISR() interrupt 1
{
TF0 = 0;
if (P2_3) {
P2_3 = ~P2_3;
TH0 = (unsigned char)((65536-18432+922) >> 8);
TL0 = (unsigned char)((65536-18432+922) & 0xff);
}
else {
P2_3 = ~P2_3;
TH0 = (unsigned char)((65536-922) >> 8);
TL0 = (unsigned char)((65536-922) & 0xff);
}
}
void main()
{
TMOD = 0x01;
P2_3 = 0;
TH0 = (unsigned char)((65536-18432+922) >> 8);
TL0 = (unsigned char)((65536-18432+922) & 0xff);
ET0 = 1;
TR0 = 1;
EA = 1;
while (1)
{
}
}
輸入
輸入暫時(shí)沒搞明白硬件層面的原理击奶。
串口
串口其實(shí)就是協(xié)議。