找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2227|回复: 20
收起左侧

以下单片机代码发给电脑串口助手调试没有显示?

[复制链接]
ID:134430 发表于 2022-12-19 16:08 | 显示全部楼层 |阅读模式
做串口助手学习,写了一个程序,在keil调试没问题,
在助手上不行,但显示有发送计数。
现将程序主要部分抄上,请各位大佬帮忙,谢谢!

main()
{                                                                        
    while(1)
    {
                uchar i;
                if(message != 0)                //!=0:收到电脑发来的信息有效
                {
                        ShowAddr(2,0);                        
                            for(i=0;i<16;i++)        WriteDat(menuB[ i]);        //'N'
                        SBUF='N';
                        while(!TI);
                                TI=0;
                        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;
        }
}
回复

使用道具 举报

ID:161164 发表于 2022-12-19 17:00 | 显示全部楼层
串口初始化呢?
回复

使用道具 举报

ID:883242 发表于 2022-12-19 17:27 | 显示全部楼层
先用示波器看波形是否出现,你的代码如果没收到数据是不会发送的,你的代码没有串口初始化,接收在中断,结果当然是无论如何都不可能发送。
回复

使用道具 举报

ID:961114 发表于 2022-12-19 17:30 | 显示全部楼层
STC8H8K64U-45MHz-TSSOP20,可以USB下载 USB仿真  很方便很简单
厂家提供核心板和范例程序包  还有教学视频   
楼主这个简单程序 看不出问题
回复

使用道具 举报

ID:134430 发表于 2022-12-19 19:02 | 显示全部楼层
首先感谢各位的热心!!
先前的求助帖,提示字太多,不能发布,正在修改,不知怎么就发出去了,连一个说明文字都没有,收不回了,于是赶紧又发了一个,文字也不敢多写。现在把程序补齐。

#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);
}
回复

使用道具 举报

ID:134430 发表于 2022-12-19 19:28 | 显示全部楼层
说一下我是这么操作串口助手的:
配置好端口、波特率,然后打开串口,用电脑输入'M'  ,在助手发送区可见'M',点击发送数据,发送计数有增加,但是单片机端无反应。
我现在的疑惑:
1、助手的发送区数据是电脑向单片机发送的,还是单片机向电脑发送的?接收区的数据是哪一端收到的数据?
2、程序有什么问题?程序的流程很简单:电脑向单片机发一个字符 M ,单片机收到后,显示Over字样,然后单片机向电脑发送一个字符 N ,同时在单片机端显示 N 字样,再然后等待下一个电脑发来的信息。

附图:红圈显示发送有计数
哎呀,图发不上去。
回复

使用道具 举报

ID:134430 发表于 2022-12-19 19:34 | 显示全部楼层
689426552918810335.jpg
回复

使用道具 举报

ID:401564 发表于 2022-12-19 22:43 | 显示全部楼层
开了中断,就得在中断中清除TI和RI位,不然中断会卡死
回复

使用道具 举报

ID:1058360 发表于 2022-12-19 23:15 | 显示全部楼层
没写初始化
回复

使用道具 举报

ID:161164 发表于 2022-12-20 09:21 | 显示全部楼层
wh8010jky 发表于 2022-12-19 19:02
首先感谢各位的热心!!
先前的求助帖,提示字太多,不能发布,正在修改,不知怎么就发出去了,连一个说明 ...

结合一楼的代码
发现和我推断的一样
没有运行初始化代码Init()
回复

使用道具 举报

ID:1054554 发表于 2022-12-20 09:30 | 显示全部楼层
初始化
回复

使用道具 举报

ID:134430 发表于 2022-12-20 09:34 | 显示全部楼层

初始化在init()里。
回复

使用道具 举报

ID:134430 发表于 2022-12-20 09:37 | 显示全部楼层
Y_G_G 发表于 2022-12-19 22:43
开了中断,就得在中断中清除TI和RI位,不然中断会卡死

RI在中断里,TI在main()里,因为发送没用中断
回复

使用道具 举报

ID:161164 发表于 2022-12-20 10:41 | 显示全部楼层
wh8010jky 发表于 2022-12-20 09:34
初始化在init()里。

那么init()在哪里运行?
回复

使用道具 举报

ID:134430 发表于 2022-12-20 15:18 | 显示全部楼层
lkc8210 发表于 2022-12-20 10:41
那么init()在哪里运行?

在main()里
回复

使用道具 举报

ID:134430 发表于 2022-12-20 15:37 | 显示全部楼层
谢谢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);
}         
回复

使用道具 举报

ID:77589 发表于 2022-12-20 17:18 | 显示全部楼层
wh8010jky 发表于 2022-12-20 15:37
谢谢14楼!!
由于粗心,在发帖时漏掉了init(),一直没发现,你质疑了才发现,那是当时删除其他文字时误删 ...

在文本模式下,发送区输入一个"M",然后点击“发送数据”,就发送出去了。
回复

使用道具 举报

ID:134430 发表于 2022-12-21 11:18 | 显示全部楼层
Longan.Wang 发表于 2022-12-20 17:18
在文本模式下,发送区输入一个"M",然后点击“发送数据”,就发送出去了。

文本模式,hex模式都试过了,没有反应
回复

使用道具 举报

ID:161164 发表于 2022-12-21 11:40 | 显示全部楼层
wh8010jky 发表于 2022-12-21 11:18
文本模式,hex模式都试过了,没有反应

经仿真测试
文本模式发'M'
会在两秒后传回'N'
2022-12-21_113912.png


回复

使用道具 举报

ID:134430 发表于 2022-12-21 13:39 | 显示全部楼层
非常感谢!!您的回帖证明了我的程序是没问题的,心里踏实了一点。
但是,我的还是不行,下面是我的截图,上面只有发送数据,没有接收数据,不知到底是那里的问题,真崩溃了。
截图00.png

回复

使用道具 举报

ID:134430 发表于 2022-12-21 21:45 | 显示全部楼层
lkc8210 发表于 2022-12-21 11:40
经仿真测试
文本模式发'M'
会在两秒后传回'N'

非常感谢您!!
您的回复说明我的程序没问题,放心了点。但是我的串口仍然不行,没有接收数据,不知为什么?
下面是截图,跟您的没有什么区别,真崩溃呀。
截图00.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表