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