專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

C51單片機(jī)串口通信

作者:huqin   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月13日   【字體:

1、在使用串口之前,應(yīng)對(duì)其進(jìn)行初始化,步驟如下:
(1)定時(shí)器1工作模式,設(shè)置TMOD寄存器
(2)裝載TH1,TL1,決定波特率的值
(3)啟動(dòng)定時(shí)器1
(4)串口工作模式設(shè)置,SCON
(5)如需中斷,開總中斷,開串行中斷

 

2、如需奇偶校驗(yàn):
偶校驗(yàn):就是發(fā)送的8個(gè)數(shù)據(jù)位的1的個(gè)數(shù)為偶數(shù)時(shí),TB8=0;為奇數(shù)時(shí),TB8=1;
奇校驗(yàn):與偶校驗(yàn)相反的TB8。

用軟件產(chǎn)生奇偶校驗(yàn)位是根據(jù)51系列單片機(jī)的狀態(tài)寄存器PSW的定義:當(dāng)累加器ACC中為1的個(gè)數(shù)為奇數(shù)時(shí),P=1,否則P=0。

 

3、程序(采用偶校驗(yàn))
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar rcvd_num;
bit chk_error;
bit rcvd_ok;
void init(void);
void main(void)
{
    init();
    while(1)
    {
        if(rcvd_ok)
        {
            rcvd_ok=0;
            ES=0;
            if(chk_error)
            {
                ACC='e';
                TB8=P;
                SBUF='e';
                while(!TI);
                TI=0;               
            }
            else
            {
                P0=rcvd_num;
                ACC='c';
                TB8=P;
                SBUF='c';
                while(!TI);
                TI=0;
            }
            ES=1;
        }
     
}
void init(void)
{
    TMOD=0x20;  //定時(shí)器1工作模式2
    TH1=0xfd; //初值裝載,波特率9600
    TL1=0xfd;
    SCON=0x50;  //串口工作模式3
    EA=1;       //開總中斷
    ES=1;       //開串行中斷
    TR1=1;      //啟動(dòng)定時(shí)器1
}
void serial() interrupt 4
{
    rcvd_num=SBUF;
    ACC=rcvd_num;       //將數(shù)據(jù)送入累加器中算出1奇偶個(gè)數(shù),奇數(shù)時(shí)P為1,偶數(shù)時(shí)P為0;
    if(RB8==P)chk_error=0; //1奇偶個(gè)數(shù)與發(fā)送的相同,則數(shù)據(jù)無錯(cuò)
    else chk_error=1;
    RI=0;
    rcvd_ok=1;      //接收完成標(biāo)志位 
}

 

關(guān)閉窗口

相關(guān)文章