Visual Studio Code + SDCC开发51单片机 3 - UART

以STC89C52RC平台为例。STC89C52RC只有1个UART口,P3.0对应RXD,P3.1对应TXD。

1. 时钟

MCU外部晶体时钟为11.05926MHz.

#define FOSC                            11059200L

 对于STC89C52来说,MCU可以是6T或者12T(51内核默认时钟分频)

#define CLKDIV                          6

2. 波特率

UART的波特率是通过T1或者T2得到的。

2.1 定时器/计数器T1

2.1.1 设置T1的工作模式为8位自动重装载模式。

TMOD &= 0x0F;
TMOD |= 0x20;           //Set Timer1 as 8-bit auto reload mode        

 2.1.2 根据波特率设置重装载值

TH1 = TL1 = -(FOSC / CLKDIV / 32 / baudrate); //Set auto-reload vaule

即采用T1作为波特率发生器时,最大的波特率时FOSC / CLKDIV / 32,对于FOSC=11.05926M,CLKDIV = 6时,最大波特率为57600;而CLKDIV=12时,最大波特率为28800。

2.1.3 波特率翻倍设置

PCON的位7 SMOD是波特率选择位,默认为0,即波特率不翻倍,当设置为1时,波特率翻倍。对于FOSC=11.05926M,CLKDIV = 6时,最大波特率变为115200;而CLKDIV=12时,最大波特率为57600。

PCON |= 0x80; 	        //速率加倍

2.1.4 使能T1

TR1 = 1;                //Timer1 start run

2.1.5 完整的初始化代码

一般情况下波特率不会选择太低的(例如110,300,600之类的),所以默认波特率翻倍。

TMOD &= 0x0F;
TMOD |= 0x20;           //Set Timer1 as 8-bit auto reload mode   
PCON |= 0x80; 	        //速率加倍       
TH1 = TL1 = -(FOSC / CLKDIV / 16 / baudrate); //Set auto-reload vaule
TR1 = 1;                //Timer1 start run

2.2 定时器/计数器T2

2.2.1 根据波特率设置重装载值

T2是16位自动重装。

TL2 = RCAP2L = (65536 - (FOSC / (32 / (12 / CLKDIV)) / baudrate)); //Set auto-reload vaule
TH2 = RCAP2H = (65536 - (FOSC / (32 / (12 / CLKDIV)) / baudrate)) >> 8;

RCAP2L和RCAP2H保存的就是自动重载值。

PCON的位7对T2无效,测试最大波特率230400。

2.2.2 配置T2

T2CON = 0x34;           //Timer2 start run

RCLK和TCLK为0(默认)时,波特率发生器选择T1,而设置为1时选择T2。TR2 = 1启动T2。

3. 校验方式

校验是第9位实现,有5种形式的校验。

typedef enum eUartParity
{
    UART_PARITY_NONE = 0,
    UART_PARITY_EVEN,
    UART_PARITY_ODD,
    UART_PARITY_MARK,
    UART_PARITY_SPACE,
}uartparity_e;

UART_PARITY_NONE --- 无校验,此时UART工作在8位模式

UART_PARITY_EVEN --- 偶校验,数据有偶个逻辑高位

UART_PARITY_ODD --- 奇校验,数据有奇个逻辑高位

UART_PARITY_MARK --- 高位校验,第9位一直为逻辑高

UART_PARITY_SAPCE --- 低位校验,第9位一直为逻辑低

设置UART的控制寄存器

 SM0和SM1组合设置UART工作模式,

 方式1对应NONE情况,而方式3对应其他校验方式。

switch(parity)
{
    case UART_PARITY_NONE:
    default:
        SCON = 0x50;            //8bit variable UART, parity is none.
        break;
    case UART_PARITY_EVEN:
    case UART_PARITY_ODD:
    case UART_PARITY_MARK:
        SCON = 0xda;            //9-bit variable UART, parity bit initial to 1
        break;
    case UART_PARITY_SPACE:
        SCON = 0xd2;            //9-bit variable UART, parity bit initial to 0
        break;
}

4. 使能中断

ES = 1;                 //Enable UART interrupt
EA = 1;                 //Open master interrupt switch

5. UART中断处理

UART的中断号为4,一般只需要处理接收中断。RI = 1表示接收中断,SBUF中是接收到的数据。

void uartIsr() interrupt 4
{
    if (RI)
    {
        RI = 0;             //Clear receive interrupt flag
        gUart0RecvBuf[gUartRecvIn++] = SBUF;
        gUartRecvIn %= sizeof(gUart0RecvBuf);
    }
    else
    {
        TI = 0;             //Clear transmit interrupt flag
    }  
}

 注意,对于SDCC来说,中断函数必须要在main函数所在文件内有申明。

6. UART发送

如果用到了奇偶校验,则先把数据赋值给ACC,MCU会自动将奇偶校验结果放在PSW的P位(bit  0)。

ACC = *buf;
#if(UART_PARITY_EN == 1)
if(gUartParity == UART_PARITY_EVEN)
{
    TB8 = P;
}
else if(gUartParity == UART_PARITY_ODD)
{
    TB8 = ~P;
}
#endif
ES = 0;
SBUF = ACC;
while(TI = 0);		//等待发送完毕
TI = 0;			//清TI中断
ES = 1;			//打开中断

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Visual Studio Code中进行SDCC开发51单片机,可以按照以下步骤进行操作: 1. 首先,确保你已经安装了Visual Studio Code编辑器。你可以从官方网站上下载并安装它。 2. 打开Visual Studio Code,并在应用商店中搜索并安装EIDE扩展。这个扩展提供了对51单片机开发的支持和工具链。 3. 安装完EIDE扩展后,你可以打开一个新的项目或文件夹,在其中进行开发。你可以创建一个新的文件,编写SDCC的代码,并保存为.c格式。 4. 接下来,你需要配置EIDE扩展以支持SDCC工具链。你可以在Visual Studio Code的设置中找到扩展的配置选项,并添加SDCC的安装路径。这样EIDE扩展就能够调用SDCC编译器来编译你的代码。 5. 编写完成后,你可以使用EIDE扩展提供的命令进行编译和烧录。这个扩展还提供了调试功能,可以帮助你在Visual Studio Code中进行单片机代码的调试。 6. 如果你需要在Visual Studio Code中使用简体中文界面,你可以在应用商店中搜索并安装"Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code"扩展。 总结起来,通过安装Visual Studio Code编辑器,然后在应用商店中搜索并安装EIDE扩展,你就可以在Visual Studio Code中进行SDCC开发51单片机。通过配置扩展和编写代码,你可以使用SDCC工具链进行编译、烧录和调试操作。如果需要中文界面,可以安装相应的语言包扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值