/*-----------------------------------------------
名稱:串口通信
編寫:LZM
日期:2015.05
修改:無
內(nèi)容:連接好串口波特率設(shè)置為9600,無奇偶校驗
晶振11.0592MHz
接上串口,可以接收到自己發(fā)送的字符
------------------------------------------------*/
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
/*******************************************************************
請?zhí)崆坝嬎阋幌滤x晶振能達到的最高速度,波特率不能超過最高速度
(1) 波特率加倍(SMOD=1): Max_Baud = FOSC/12/16
(2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32
例如:22.1184MHz晶振,波特率加倍時,最大波特率=22118400/12/16=115200
*******************************************************************/
#define FOSC 11059200 //振蕩頻率
#define BAUD 9600 //波特率
#define SMOD 1 //是否波特率加倍
#if SMOD
#define TC_VAL (256-FOSC/16/12/BAUD)
#else
#define TC_VAL (256-FOSC/32/12/BAUD)
#endif
typedef unsigned char uint8;
typedef unsigned int uint16;
code const char str1[] = "The string is 來自單片機!\r\n";
code const char str2[] = "Author: louis \r\n";
//const 限定一個變量不允許被改變。在一定程度上提高程序安全性和可靠性
//code 存儲區(qū)間為 程序存儲區(qū)
/***************函數(shù)聲明*******************/
void InitUART(void);
void SendOneByte(uint8);
void SendrStr(const uint8 *ptr);
/****************主函數(shù)********************/
void main(void)
{
uint8 i=0;
InitUART();
while(str2[i]!='\0')
{
SendOneByte(str2[i++]);
}
SendrStr(str1);
while(1);
}
/****************中斷服務(wù)函數(shù)***************/
void UART_ISR(void) interrupt 4
{
uint8 RX_Data;
//只響應(yīng)"接收"中斷,"發(fā)送"中斷來了就直接抹掉
if(RI)
{
RI = 0; //串口中斷標志不能自己清除,需要手動清除
RX_Data=SBUF;
SendOneByte(RX_Data);
}
else
TI = 0; //串口發(fā)中斷是發(fā)送完緩沖區(qū)數(shù)據(jù)之后產(chǎn)生
}
/****************串口初始化函數(shù)*************/
void InitUART(void)
{
TMOD = 0x20; //定時器1,模式2工作模式
SCON = 0x50; //串口工作模式1,允許REN /* SCON: 模式 1, 8-bit UART, 使能接收 */
TH1 = TC_VAL;
TL1 = TH1;
PCON = 0x80; //發(fā)送速率加倍
ES = 1;
EA = 1;
TR1 = 1;
}
/**************串口發(fā)送字符函數(shù)*************/
void SendOneByte(uint8 c)
{
ES = 0; //禁止中斷,讓串口安心工作啊
SBUF = c;
while(!TI); //等待發(fā)送完畢
TI = 0; //清TI中斷
ES = 1; //打開中斷
}
/**************串口發(fā)送字符串函數(shù)*************/
void SendrStr(const uint8 *ptr)
{
do
{
SendOneByte(*ptr); //其實發(fā)送字符串也是在調(diào)用發(fā)送字符的函數(shù)~~
}while(*ptr++!='\0'); //要有結(jié)束判斷,否則串口發(fā)送 字符串 不知道什么時候停止
}
|