標(biāo)題: 52單片機(jī)串口發(fā)送 [打印本頁(yè)]

作者: 刺客刺心    時(shí)間: 2018-7-18 12:22
標(biāo)題: 52單片機(jī)串口發(fā)送
/*-----------------------------------------------
  名稱:串口通信
  編寫(xiě):LZM
  日期:2015.05
  修改:無(wú)
  內(nèi)容:連接好串口波特率設(shè)置為9600,無(wú)奇偶校驗(yàn)
        晶振11.0592MHz
                接上串口,可以接收到自己發(fā)送的字符
------------------------------------------------*/

#include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義                        

/*******************************************************************
請(qǐng)?zhí)崆坝?jì)算一下所選晶振能達(dá)到的最高速度,波特率不能超過(guò)最高速度
(1) 波特率加倍(SMOD=1):  Max_Baud = FOSC/12/16
(2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32
例如:22.1184MHz晶振,波特率加倍時(shí),最大波特率=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 來(lái)自單片機(jī)!\r\n";
code const char str2[] = "Author: louis \r\n";
//const  限定一個(gè)變量不允許被改變。在一定程度上提高程序安全性和可靠性
//code 存儲(chǔ)區(qū)間為 程序存儲(chǔ)區(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ā)送"中斷來(lái)了就直接抹掉
    if(RI)
   {
     RI = 0;        //串口中斷標(biāo)志不能自己清除,需要手動(dòng)清除
     RX_Data=SBUF;
     SendOneByte(RX_Data);
   }
   else
     TI = 0;                //串口發(fā)中斷是發(fā)送完緩沖區(qū)數(shù)據(jù)之后產(chǎn)生
}

/****************串口初始化函數(shù)*************/
void InitUART(void)
{
    TMOD = 0x20;    //定時(shí)器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;                        //打開(kāi)中斷
}
/**************串口發(fā)送字符串函數(shù)*************/
void SendrStr(const uint8 *ptr)
{
    do
    {
        SendOneByte(*ptr);                //其實(shí)發(fā)送字符串也是在調(diào)用發(fā)送字符的函數(shù)~~
    }while(*ptr++!='\0');        //要有結(jié)束判斷,否則串口發(fā)送 字符串 不知道什么時(shí)候停止
}







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1