標(biāo)題: 以下單片機代碼發(fā)給電腦串口助手調(diào)試沒有顯示? [打印本頁]

作者: wh8010jky    時間: 2022-12-19 16:08
標(biāo)題: 以下單片機代碼發(fā)給電腦串口助手調(diào)試沒有顯示?
做串口助手學(xué)習(xí),寫了一個程序,在keil調(diào)試沒問題,
在助手上不行,但顯示有發(fā)送計數(shù)。
現(xiàn)將程序主要部分抄上,請各位大佬幫忙,謝謝!

main()
{                                                                        
    while(1)
    {
                uchar i;
                if(message != 0)                //!=0:收到電腦發(fā)來的信息有效
                {
                        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        //串行接收服務(wù)程序
{
        uchar i;
        RI=0;                                //收到標(biāo)志清0
        ES=0;
        message=SBUF;                        //從上位機收到的存入:
        if(message=='M')                //判斷信息是 M嗎?
        {
            ShowAddr(3,0);                        
                    for(i=0;i<16;i++)        WriteDat(menuC[ i]);        //“   Over!     ”  
                message=1;
        }
}

作者: lkc8210    時間: 2022-12-19 17:00
串口初始化呢?
作者: Hephaestus    時間: 2022-12-19 17:27
先用示波器看波形是否出現(xiàn),你的代碼如果沒收到數(shù)據(jù)是不會發(fā)送的,你的代碼沒有串口初始化,接收在中斷,結(jié)果當(dāng)然是無論如何都不可能發(fā)送。
作者: STC莊偉    時間: 2022-12-19 17:30
STC8H8K64U-45MHz-TSSOP20,可以USB下載 USB仿真  很方便很簡單
廠家提供核心板和范例程序包  還有教學(xué)視頻   
樓主這個簡單程序 看不出問題
作者: wh8010jky    時間: 2022-12-19 19:02
首先感謝各位的熱心。
先前的求助帖,提示字太多,不能發(fā)布,正在修改,不知怎么就發(fā)出去了,連一個說明文字都沒有,收不回了,于是趕緊又發(fā)了一個,文字也不敢多寫。現(xià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                //定義數(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);
}
作者: wh8010jky    時間: 2022-12-19 19:28
說一下我是這么操作串口助手的:
配置好端口、波特率,然后打開串口,用電腦輸入'M'  ,在助手發(fā)送區(qū)可見'M',點擊發(fā)送數(shù)據(jù),發(fā)送計數(shù)有增加,但是單片機端無反應(yīng)。
我現(xiàn)在的疑惑:
1、助手的發(fā)送區(qū)數(shù)據(jù)是電腦向單片機發(fā)送的,還是單片機向電腦發(fā)送的?接收區(qū)的數(shù)據(jù)是哪一端收到的數(shù)據(jù)?
2、程序有什么問題?程序的流程很簡單:電腦向單片機發(fā)一個字符 M ,單片機收到后,顯示Over字樣,然后單片機向電腦發(fā)送一個字符 N ,同時在單片機端顯示 N 字樣,再然后等待下一個電腦發(fā)來的信息。

附圖:紅圈顯示發(fā)送有計數(shù)
哎呀,圖發(fā)不上去。

作者: wh8010jky    時間: 2022-12-19 19:34


作者: Y_G_G    時間: 2022-12-19 22:43
開了中斷,就得在中斷中清除TI和RI位,不然中斷會卡死
作者: 凍死的企鵝    時間: 2022-12-19 23:15
沒寫初始化
作者: lkc8210    時間: 2022-12-20 09:21
wh8010jky 發(fā)表于 2022-12-19 19:02
首先感謝各位的熱心!
先前的求助帖,提示字太多,不能發(fā)布,正在修改,不知怎么就發(fā)出去了,連一個說明 ...

結(jié)合一樓的代碼
發(fā)現(xiàn)和我推斷的一樣
沒有運行初始化代碼Init()
作者: 984905742    時間: 2022-12-20 09:30
初始化
作者: wh8010jky    時間: 2022-12-20 09:34
凍死的企鵝 發(fā)表于 2022-12-19 23:15
沒寫初始化

初始化在init()里。
作者: wh8010jky    時間: 2022-12-20 09:37
Y_G_G 發(fā)表于 2022-12-19 22:43
開了中斷,就得在中斷中清除TI和RI位,不然中斷會卡死

RI在中斷里,TI在main()里,因為發(fā)送沒用中斷
作者: lkc8210    時間: 2022-12-20 10:41
wh8010jky 發(fā)表于 2022-12-20 09:34
初始化在init()里。

那么init()在哪里運行?
作者: wh8010jky    時間: 2022-12-20 15:18
lkc8210 發(fā)表于 2022-12-20 10:41
那么init()在哪里運行?

在main()里
作者: wh8010jky    時間: 2022-12-20 15:37
謝謝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;                        //從上位機收到的存入:
        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);
}         
作者: Longan.Wang    時間: 2022-12-20 17:18
wh8010jky 發(fā)表于 2022-12-20 15:37
謝謝14樓!!
由于粗心,在發(fā)帖時漏掉了init(),一直沒發(fā)現(xiàn),你質(zhì)疑了才發(fā)現(xiàn),那是當(dāng)時刪除其他文字時誤刪 ...

在文本模式下,發(fā)送區(qū)輸入一個"M",然后點擊“發(fā)送數(shù)據(jù)”,就發(fā)送出去了。
作者: wh8010jky    時間: 2022-12-21 11:18
Longan.Wang 發(fā)表于 2022-12-20 17:18
在文本模式下,發(fā)送區(qū)輸入一個"M",然后點擊“發(fā)送數(shù)據(jù)”,就發(fā)送出去了。

文本模式,hex模式都試過了,沒有反應(yīng)
作者: lkc8210    時間: 2022-12-21 11:40
wh8010jky 發(fā)表于 2022-12-21 11:18
文本模式,hex模式都試過了,沒有反應(yīng)

經(jīng)仿真測試
文本模式發(fā)'M'
會在兩秒后傳回'N'




作者: wh8010jky    時間: 2022-12-21 13:39
非常感謝!您的回帖證明了我的程序是沒問題的,心里踏實了一點。
但是,我的還是不行,下面是我的截圖,上面只有發(fā)送數(shù)據(jù),沒有接收數(shù)據(jù),不知到底是那里的問題,真崩潰了。



作者: wh8010jky    時間: 2022-12-21 21:45
lkc8210 發(fā)表于 2022-12-21 11:40
經(jīng)仿真測試
文本模式發(fā)'M'
會在兩秒后傳回'N'

非常感謝您!
您的回復(fù)說明我的程序沒問題,放心了點。但是我的串口仍然不行,沒有接收數(shù)據(jù),不知為什么?
下面是截圖,跟您的沒有什么區(qū)別,真崩潰呀。






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1