標(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下載軟件的波特率計算功能得到的,和你的不一樣啊。
1.jpg
(35.99 KB, 下載次數(shù): 31)
下載附件
2018-11-14 08:15 上傳
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