標(biāo)題: 大家?guī)兔匆幌逻@個串口通信用獨立波特率發(fā)生器的程序有什么問題 [打印本頁]

作者: 老新手98    時間: 2018-11-13 18:51
標(biāo)題: 大家?guī)兔匆幌逻@個串口通信用獨立波特率發(fā)生器的程序有什么問題
#include <STC12C5A.H>
#define uchar unsigned char
#define uint unsigned int
unsigned char a;//a用來存放串口接收到的數(shù)據(jù)(即模塊識別后的返回值)

sbit LED=P2^0; //LED正極接5V;負(fù)極串聯(lián)一個1K歐的電阻到單片機(jī)P0.0引腳

void Uart2Init()                //9600bps@11.0592MHz      
{
        AUXR |= 0x08;                //使能波特率倍速位S2SMOD:(波特率加倍)
        S2CON = 0x50;                //8位數(shù)據(jù),可變波特率
        AUXR &= 0xFB;                //獨立波特率發(fā)生器時鐘為Fosc/12,即12T
        BRT = 0xFA;                  //設(shè)定獨立波特率發(fā)生器重裝值
        AUXR |= 0x10;                //啟動獨立波特率發(fā)生器
                IE2|=0X01;                                          //允許串口2中斷
                //S2REN=1;                                         //允許串口接收
}

main()
{
        Uart2Init();
        while(1)
        {  
           if(a==0x01)//識別到人喊“開燈“,語音識別模塊會從串口輸出1(也就是十六進(jìn)制0x01),判斷如果是1的話,點亮LED燈。
           {                  //注意這個“1”是跟詞條“開燈”的返回值“001”對應(yīng)的,為了直觀詞條返回值是用十進(jìn)制形式設(shè)置的,程序里面您用十進(jìn)制判斷也可以,數(shù)字前面不要“0x”即可。         
                   LED=0;
           }
           else if(a==0x02)//識別到人喊“關(guān)燈“,語音識別模塊會從串口輸出2(也就是十六進(jìn)制0x02),判斷如果是2的話,熄滅LED燈
           {                           //注意這個“2”是跟詞條“關(guān)燈”的返回值“002”對應(yīng)的,為了直觀詞條返回值是用十進(jìn)制形式設(shè)置的,程序里面您用十進(jìn)制判斷也可以,數(shù)字前面不要“0x”即可。
                LED=1;     //P0.0=1,LED滅,注意:P0口沒接上拉電阻是沒有電壓輸出的,不要用萬用表測,如果你想測電壓,將P0改成P1吧。
           }
           else ;      
        }
}

void UART_2Interrupt(void) interrupt 8          //串口中斷函數(shù)
{
     if(S2CON&S2RI)
         {
             S2CON&=~S2RI;                 //接收中斷標(biāo)志位標(biāo)志
                 a=S2BUF;
         }
     if(S2CON&S2TI)
         {
           S2CON&=~S2TI;           //發(fā)送中斷標(biāo)志位清零
         }
}




12M晶振      波特率9600   



作者: HC6800-ES-V2.0    時間: 2018-11-14 08:17
你的波特率設(shè)置是不是有問題?
我用STC-ISP下載軟件的波特率計算功能得到的,和你的不一樣啊。



void UartInit(void)                //9600bps@12.000MHz
{
        SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        AUXR |= 0x40;                //定時器1時鐘為Fosc,即1T
        AUXR &= 0xFE;                //串口1選擇定時器1為波特率發(fā)生器
        TMOD &= 0x0F;                //設(shè)定定時器1為16位自動重裝方式
        TL1 = 0xC7;                //設(shè)定定時初值
        TH1 = 0xFE;                //設(shè)定定時初值
        ET1 = 0;                //禁止定時器1中斷
        TR1 = 1;                //啟動定時器1
}




作者: wulin    時間: 2018-11-14 13:16
使用12M晶振波特率不易大于2400,加倍不易大于4800,否則誤差太大。




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