找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2318|回复: 2
收起左侧

大家帮忙看一下这个串口通信用独立波特率发生器的程序有什么问题

[复制链接]
ID:327115 发表于 2018-11-13 18:51 | 显示全部楼层 |阅读模式
#include <STC12C5A.H>
#define uchar unsigned char
#define uint unsigned int
unsigned char a;//a用来存放串口接收到的数据(即模块识别后的返回值)

sbit LED=P2^0; //LED正极接5V;负极串联一个1K欧的电阻到单片机P0.0引脚

void Uart2Init()                //9600bps@11.0592MHz      
{
        AUXR |= 0x08;                //使能波特率倍速位S2SMOD:(波特率加倍)
        S2CON = 0x50;                //8位数据,可变波特率
        AUXR &= 0xFB;                //独立波特率发生器时钟为Fosc/12,即12T
        BRT = 0xFA;                  //设定独立波特率发生器重装值
        AUXR |= 0x10;                //启动独立波特率发生器
                IE2|=0X01;                                          //允许串口2中断
                //S2REN=1;                                         //允许串口接收
}

main()
{
        Uart2Init();
        while(1)
        {  
           if(a==0x01)//识别到人喊“开灯“,语音识别模块会从串口输出1(也就是十六进制0x01),判断如果是1的话,点亮LED灯。
           {                  //注意这个“1”是跟词条“开灯”的返回值“001”对应的,为了直观词条返回值是用十进制形式设置的,程序里面您用十进制判断也可以,数字前面不要“0x”即可。         
                   LED=0;
           }
           else if(a==0x02)//识别到人喊“关灯“,语音识别模块会从串口输出2(也就是十六进制0x02),判断如果是2的话,熄灭LED灯
           {                           //注意这个“2”是跟词条“关灯”的返回值“002”对应的,为了直观词条返回值是用十进制形式设置的,程序里面您用十进制判断也可以,数字前面不要“0x”即可。
                LED=1;     //P0.0=1,LED灭,注意:P0口没接上拉电阻是没有电压输出的,不要用万用表测,如果你想测电压,将P0改成P1吧。
           }
           else ;      
        }
}

void UART_2Interrupt(void) interrupt 8          //串口中断函数
{
     if(S2CON&S2RI)
         {
             S2CON&=~S2RI;                 //接收中断标志位标志
                 a=S2BUF;
         }
     if(S2CON&S2TI)
         {
           S2CON&=~S2TI;           //发送中断标志位清零
         }
}




12M晶振      波特率9600   


回复

使用道具 举报

ID:164602 发表于 2018-11-14 08:17 | 显示全部楼层
你的波特率设置是不是有问题啊?
我用STC-ISP下载软件的波特率计算功能得到的,和你的不一样啊。
1.jpg


void UartInit(void)                //9600bps@12.000MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
        TL1 = 0xC7;                //设定定时初值
        TH1 = 0xFE;                //设定定时初值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}



回复

使用道具 举报

ID:213173 发表于 2018-11-14 13:16 | 显示全部楼层
使用12M晶振波特率不易大于2400,加倍不易大于4800,否则误差太大。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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