我的開發板晶振是12MHZ的,第一個是別人寫的,在2400波特率下可以正常通訊,第二個我的,在任何波特率下都是亂碼,大家幫我看下哪里不同了,謝謝大家了。
/**************************************************************************************
實驗名稱:串口通信實驗
接線說明:
實驗現象:下載程序后,當串口助手發送數據給單片機,單片機原封不動轉發給串口助手顯示
注意事項:使用黃色跳線帽將CH340旁的P5端子的UTX和P30短接,URX和P31短接,出廠默認已短接好
***************************************************************************************/
#include "reg52.h"
typedef unsigned int u16; //對系統默認數據類型進行重定義
typedef unsigned char u8;
/*******************************************************************************
* 函 數 名 : uart_init
* 函數功能 : 串口通信中斷配置函數,通過設置TH和TL即可確定定時時間
* 輸 入 : baud:波特率對應的TH、TL裝載值
* 輸 出 : 無
*******************************************************************************/
void uart_init(u8 baud)
{
TMOD|=0X20; //設置計數器工作方式2
SCON=0X50; //設置為工作方式1
PCON=0X80; //波特率加倍
TH1=0xe6; //計數器初始值設置
TL1=0xe6;
ES=1; //打開接收中斷
EA=1; //打開總中斷
TR1=1; //打開計數器
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
uart_init(0XFA);//波特率為2400
while(1)
{
}
}
void uart() interrupt 4 //串口通信中斷函數
{
u8 rec_data;
RI = 0; //清除接收中斷標志位
rec_data=SBUF; //存儲接收到的數據
SBUF=rec_data; //將接收到的數據放入到發送寄存器
while(!TI); //等待發送數據完成
TI=0; //清除發送完成標志位
}
這是我的
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char flag, a, i;
uchar code table[]="i get";
void init()
{
TMOD=0x20;
SCON=0x50;
PCON=0x80;
TH1=0xe6;
TL1=0xe6;
TR1=1;
EA=1;
ES=1;
}
void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0;
for(i=0;i<6;i++)
{
SBUF=table[ i];
while(!TI);
TI=0;
}
SBUF=a;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
|