找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

以下單片機(jī)代碼發(fā)給電腦串口助手調(diào)試沒有顯示?

查看數(shù): 3503 | 評論數(shù): 20 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2022-12-19 16:08

正文摘要:

做串口助手學(xué)習(xí),寫了一個程序,在keil調(diào)試沒問題, 在助手上不行,但顯示有發(fā)送計數(shù)。 現(xiàn)將程序主要部分抄上,請各位大佬幫忙,謝謝! main() {              ...

回復(fù)

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

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



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

文本模式,hex模式都試過了,沒有反應(yīng)
ID:77589 發(fā)表于 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",然后點(diǎn)擊“發(fā)送數(shù)據(jù)”,就發(fā)送出去了。
ID:134430 發(fā)表于 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;                        //從上位機(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);
}         
ID:134430 發(fā)表于 2022-12-20 15:18
lkc8210 發(fā)表于 2022-12-20 10:41
那么init()在哪里運(yùn)行?

在main()里
ID:161164 發(fā)表于 2022-12-20 10:41

那么init()在哪里運(yùn)行?
ID:134430 發(fā)表于 2022-12-20 09:37
Y_G_G 發(fā)表于 2022-12-19 22:43
開了中斷,就得在中斷中清除TI和RI位,不然中斷會卡死

RI在中斷里,TI在main()里,因?yàn)榘l(fā)送沒用中斷
ID:134430 發(fā)表于 2022-12-20 09:34

初始化在init()里。
ID:1054554 發(fā)表于 2022-12-20 09:30
初始化
ID:161164 發(fā)表于 2022-12-20 09:21
wh8010jky 發(fā)表于 2022-12-19 19:02
首先感謝各位的熱心!
先前的求助帖,提示字太多,不能發(fā)布,正在修改,不知怎么就發(fā)出去了,連一個說明 ...

結(jié)合一樓的代碼
發(fā)現(xiàn)和我推斷的一樣
沒有運(yùn)行初始化代碼Init()
ID:1058360 發(fā)表于 2022-12-19 23:15
沒寫初始化
ID:401564 發(fā)表于 2022-12-19 22:43
開了中斷,就得在中斷中清除TI和RI位,不然中斷會卡死
ID:134430 發(fā)表于 2022-12-19 19:28
說一下我是這么操作串口助手的:
配置好端口、波特率,然后打開串口,用電腦輸入'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ā)不上去。
ID:134430 發(fā)表于 2022-12-19 19:02
首先感謝各位的熱心。
先前的求助帖,提示字太多,不能發(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);
}
ID:961114 發(fā)表于 2022-12-19 17:30
STC8H8K64U-45MHz-TSSOP20,可以USB下載 USB仿真  很方便很簡單
廠家提供核心板和范例程序包  還有教學(xué)視頻   
樓主這個簡單程序 看不出問題
ID:883242 發(fā)表于 2022-12-19 17:27
先用示波器看波形是否出現(xiàn),你的代碼如果沒收到數(shù)據(jù)是不會發(fā)送的,你的代碼沒有串口初始化,接收在中斷,結(jié)果當(dāng)然是無論如何都不可能發(fā)送。
ID:161164 發(fā)表于 2022-12-19 17:00
串口初始化呢?

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表