定時器T1做波特率發生器,(12M晶體,4800波特率),定時器T0定時100um中斷,變量tjs加1,tjs 累計到1000時,用串口向PC 發送一個字符‘A’,tjs 累計到5000(0.5秒)時,P01反轉一次(即取反),同時tjs=0。
如何編寫正確的C 程序?
下面是我寫的,驗證失敗。
//定時器T1做波特率發生器,(12M晶體,4800波特率),定時器T0定時100um中斷,變量tjs加1,
//tjs 累計到1000時,用串口向PC 發送一個字符‘A’,tjs 累計到5000時,P01反轉一次(即取反)。
#include <stc89.h>
#define uchar unsigned char
#define uint unsigned int
uint tjs;
void init_time()//定時器模式初始化
{
EA=1; //開總中斷
TMOD=0x02;//設定時器0模式2定時 100um
TH0=TL0=155;//置定時器0初值,中斷后,TH0中的值重新裝入TL0,THO中值不變
TR0=0; //啟動定時器0
ET0=1; //允許T0中斷
SCON =0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |=0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
PCON |=0x80 ; //SMOD=1;
IE |=0x10; //串行口中斷 (IE |=0x10;)開啟 (IE &=0xEF;)關閉
TH1 =0xf3 ; //晶振=12MHz波特率4800
}
/////////////////////////////////////
void sendchar(uchar ch){
TR1=1; //啟動定時器1
ET1=1; //允許T1中斷
TI=0;
P05=0;
SBUF=ch;
while (TI==0); //為什么會卡在這里?( P05腳的發光管一直亮!)
TR1= 0 ; ////啟動定時器1
ET1=0; //不允許T1中斷
P05=1;
//
}
//////////////////////////////
void main(void){
init_time();//初始化定時器
TR0=1; //啟動定時器T0
while(1){
if(tjs==1000){sendchar('A');}
if(tjs==5000){P01=~P01; tjs=0;}
//if(tjs==5000)tjs=0;
} }
void t0_int(void) interrupt 1
{tjs++;}
while (TI==0); //為什么會卡在這里?( P05腳的發光管一直亮!)
向PC 只發送一次,然后就卡在這里死機了
t0做波特率發生器用的時候,不能開中斷。
由于你錯誤的開了中斷,所以就不能正確產生波特率。
所以就不能發送。
所以發送完成標志TI就不會改變,
所以就“卡”在那兒了。
謝謝你,我改用了T2,問題解決。
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |