![]() |
發(fā)布時間: 2018-7-16 14:35
正文摘要:我通過52單片機串口發(fā)送數(shù)據(jù)0x7E,0x04,0x41,0x00,0x01,0xEF后接收緩沖區(qū)第一次顯示 80 28 81 07 ,第二次顯示84 28 81 0F,第三次顯示80 28 81 07(因為我是隔一段時間發(fā)送一次,但是為什么顯示的會不一樣,而且每次 ... |
/*----------------------------------------------- 名稱:串口通信 編寫:LZM 日期:2015.05 修改:無 內(nèi)容:連接好串口波特率設置為9600,無奇偶校驗 晶振11.0592MHz 接上串口,可以接收到自己發(fā)送的字符 ------------------------------------------------*/ #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義 /******************************************************************* 請?zhí)崆坝嬎阋幌滤x晶振能達到的最高速度,波特率不能超過最高速度 (1) 波特率加倍(SMOD=1): Max_Baud = FOSC/12/16 (2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32 例如:22.1184MHz晶振,波特率加倍時,最大波特率=22118400/12/16=115200 *******************************************************************/ #define FOSC 11059200 //振蕩頻率 #define BAUD 9600 //波特率 #define SMOD 1 //是否波特率加倍 #if SMOD #define TC_VAL (256-FOSC/16/12/BAUD) #else #define TC_VAL (256-FOSC/32/12/BAUD) #endif typedef unsigned char uint8; typedef unsigned int uint16; code const char str1[] = "The string is 來自單片機!\r\n"; code const char str2[] = "Author: louis \r\n"; //const 限定一個變量不允許被改變。在一定程度上提高程序安全性和可靠性 //code 存儲區(qū)間為 程序存儲區(qū) /***************函數(shù)聲明*******************/ void InitUART(void); void SendOneByte(uint8); void SendrStr(const uint8 *ptr); /****************主函數(shù)********************/ void main(void) { uint8 i=0; InitUART(); while(str2[i]!='\0') { SendOneByte(str2[i++]); } SendrStr(str1); while(1); } /****************中斷服務函數(shù)***************/ void UART_ISR(void) interrupt 4 { uint8 RX_Data; //只響應"接收"中斷,"發(fā)送"中斷來了就直接抹掉 if(RI) { RI = 0; //串口中斷標志不能自己清除,需要手動清除 RX_Data=SBUF; SendOneByte(RX_Data); } else TI = 0; //串口發(fā)中斷是發(fā)送完緩沖區(qū)數(shù)據(jù)之后產(chǎn)生 } /****************串口初始化函數(shù)*************/ void InitUART(void) { TMOD = 0x20; //定時器1,模式2工作模式 SCON = 0x50; //串口工作模式1,允許REN /* SCON: 模式 1, 8-bit UART, 使能接收 */ TH1 = TC_VAL; TL1 = TH1; PCON = 0x80; //發(fā)送速率加倍 ES = 1; EA = 1; TR1 = 1; } /**************串口發(fā)送字符函數(shù)*************/ void SendOneByte(uint8 c) { ES = 0; //禁止中斷,讓串口安心工作啊 SBUF = c; while(!TI); //等待發(fā)送完畢 TI = 0; //清TI中斷 ES = 1; //打開中斷 } /**************串口發(fā)送字符串函數(shù)*************/ void SendrStr(const uint8 *ptr) { do { SendOneByte(*ptr); //其實發(fā)送字符串也是在調(diào)用發(fā)送字符的函數(shù)~~ }while(*ptr++!='\0'); //要有結束判斷,否則串口發(fā)送 字符串 不知道什么時候停止 } |
你這個應該就是波特率的問題,波特率配置 |
其次for循環(huán)i應該從0開始加,不然你永遠打印不了JDQdata8[0] |
首先你JDQdata8數(shù)組你定義大小為7,但是你初始化的只有6個,JDQdata8[6] 可能系統(tǒng)隨機定義 |
ahshmj 發(fā)表于 2018-7-17 20:18 晶振11.0592,波特率誤差應該不大 |
晶振是多少的?波特率誤差大嗎? |
Powered by 單片機教程網(wǎng)