|
發布時間: 2022-12-19 16:08
正文摘要:做串口助手學習,寫了一個程序,在keil調試沒問題, 在助手上不行,但顯示有發送計數。 現將程序主要部分抄上,請各位大佬幫忙,謝謝! main() { ... |
wh8010jky 發表于 2022-12-21 11:18 經仿真測試 文本模式發'M' 會在兩秒后傳回'N'
|
Longan.Wang 發表于 2022-12-20 17:18 文本模式,hex模式都試過了,沒有反應 |
wh8010jky 發表于 2022-12-20 15:37 在文本模式下,發送區輸入一個"M",然后點擊“發送數據”,就發送出去了。 |
|
謝謝14樓!! 由于粗心,在發帖時漏掉了init(),一直沒發現,你質疑了才發現,那是當時刪除其他文字時誤刪的。 現將程序全部重發一下。 這個程序keil 上調試是順利的。 我現在最想知道的是:如何在串口助手上讓電腦發送一個 M ? #include "reg52.h" #define uchar unsigned char #define uint16 unsigned int void Init(); void delay_1ms(uint16); void SetLcd12864(); void WriteDat(uchar dat); void WriteIns(uchar ins); void ShowAddr(uchar x,uchar y); #define LcdValue P1 //定義數據口 sbit LCD_RS=P3^5; //定義工作指令性質設置口:指令、數據 sbit LCD_RW=P3^6; //定義工作模式設置口:寫、讀 sbit LCD_EN=P3^7; //定義使能口 sbit PSB=P3^2; //定義通訊方式口: =1:并口,8位 =0:串口 sbit RST=P3^3; //定義復位口 uchar message=0; uchar code menuA[] ={" Hello ! "}; uchar code menuC[] ={" Over! "}; uchar code menuB[] ={" N "}; main() { Init(); while(1) { uchar i; if(message != 0) //!=0:收到電腦發來的信息有效 { delay_1ms(2000); SBUF='N'; while(!TI); TI=0; ShowAddr(2,0); for(i=0;i<16;i++) WriteDat(menuB[i]); //'N' delay_1ms(2000); message=0; //消息清0,等待新消息 ES=1; } } } void receive() interrupt 4 //串行接收服務程序 { uchar i; RI=0; //收到標志清0 ES=0; message=SBUF; //從上位機收到的存入: if(message=='M') //判斷信息是 M嗎? { ShowAddr(3,0); for(i=0;i<16;i++) WriteDat(menuC[i]); //“ Over! ” message=1; } else message=0; } void Init() { uchar i; SetLcd12864(); //初始化12864 delay_1ms(1000); ShowAddr(1,0); for(i=0;i<16;i++) WriteDat(menuA[i]); //“ Hello ! ” TMOD=0x20; //定時器1,工作方式2 TH1=0xfd; //波特率9600,晶振11.0592 TL1=0xfd; TR1=1; //開定時器1 SM0=0; //串行工作方式1 SM1=1; //SCON 設置:sm0,sm1,ren REN=1; //允許串行接收 ES=1; //開串口中斷 EA=1; //開總中斷 } void delay_1ms(uint16 n) { uchar m; while(n--) { m=123; while(m--); } } //********** 初始化 ***********// void SetLcd12864() { PSB=1; //p23 //工作方式:8位,并口 RST=1; //p25 //復位 LCD_EN=0; //p22 使能 WriteIns(0x30); //寫入指令:采用基本指令系統 delay_1ms(5); WriteIns(0x0c); //寫入指令:開顯示,關光標,不反白 delay_1ms(5); WriteIns(0x01); //寫入指令:清屏 delay_1ms(5); } //********* 寫指令的接口操作 ************// void WriteIns(uchar ins) { LCD_RS=0; //p20 =0:指令模式 LCD_RW=0; //p21 =0:寫模式, =1:讀模式 LCD_EN=1; //p22 LcdValue = ins; //發送指令數據 delay_1ms(1); LCD_EN=0; } //********* 寫數據的接口操作 ************// void WriteDat(uchar dat) { LCD_RS=1; //p20 =1: 數據模式 LCD_RW=0; //p21 =0:寫模式, =1:讀模式模式 LCD_EN=1; LcdValue = dat; delay_1ms(1); LCD_EN=0; } //********** 設置顯示位置 **********// void ShowAddr(uchar x,uchar y) //xy:顯示地址,行位 { if(x==0) x=0x80; else if(x==1) x=0x90; else if(x==2) x=0x88; else if(x==3) x=0x98; WriteIns(x+y); } |
lkc8210 發表于 2022-12-20 10:41 在main()里 |
wh8010jky 發表于 2022-12-20 09:34 那么init()在哪里運行? |
Y_G_G 發表于 2022-12-19 22:43 RI在中斷里,TI在main()里,因為發送沒用中斷 |
|
初始化在init()里。 |
| 初始化 |
wh8010jky 發表于 2022-12-19 19:02 結合一樓的代碼 發現和我推斷的一樣 沒有運行初始化代碼Init() |
| 沒寫初始化 |
| 開了中斷,就得在中斷中清除TI和RI位,不然中斷會卡死 |
|
說一下我是這么操作串口助手的: 配置好端口、波特率,然后打開串口,用電腦輸入'M' ,在助手發送區可見'M',點擊發送數據,發送計數有增加,但是單片機端無反應。 我現在的疑惑: 1、助手的發送區數據是電腦向單片機發送的,還是單片機向電腦發送的?接收區的數據是哪一端收到的數據? 2、程序有什么問題?程序的流程很簡單:電腦向單片機發一個字符 M ,單片機收到后,顯示Over字樣,然后單片機向電腦發送一個字符 N ,同時在單片機端顯示 N 字樣,再然后等待下一個電腦發來的信息。 附圖:紅圈顯示發送有計數 哎呀,圖發不上去。 |
|
首先感謝各位的熱心!! 先前的求助帖,提示字太多,不能發布,正在修改,不知怎么就發出去了,連一個說明文字都沒有,收不回了,于是趕緊又發了一個,文字也不敢多寫。現在把程序補齊。 #include "reg52.h" #define uchar unsigned char #define uint16 unsigned int void Init(); void delay_1ms(uint16); void SetLcd12864(); void WriteDat(uchar dat); void WriteIns(uchar ins); void ShowAddr(uchar x,uchar y); #define LcdValue P1 //定義數據口 sbit LCD_RS=P3^5; //定義工作指令性質設置口:指令、數據 sbit LCD_RW=P3^6; //定義工作模式設置口:寫、讀 sbit LCD_EN=P3^7; //定義使能口 sbit PSB=P3^2; //定義通訊方式口: =1:并口,8位 =0:串口 sbit RST=P3^3; //定義復位口 uchar message=0; uchar code menuA[] ={" Hello ! "}; uchar code menuC[] ={" Over! "}; uchar code menuB[] ={" N "}; void Init() { uchar i; SetLcd12864(); //初始化12864 delay_1ms(1000); ShowAddr(1,0); for(i=0;i<16;i++) WriteDat(menuA[i]); //“ Hello ! ” TMOD=0x20; //定時器1,工作方式2 TH1=0xfd; //波特率9600,晶振11.0592 TL1=0xfd; TR1=1; //開定時器1 SM0=0; //串行工作方式1 SM1=1; //SCON 設置:sm0,sm1,ren REN=1; //允許串行接收 ES=1; //開串口中斷 EA=1; //開總中斷 } void delay_1ms(uint16 n) { uchar m; while(n--) { m=123; while(m--); } } //********** 初始化 ***********// void SetLcd12864() { PSB=1; //p23 //工作方式:8位,并口 RST=1; //p25 //復位 LCD_EN=0; //p22 使能 WriteIns(0x30); //寫入指令:采用基本指令系統 delay_1ms(5); WriteIns(0x0c); //寫入指令:開顯示,關光標,不反白 delay_1ms(5); WriteIns(0x01); //寫入指令:清屏 delay_1ms(5); } //********* 寫指令的接口操作 ************// void WriteIns(uchar ins) { LCD_RS=0; //p20 =0:指令模式 LCD_RW=0; //p21 =0:寫模式, =1:讀模式 LCD_EN=1; //p22 LcdValue = ins; //發送指令數據 delay_1ms(1); LCD_EN=0; } //********* 寫數據的接口操作 ************// void WriteDat(uchar dat) { LCD_RS=1; //p20 =1: 數據模式 LCD_RW=0; //p21 =0:寫模式, =1:讀模式模式 LCD_EN=1; LcdValue = dat; delay_1ms(1); LCD_EN=0; } //********** 設置顯示位置 **********// void ShowAddr(uchar x,uchar y) //xy:顯示地址,行位 { if(x==0) x=0x80; else if(x==1) x=0x90; else if(x==2) x=0x88; else if(x==3) x=0x98; WriteIns(x+y); } |
|
STC8H8K64U-45MHz-TSSOP20,可以USB下載 USB仿真 很方便很簡單 廠家提供核心板和范例程序包 還有教學視頻 樓主這個簡單程序 看不出問題 |
| 先用示波器看波形是否出現,你的代碼如果沒收到數據是不會發送的,你的代碼沒有串口初始化,接收在中斷,結果當然是無論如何都不可能發送。 |
| 串口初始化呢? |