|
為何手動選擇數(shù)據(jù)不能發(fā)送,串口助手接收到的全是null或者亂碼,接收中斷返回來的又正確
#include "reg52.h"
typedef unsigned int u16; //對系統(tǒng)默認(rèn)數(shù)據(jù)類型進(jìn)行重定義
typedef unsigned char u8;
void delay_1_second(void)
{
unsigned int i, j;
for (i = 0; i < 12000; i++) { // 假設(shè)每個大循環(huán)約耗時1ms
for (j = 0; j < 120; j++) { // 這里是填充的小循環(huán),具體數(shù)量需要根據(jù)實(shí)際情況調(diào)整
// 空循環(huán),用于消耗時間
}
}
}
/*******************************************************************************
* 函 數(shù) 名 : uart_init
* 函數(shù)功能 : 串口通信中斷配置函數(shù),通過設(shè)置TH和TL即可確定定時時間
* 輸 入 : baud:波特率對應(yīng)的TH、TL裝載值
* 輸 出 : 無
*******************************************************************************/
void uart_init(void)
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位數(shù)據(jù),可變波特率
TMOD &= 0x0F; //清除定時器1模式位
TMOD |= 0x20; //設(shè)定定時器1為8位自動重裝方式
TL1 = 0xFD; //設(shè)定定時初值
TH1 = 0xFD; //設(shè)定定時器重裝值
TR1 = 1; //啟動定時器1
ET1 = 0; //禁止定時器1中斷
EA=1; //開放總中斷
ES=1; //開放串口中斷
}
// 發(fā)送單個字符的函數(shù)
void uart_send_char(u8 da1)
{
while(TI); // 等待上次發(fā)送完成(通過檢查TI標(biāo)志)
SBUF = da1; // 將字符放入發(fā)送緩沖區(qū)SBUF
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標(biāo)志位
}
void uart_send_string(const char *str)
{
while(*str) // 遍歷字符串直到遇到結(jié)束符'\0'
{
uart_send_char(*str++); // 發(fā)送當(dāng)前字符,并指向下一個字符
}
}
/*******************************************************************************
* 函 數(shù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
uart_init();//波特率為9600
//char s2 = "ssss";
while(1)
{
uart_send_char('x');
delay_1_second();
}
}
void uart() interrupt 4 //串口通信中斷函數(shù)
{
u8 rec_data;
RI = 0; //清除接收中斷標(biāo)志位
rec_data=SBUF; //存儲接收到的數(shù)據(jù)
SBUF=rec_data; //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標(biāo)志位
}
|
|