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仿真 很方便很简单 厂家提供核心板和范例程序包 还有教学视频 楼主这个简单程序 看不出问题 |
先用示波器看波形是否出现,你的代码如果没收到数据是不会发送的,你的代码没有串口初始化,接收在中断,结果当然是无论如何都不可能发送。 |
串口初始化呢? |