上手了一塊STC8A8K64S4A12,STC公司推出的最新的單片機(jī),性能比51單片機(jī)要好非常多。詳細(xì)的芯片信息可以在官網(wǎng)搜到。
目前還沒使用到高級(jí)的功能,只使用了串口功能,上手感覺和51沒太大差別。邏輯一致,需要注意的是里面一些寄存器的配置,跟51有些區(qū)別,可以在stc-isp下載器那里查詢相關(guān)的程序,直接套用即可。
使用串口之前要先看看相關(guān)的寄存器配置,直接套用網(wǎng)上的例程可能會(huì)出錯(cuò)。我本次使用了兩個(gè)定時(shí)器,定時(shí)器1作為串口1的波特率發(fā)送器,另開定時(shí)器2作為計(jì)時(shí)使用。使用定時(shí)器要考慮寄存器的賦值問題,剛開始使用我在兩個(gè)定時(shí)器的初始化函數(shù)里面都對(duì)AUXR寄存器進(jìn)行了賦值,導(dǎo)致跑程序時(shí)AUXR的值在兩個(gè)初始化函數(shù)里面切來切去,整個(gè)功能都無法實(shí)現(xiàn)。
單片機(jī)源程序如下:
/***************************************************/
void UartInit(void) //9600bps@24.000MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位數(shù)據(jù),可變波特率
AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T
AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器
TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
TL1 = 0xB2; //設(shè)定定時(shí)初值
TH1 = 0xB2; //設(shè)定定時(shí)器重裝值
//ET1 = 0; //禁止定時(shí)器1中斷
EA = 1; //開總中斷
TR1 = 1; //啟動(dòng)定時(shí)器1
ES=1; //開串口中斷
SBUF='B'; //先往串口數(shù)據(jù)緩存器里面塞東西
}
注意里面AUXR寄存器的配置,搞清楚&=和|=的區(qū)別。
例如 0x40=0100 0000; AUXR|=0x40;就是保證第2位(上圖B6位)為1,而其他7位的數(shù)值不受影響;
0xFE=1111 1110;AUXR &= 0xFE; 就是確保最后一位(上圖B0)為0,其他7位的數(shù)值不受影響;
簡(jiǎn)單來說|=是為了把某個(gè)位 置1,而&=是為了把某個(gè)位 置0 ;
void usart_isr() interrupt 4 //串口1中斷服務(wù)函數(shù)
{
if(TI) //判斷發(fā)送
{
P22=!P22;
TI=0;
}
if(RI) //判斷接收
{
P55=!P55;
RI=0;
}
}
void Send_string(uint dat) //串口發(fā)送數(shù)據(jù)
{
SBUF=dat;
while(TI==0);
//while(!TI) //另一種方式
TI=0;
}
需要注意SBUF,這是51單片機(jī)的串口數(shù)據(jù)緩存器——兩個(gè)緩沖寄存器,一個(gè)是發(fā)送寄存器,一個(gè)是接收寄存器,在物理結(jié)構(gòu)上是完全獨(dú)立的,但地址是重疊的。
當(dāng)SBUF='a',說明往發(fā)送緩存器送了字符a,意味著發(fā)送。
當(dāng)b=SBUF,說明b變量被賦了SBUF里面的數(shù)值,意味著接收。
/********************************************/
void Timer5Init(void) //1毫秒@24.000MHz
{
AUXR |= 0x44; //定時(shí)器時(shí)鐘1T模式 當(dāng)時(shí)修改為0x44主要是怕對(duì)定時(shí)器1的配置造成干擾
//AUXR |= 0x04; //定時(shí)器時(shí)鐘1T模式 原版
T2L = 0x40; //設(shè)置定時(shí)初值
T2H = 0xA2; //設(shè)置定時(shí)初值
AUXR |= 0x10; //定時(shí)器2開始計(jì)時(shí)
IE2 = ET2; //使能定時(shí)器中斷
}
void TM2_Isr() interrupt 12 using 1
{
count_flag++;
if(count_flag==1000)
{
P24=!P24;
count_flag=0;
AUXINTIF &= ~T2IF; //清中斷標(biāo)志
}
}
以上兩個(gè)函數(shù)均從STC-ISP下載器里面的例程復(fù)制過來的。好資源要懂得利用。
要注意開啟定時(shí)器的計(jì)時(shí)功能,要開啟中斷;之前忘了加進(jìn)去了,查了一個(gè)晚上,還以為是寄存器干擾問題。經(jīng)大佬指點(diǎn)才知道忘開中斷了。************************************* IE2 = ET2; //使能定時(shí)器2中斷
當(dāng)多個(gè)函數(shù)共同使用到同一個(gè)寄存器時(shí),要注意賦值問題,否則會(huì)出現(xiàn)多次重置寄存器的情況,導(dǎo)致程序跑飛。所以官網(wǎng)數(shù)據(jù)手冊(cè)尤為重要,要清楚知道一個(gè)位的功能和作用
鏈接:游客,本帖隱藏的內(nèi)容需要積分高于 1 才可瀏覽,您當(dāng)前積分為 0
|