登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] UART串口通信

[复制链接]
发表于 2021-2-7 00:30:20 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 单片机
开始时间: 2021-02-06
结束时间: 2021-02-07
电开开发板的UART模块串口通信程序

关键是在配置串口波特率上

按照计算方法应该写:TH1 = 256 - (32768000/12/32)/baud;


实际上(32768000/12/32)/baud 这一部分的值为8.888888  8循环的一个数


由于baud是整数 所以最后 TH1 = 256 - 8;


所以少减去了0.888888个机器周期


实测这样的误差影响很大,接收值百分百不正确


所以直接TH1 = 255 - (32768000/12/32)/baud;


这时候还是有一点误差,实测是不影响的


代码如下:
#include <STC12C5A60S2.H>

sbit ENLED = P1^1;

unsigned char code LedChar[] = {  
   0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
   0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};

unsigned char LedBuff[7] = {
   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};

unsigned char T0RH = 0;
unsigned char T0RL = 0;
unsigned char RxdByte = 0;


void ConfigTimer0(unsigned int ms);
void ConfigUART(unsigned int baud);
void main()
{
        EA = 1;
        ENLED = 0;
        AUXR = 0x80;
        ConfigTimer0(1);
        ConfigUART(9600);
       
        while(1)
        {
                LedBuff[5] = LedChar[RxdByte & 0x0F];
                LedBuff[4] = LedChar[RxdByte >> 4];
        }
}

void ConfigTimer0(unsigned int ms)
{
        unsigned long tmp;
       
        tmp = 32768000/1;
        tmp = (tmp * ms)/1000;
        tmp = 65536 - tmp;
        T0RH = (unsigned char)(tmp>>8);
        T0RL = (unsigned char)tmp;
        TMOD &= 0xF0;
        TMOD |= 0x01;
        TH0 = T0RH;
        TL0 = T0RL;
        ET0 = 1;
        TR0 = 1;
       
}


void ConfigUART(unsigned int baud)
{
        SCON = 0x50;
        TMOD &= 0x0F;
        TMOD |= 0x20;
        TH1 = 255 - (32768000/12/32)/baud;
        TL1 = TH1;
        ET1 = 0;
        ES = 1;
        TR1 = 1;
       
}

void LedScan()
{
        static unsigned char i = 0;
       
        P0 = 0xFF;
        P2 = (P2 & 0xF8)|i;
        P0 = LedBuff;
        if(i<6)
                i++;
        else
                i = 0;
}

void InterruptTimer0() interrupt 1
{
        TH0 = T0RH;
        TL0 = T0RL;
        LedScan();
}

void InterruptUART() interrupt 4
{
        if(RI)
        {
                RI = 0;
                RxdByte = SBUF;
                SBUF = RxdByte;
        }
        if(TI)
        {
                TI = 0;
        }
}

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表