![]() |
發(fā)布時間: 2022-12-19 16:08
正文摘要:做串口助手學(xué)習(xí),寫了一個程序,在keil調(diào)試沒問題, 在助手上不行,但顯示有發(fā)送計數(shù)。 現(xiàn)將程序主要部分抄上,請各位大佬幫忙,謝謝! main() { ... |
wh8010jky 發(fā)表于 2022-12-21 11:18 經(jīng)仿真測試 文本模式發(fā)'M' 會在兩秒后傳回'N' ![]() |
Longan.Wang 發(fā)表于 2022-12-20 17:18 文本模式,hex模式都試過了,沒有反應(yīng) |
wh8010jky 發(fā)表于 2022-12-20 15:37 在文本模式下,發(fā)送區(qū)輸入一個"M",然后點(diǎn)擊“發(fā)送數(shù)據(jù)”,就發(fā)送出去了。 |
謝謝14樓。 由于粗心,在發(fā)帖時漏掉了init(),一直沒發(fā)現(xiàn),你質(zhì)疑了才發(fā)現(xiàn),那是當(dāng)時刪除其他文字時誤刪的。 現(xiàn)將程序全部重發(fā)一下。 這個程序keil 上調(diào)試是順利的。 我現(xiàn)在最想知道的是:如何在串口助手上讓電腦發(fā)送一個 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 //定義數(shù)據(jù)口 sbit LCD_RS=P3^5; //定義工作指令性質(zhì)設(shè)置口:指令、數(shù)據(jù) sbit LCD_RW=P3^6; //定義工作模式設(shè)置口:寫、讀 sbit LCD_EN=P3^7; //定義使能口 sbit PSB=P3^2; //定義通訊方式口: =1:并口,8位 =0:串口 sbit RST=P3^3; //定義復(fù)位口 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:收到電腦發(fā)來的信息有效 { 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 //串行接收服務(wù)程序 { uchar i; RI=0; //收到標(biāo)志清0 ES=0; message=SBUF; //從上位機(jī)收到的存入: 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 設(shè)置: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 //復(fù)位 LCD_EN=0; //p22 使能 WriteIns(0x30); //寫入指令:采用基本指令系統(tǒng) delay_1ms(5); WriteIns(0x0c); //寫入指令:開顯示,關(guān)光標(biāo),不反白 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; //發(fā)送指令數(shù)據(jù) delay_1ms(1); LCD_EN=0; } //********* 寫數(shù)據(jù)的接口操作 ************// void WriteDat(uchar dat) { LCD_RS=1; //p20 =1: 數(shù)據(jù)模式 LCD_RW=0; //p21 =0:寫模式, =1:讀模式模式 LCD_EN=1; LcdValue = dat; delay_1ms(1); LCD_EN=0; } //********** 設(shè)置顯示位置 **********// 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 發(fā)表于 2022-12-20 10:41 在main()里 |
wh8010jky 發(fā)表于 2022-12-20 09:34 那么init()在哪里運(yùn)行? |
Y_G_G 發(fā)表于 2022-12-19 22:43 RI在中斷里,TI在main()里,因?yàn)榘l(fā)送沒用中斷 |
初始化在init()里。 |
初始化 |
wh8010jky 發(fā)表于 2022-12-19 19:02 結(jié)合一樓的代碼 發(fā)現(xiàn)和我推斷的一樣 沒有運(yùn)行初始化代碼Init() |
沒寫初始化 |
開了中斷,就得在中斷中清除TI和RI位,不然中斷會卡死 |
說一下我是這么操作串口助手的: 配置好端口、波特率,然后打開串口,用電腦輸入'M' ,在助手發(fā)送區(qū)可見'M',點(diǎn)擊發(fā)送數(shù)據(jù),發(fā)送計數(shù)有增加,但是單片機(jī)端無反應(yīng)。 我現(xiàn)在的疑惑: 1、助手的發(fā)送區(qū)數(shù)據(jù)是電腦向單片機(jī)發(fā)送的,還是單片機(jī)向電腦發(fā)送的?接收區(qū)的數(shù)據(jù)是哪一端收到的數(shù)據(jù)? 2、程序有什么問題?程序的流程很簡單:電腦向單片機(jī)發(fā)一個字符 M ,單片機(jī)收到后,顯示Over字樣,然后單片機(jī)向電腦發(fā)送一個字符 N ,同時在單片機(jī)端顯示 N 字樣,再然后等待下一個電腦發(fā)來的信息。 附圖:紅圈顯示發(fā)送有計數(shù) 哎呀,圖發(fā)不上去。 |
首先感謝各位的熱心。 先前的求助帖,提示字太多,不能發(fā)布,正在修改,不知怎么就發(fā)出去了,連一個說明文字都沒有,收不回了,于是趕緊又發(fā)了一個,文字也不敢多寫,F(xiàn)在把程序補(bǔ)齊。 #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 //定義數(shù)據(jù)口 sbit LCD_RS=P3^5; //定義工作指令性質(zhì)設(shè)置口:指令、數(shù)據(jù) sbit LCD_RW=P3^6; //定義工作模式設(shè)置口:寫、讀 sbit LCD_EN=P3^7; //定義使能口 sbit PSB=P3^2; //定義通訊方式口: =1:并口,8位 =0:串口 sbit RST=P3^3; //定義復(fù)位口 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 設(shè)置: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 //復(fù)位 LCD_EN=0; //p22 使能 WriteIns(0x30); //寫入指令:采用基本指令系統(tǒng) delay_1ms(5); WriteIns(0x0c); //寫入指令:開顯示,關(guān)光標(biāo),不反白 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; //發(fā)送指令數(shù)據(jù) delay_1ms(1); LCD_EN=0; } //********* 寫數(shù)據(jù)的接口操作 ************// void WriteDat(uchar dat) { LCD_RS=1; //p20 =1: 數(shù)據(jù)模式 LCD_RW=0; //p21 =0:寫模式, =1:讀模式模式 LCD_EN=1; LcdValue = dat; delay_1ms(1); LCD_EN=0; } //********** 設(shè)置顯示位置 **********// 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仿真 很方便很簡單 廠家提供核心板和范例程序包 還有教學(xué)視頻 樓主這個簡單程序 看不出問題 |
先用示波器看波形是否出現(xiàn),你的代碼如果沒收到數(shù)據(jù)是不會發(fā)送的,你的代碼沒有串口初始化,接收在中斷,結(jié)果當(dāng)然是無論如何都不可能發(fā)送。 |
串口初始化呢? |
Powered by 單片機(jī)教程網(wǎng)