/***********************************************************************
要求:? ? ? ? 首先由單片機發送"please input numner: ",在通過串口助手發送4
然后單片機接收后燈亮四秒;
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define??uint unsigned int
sbit??LED=P0^0;
void??Com_Init(void);
void? ?transmit(void);
void? ? receive_then_ring(void);
uchar idata trdate[]= "please input numner: " ;
uchar??IntCount=0;? ? ? ? ? ? ? ? // 宣告IntCount變數,計算T0中斷次數
uchar seconds=0;
main()
{
? ? ? ? Com_Init();
? ? while(1) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
? ? ? ? {
? ? ? ? ? ? ? ? while(1)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???//發送
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ???transmit();
? ? ? ? ? ? ? ???break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? while(1)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //接收
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ?? ?receive_then_ring();
? ? ? ? ? ? ? ?? ?ET0=1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???? ? ? ? //開T0中斷
? ? ? ? ? ? ? ?? ?break;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ???}
? ? ? ? ? ? ? ? while(1)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //響鈴
? ? ? ? ? ? ? ?? ? {? ? ? ?
? ? ? ? ? ? ? ?? ?? ?? ?TR1 = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???//關閉TIMER1
? ? ? ? ? ? ? ?? ? ? ? ? ?? ???TR0= 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???//啟動TIMER0 ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? while(1);
? ? ? ? ? ? ? ?? ? }? ? ? ?
? ? ? ? }
}
void timer0(void) interrupt 1? ? ? ? // T0中斷子程序開始
{? ? ? ? ? ? ? ?
? ? TH0=(65536-50000)/256;? ? ? ?
? ? ? ? TL0 =(65536-50000)%256;? ? ? ? ? ? ? ? ? ? ? ? // 設置T0計數量高8位元、低8位元
? ? ? ?? ?IntCount++;? ? ? ?
? ? ? ? if (IntCount==20)? ? ? ? ? ? ? ? ? ? ? ? // 若T0已中斷20次數,即一秒
? ? ? ? {? ? ? ? IntCount=0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 重新計次
? ? ? ? ? ? ? ? seconds++; ? ? ? ?
? ? ? ???if (seconds==5)
? ? ? ???{? ? ? ???LED=1;
? ? ? ? ? ? ? ???TR0= 0;? ? ? ?
? ? ? ?? ?}
? ? ? ? }
}
void??Com_InitT1(void)
{
? ? ? ???EA=1;? ? ? ? ? ? ? ? ? ? ? ?? ? //開總中斷EA=1
? ? ? ???ES=1;? ?? ?? ?? ?? ? //串行口中斷? ? ? ???
? ? ? ???ET1=1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???//開T1中斷
? ???TMOD = 0x21;? ? ? ? ? ? ? ? ? ? ? ? //將定時器1設置為Mode2以產生波特率;TO=mode1
? ???PCON = 0x00;? ? ? ? ? ? ? ? ? ? ? ???//SMOD為0
? ???SCON = 0xd8;? ? ? ? ? ? ? ? ? ? ? ?? ?//串行口設置為方式3
? ? ? ???TH0=(65536-50000)/256;? ? ? ?
? ? ? ???TL0=(65536-50000)%256;
? ???TH1 = 0xFd;? ? ? ? ? ? ? ? ? ? ? ???//波特率9600
? ???TL1 = 0xFd;
? ???TR1 = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???//啟動TIMER1
}
void??transmit(void)
{? ? ? ?? ?uchar *p;
? ? ? ?? ?p=trdate;
??while((*p)!='\0')? ? ? ?
? ? ? ? ? ? ? ???{
? ? ? ? ? ? ? ? ? ? ? ???SBUF=*p;
? ? ? ? ? ? ? ? ? ? ? ???while(TI==0);? ? ? ? ? ? ? ? ? ? ? ? //為發送完,等待
? ? ? ? ? ? ? ? ? ? ? ???TI=0;
? ? ? ? ? ? ? ? ? ? ? ???_nop_();
? ? ? ? ? ? ? ? ? ? ? ???++p;
? ? ? ? ? ? ? ???}
}
void? ?receive_then_ring(void)
{
? ? ? ?? ? uchar a;
? ? ? ?? ? while(RI==0);
? ? ? ?? ? RI=0;
? ? ? ?? ? a= SBUF;? ?? ? /*接收到的字節,立即發送出去*/
? ? ? ?? ???_nop_();
? ? ? ?? ? SBUF=a;
? ? ? ?? ? while(TI==0);
? ? ? ?? ? TI=0;
? ? ? ?? ? LED=0;
}
為什么定時器,串口收發都沒反應?程序沒錯的呀~~請高手指教
代碼.zip (24.56 KB)