|
/*-----------------------------------------------
名稱:串口通信
內(nèi)容:連接好串口或者usb轉(zhuǎn)串口至電腦,下載該程序,打開(kāi)電源
打開(kāi)串口調(diào)試程序,將波特率設(shè)置為9600,無(wú)奇偶校驗(yàn)
晶振11.0592MHz,發(fā)送和接收使用的格式相同,如都使用
字符型格式,按復(fù)位重啟程序,可以看到接收到 UART test, 請(qǐng)?jiān)诎l(fā)送區(qū)輸入任意信
然后在發(fā)送區(qū)發(fā)送任意信息,接收區(qū)返回同樣信息,表明串口收發(fā)無(wú)誤
------------------------------------------------*/
#include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
u8 xdata buf[10]={1,2,3,4,5,6,7,8,9,0xA};
u8 code buf1[10]={1,2,3,4,5,6,7,8,9,0xA};
sbit k1=P1^4;
sfr P4 =0Xe8;
sbit P4_0 = P4^0;
unsigned char Temp[];
u8 flag;
u8 i ;
bit ready=0;
j=0x00;
unsigned char gotData[9];
u8 jscos,jk;
/*------------------------------------------------
函數(shù)聲明
------------------------------------------------*/
void SendStr(unsigned char *s);
void Send_data();
void delaynms(unsigned int di) //延時(shí)
{
unsigned int da,db;
for(da=0;da<di;da++)
for(db=0;db<10;db++);
}
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
// // TMOD: timer 1, mode 2, 8-bit 重裝
TMOD |= 0x21; //T1方式2、T0方式1
TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz
TL1 = 0xfd; //波特率
TR1 = 1; // TR1: timer 1 打開(kāi)
IE |= 0x92; //開(kāi)啟中斷
EA = 1; //打開(kāi)總中斷
ES = 1; //打開(kāi)串口中斷
}
void Init_Timer1(void)
{
TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響
TH1=(65535-20000)/256;
TL1=(65535-20000)%256;
EA=1; //總中斷打開(kāi)
ET1=1; //定時(shí)器中斷打開(kāi)
TR1=1; //定時(shí)器開(kāi)關(guān)打開(kāi)
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
EA=1; //總中斷打開(kāi)
ET0=1; //定時(shí)器中斷打開(kāi)
TR0=1; //定時(shí)器開(kāi)關(guān)打開(kāi)
}
/*------------------------------------------------
主函數(shù)
------------------------------------------------*/
void main (void)
{
u8 i;
InitUART();
Init_Timer0();
//SendStr("UART test,請(qǐng)?jiān)诎l(fā)送區(qū)輸入任意信息");
Init_Timer1();
//打開(kāi)串口中斷
while (1)
{
if( flag)
{
for(i=0;i<9;i++)
{
SBUF= gotData[ i];
while(!TI);TI=0;
}
if(gotData[0]==0xFF)
{
// P4_0=!P4_0;
jk=1;
}
flag=0;
}
if(jscos==1)
{
Send_data();
jscos=0;
}
}
}
void Send_data()
{ u8 l;
for(l=0;l<10;l++)
{
SBUF=buf1[l];
while(!TI);
TI = 0;
}
}
/*------------------------------------------------
發(fā)送一個(gè)字節(jié)
------------------------------------------------*/
void SendByte(unsigned char buf1)
{
SBUF = buf1;
while(!TI);
TI = 0;
}
/*------------------------------------------------
發(fā)送一個(gè)字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串結(jié)束標(biāo)志,通過(guò)檢測(cè)是否字符串末尾
{
SendByte(s);
s++;
}
}
void timer0(void) interrupt 1
{
static u16 count;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
// TR0 = 0; //關(guān)閉T0
j = i; //暫存接收到的數(shù)據(jù)幀長(zhǎng)度
i = 0x00; //長(zhǎng)度清零
ready = 1; //置位接收完成標(biāo)志
if (count >500&&jk==1)
{
// LED = ~LED;
// P4_0=!P4_0; count = 0;
jscos=1;
}
count ++;
}
void timer1(void) interrupt 3
{
static u16 count;
TH1=(65535-20000)/256;
TL1=(65535-20000)%256;
// TR0 = 0; //關(guān)閉T0
j = i; //暫存接收到的數(shù)據(jù)幀長(zhǎng)度
i = 0x00; //長(zhǎng)度清零
ready = 1; //置位接收完成標(biāo)志
//
if(count>15000)
{
count=0; P4_0=!P4_0;
}
count++;
}
/* void Timer0_isr(void) interrupt 1 using 1
{
TH0=0x00; //重新賦值
TL0=0x00;
LED=~LED; //指示燈反相,可以看到閃爍
} */
/*------------------------------------------------
串口中斷程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中斷服務(wù)程序
{
//定義臨時(shí)變量
if(RI) //判斷是接收中斷產(chǎn)生
{
RI = 0; //清零接收中斷標(biāo)志位
TH0 = 0xf8;
TL0 = 0x2f; //2ms定時(shí)
TR0 = 1; //開(kāi)啟T0
gotData[i++] = SBUF; //讀取收到的字節(jié)
}
if(i==9)
{
i=0;
flag=1;
}
}
|
|