久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3231|回復: 20
打印 上一主題 下一主題
收起左側

以下單片機代碼發給電腦串口助手調試沒有顯示?

[復制鏈接]
跳轉到指定樓層
樓主
做串口助手學習,寫了一個程序,在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;
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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仿真  很方便很簡單
廠家提供核心板和范例程序包  還有教學視頻   
樓主這個簡單程序 看不出問題
回復

使用道具 舉報

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

使用道具 舉報

6#
ID:134430 發表于 2022-12-19 19:28 | 只看該作者
說一下我是這么操作串口助手的:
配置好端口、波特率,然后打開串口,用電腦輸入'M'  ,在助手發送區可見'M',點擊發送數據,發送計數有增加,但是單片機端無反應。
我現在的疑惑:
1、助手的發送區數據是電腦向單片機發送的,還是單片機向電腦發送的?接收區的數據是哪一端收到的數據?
2、程序有什么問題?程序的流程很簡單:電腦向單片機發一個字符 M ,單片機收到后,顯示Over字樣,然后單片機向電腦發送一個字符 N ,同時在單片機端顯示 N 字樣,再然后等待下一個電腦發來的信息。

附圖:紅圈顯示發送有計數
哎呀,圖發不上去。
回復

使用道具 舉報

7#
ID:134430 發表于 2022-12-19 19:34 | 只看該作者

回復

使用道具 舉報

8#
ID:401564 發表于 2022-12-19 22:43 | 只看該作者
開了中斷,就得在中斷中清除TI和RI位,不然中斷會卡死
回復

使用道具 舉報

9#
ID:1058360 發表于 2022-12-19 23:15 | 只看該作者
沒寫初始化
回復

使用道具 舉報

10#
ID:161164 發表于 2022-12-20 09:21 | 只看該作者
wh8010jky 發表于 2022-12-19 19:02
首先感謝各位的熱心!!
先前的求助帖,提示字太多,不能發布,正在修改,不知怎么就發出去了,連一個說明 ...

結合一樓的代碼
發現和我推斷的一樣
沒有運行初始化代碼Init()
回復

使用道具 舉報

11#
ID:1054554 發表于 2022-12-20 09:30 | 只看該作者
初始化
回復

使用道具 舉報

12#
ID:134430 發表于 2022-12-20 09:34 | 只看該作者

初始化在init()里。
回復

使用道具 舉報

13#
ID:134430 發表于 2022-12-20 09:37 | 只看該作者
Y_G_G 發表于 2022-12-19 22:43
開了中斷,就得在中斷中清除TI和RI位,不然中斷會卡死

RI在中斷里,TI在main()里,因為發送沒用中斷
回復

使用道具 舉報

14#
ID:161164 發表于 2022-12-20 10:41 | 只看該作者
wh8010jky 發表于 2022-12-20 09:34
初始化在init()里。

那么init()在哪里運行?
回復

使用道具 舉報

15#
ID:134430 發表于 2022-12-20 15:18 | 只看該作者
lkc8210 發表于 2022-12-20 10:41
那么init()在哪里運行?

在main()里
回復

使用道具 舉報

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

使用道具 舉報

17#
ID:77589 發表于 2022-12-20 17:18 | 只看該作者
wh8010jky 發表于 2022-12-20 15:37
謝謝14樓!!
由于粗心,在發帖時漏掉了init(),一直沒發現,你質疑了才發現,那是當時刪除其他文字時誤刪 ...

在文本模式下,發送區輸入一個"M",然后點擊“發送數據”,就發送出去了。
回復

使用道具 舉報

18#
ID:134430 發表于 2022-12-21 11:18 | 只看該作者
Longan.Wang 發表于 2022-12-20 17:18
在文本模式下,發送區輸入一個"M",然后點擊“發送數據”,就發送出去了。

文本模式,hex模式都試過了,沒有反應
回復

使用道具 舉報

19#
ID:161164 發表于 2022-12-21 11:40 | 只看該作者
wh8010jky 發表于 2022-12-21 11:18
文本模式,hex模式都試過了,沒有反應

經仿真測試
文本模式發'M'
會在兩秒后傳回'N'



回復

使用道具 舉報

20#
ID:134430 發表于 2022-12-21 13:39 | 只看該作者
非常感謝!!您的回帖證明了我的程序是沒問題的,心里踏實了一點。
但是,我的還是不行,下面是我的截圖,上面只有發送數據,沒有接收數據,不知到底是那里的問題,真崩潰了。


回復

使用道具 舉報

21#
ID:134430 發表于 2022-12-21 21:45 | 只看該作者
lkc8210 發表于 2022-12-21 11:40
經仿真測試
文本模式發'M'
會在兩秒后傳回'N'

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

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一区二区三区在线视频 | 亚洲精品美女视频 | 国产不卡一区在线观看 | 亚洲一区视频 | 久久一区二区视频 | 国产丝袜一区二区三区免费视频 | 欧美综合一区 | 成人免费激情视频 | 国产在线观看网站 | 久久久青草 | 欧美日韩亚洲视频 | 天天综合网永久 | 色婷婷在线视频 | 国产亚洲人成a在线v网站 | 国产成人精品久久二区二区 | 在线观看视频一区二区三区 | 国产成人99久久亚洲综合精品 | 成人免费福利 | 欧美日韩亚洲视频 | 91成人在线| 精品国产伦一区二区三区观看方式 | 特级黄一级播放 | 欧美黑人国产人伦爽爽爽 | 亚洲一区二区三区桃乃木香奈 | 日韩中文字幕在线播放 | 久久久国产一区二区 | 国产视频一区二区 | 国产精品久久久久久婷婷天堂 | 成人精品一区二区三区中文字幕 | 国产欧美在线 | 一区二区三区在线免费观看视频 | 日本一区二区不卡 | 亚洲国产成人精品女人久久久 | 亚洲精品久久久久中文字幕二区 | 欧美黑人狂野猛交老妇 | 麻豆精品国产91久久久久久 | 亚洲一区二区精品视频 | 欧美视频在线播放 | 中文字幕一区在线 | 精品欧美一区二区三区久久久小说 | 黄色av网站在线免费观看 |