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