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