像芥末堆做內(nèi)容的網(wǎng)站百度上怎么發(fā)布作品
一、功能實(shí)現(xiàn)
1.電腦通過串口發(fā)送數(shù)據(jù):0F
2.點(diǎn)亮4個LED
二、注意事項(xiàng)
1.發(fā)送和接受數(shù)據(jù)的文本模式
2.串口要對應(yīng)
3.注意串口的波特率要和程序中的波特率保持一致
4.有無校驗(yàn)位和停止位
三、如何使用串口波特率計(jì)算器
1.以本程序?yàn)槔?/h3>
2.生成代碼如下
void Uart1_Init(void) //9600bps@11.0592MHz
{SCON = 0x50; //8位數(shù)據(jù),可變波特率AUXR |= 0x40; //定時器時鐘1T模式AUXR &= 0xFE; //串口1選擇定時器1為波特率發(fā)生器TMOD &= 0x0F; //設(shè)置定時器模式TL1 = 0xE0; //設(shè)置定時初始值TH1 = 0xFE; //設(shè)置定時初始值ET1 = 0; //禁止定時器中斷TR1 = 1; //定時器1開始計(jì)時
}
3.需要手動配置中斷系統(tǒng)
根據(jù)原理圖
配置代碼
//手動配置中斷系統(tǒng)ES=1;EA=1;PS=0;
四、如何理解軟件生成的波特率
void UART_Init()
{//由軟件自動生成SCON=0x50; //STC89C52操作手冊P235方式1PCON &= 0x7F; //波特率不倍速TMOD &= 0x0F; //設(shè)置定時器1模式TMOD |= 0x20; //設(shè)置定時器1模式TL1 = 0xFA; //設(shè)置定時初始值TH1 = 0xFA; //設(shè)置定時重載值ET1 = 0; //禁止定時器中斷TR1 = 1; //定時器1開始計(jì)時//需要手動配置中斷系統(tǒng)ES=1;EA=1;PS=0;
}
以上述代碼為例子進(jìn)行分析
? ? 由于配置是8位自動重載,TL1=TH1=0xFA?,0xFA=250;
? ? 總計(jì)八位,那么數(shù)據(jù)范圍0~255(256溢出)
?? ?256-250=6
? ? 那么每計(jì)6個數(shù)溢出一次
? ? 晶體振蕩器的輸出經(jīng)12 分頻后得到輸入的時鐘脈沖
? ? 一個機(jī)器周期內(nèi)有12 個振蕩周期。故其頻率為晶振頻率的1/12。
? ? 此設(shè)備是11.0592M 的晶振,1.085μs為一個輸入脈沖的時間
?? ?則6.51μs溢出一次
?? ?1/6.51,則0.1536098MHz就是定時器的溢出率
?? ?再看PCON=0111 1111
?? ?可知SMOD=0(參考串口模式圖)
?? ?那么波特率=0.1536098MHz ? /2 ?/16
?? ?波特率為0.00480030625MHz約等于4800Hz
?? ?約等于沒有誤差
串口模式圖
五、如何計(jì)算波特率
參考STC89C52手冊P235
六、串口中斷函數(shù)
中斷函數(shù)(函數(shù)可自由命名,但是要加上中斷號"interrupt 4")
void UART_Routine(void) interrupt 4
{if (TI==1) //檢測串口1發(fā)送中斷{//功能......TI = 0; //清除串口1發(fā)送中斷請求位}if (RI==1) //檢測串口1接收中斷{//功能......RI = 0; //清除串口1接收中斷請求位}
}
中斷函數(shù)查詢表P166
七、模塊化代碼:
1.main.c
#include <REGX52.H>
#include "UART.h"unsigned char Sec=0;void main()
{UART_Init();while(1){}}/*** @brief 中斷函數(shù)查詢P166,函數(shù)命名可自由,但是要更上中斷號"interrupt 4"* @param 無* @retval 無*/
void UART_Routine(void) interrupt 4
{if(RI==1){P2=~SBUF;RI=0;}
}
2.UART.c
#include <REGX52.H>/*** @brief 串口初始化//4800bps@11.0592MHz* @param 無* @retval 無*/void UART_Init()
{SCON=0x50; //STC89C52操作手冊P235方式1PCON &= 0x7F; //波特率不倍速TMOD &= 0x0F; //設(shè)置定時器1模式TMOD |= 0x20; //設(shè)置定時器1模式TL1 = 0xFA; //設(shè)置定時初始值TH1 = 0xFA; //設(shè)置定時重載值ET1 = 0; //禁止定時器中斷TR1 = 1; //定時器1開始計(jì)時//補(bǔ)上中斷系統(tǒng)ES=1;EA=1;PS=0;
}/*** @brief 串口發(fā)送一個字節(jié)的數(shù)據(jù)* @param Byte 要發(fā)送的一個字節(jié)數(shù)據(jù)* @retval 無*/void UART_SendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0); //TI=0,數(shù)據(jù)完整發(fā)送出去,TI=1,跳出循環(huán)TI=0; //TI=0,使用軟件復(fù)位}
3.UART.h
#ifndef __UART_H__
#define __UART_H__void UART_Init();void UART_SendByte(unsigned char Byte);#endif