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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

一個簡單的單片機串口發送程序問題

  [復制鏈接]
跳轉到指定樓層
樓主
ID:825883 發表于 2021-3-16 07:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請教一個簡單的串口發送問題,無關的語句沒有寫。
unsigned char i;
unsigned char a[9]={1,2,3,4,5,6,7,8,9};
SCON=0X40;
TMOD=0X20;
TH1=0xfd;//@11.0592MHz,波特率9600
TL1=0xfd;
delay();
TR1=1;//啟動發送
for(i=0;i<9;i++)
{         SBUF=a[ i][ i];
          while(TI==0)//開始檢測TI是否為零,表示未完成發送,等待,直到為1,跳出while循環
          ;//這2行抄教材的,感覺不太對,因為沒有發送完成時,TI也為0
        TI=0;       if(i==8)
         TR1=0;
}

問題1:第一次循環,i=0,將數組的第一個元素賦值給SBUF,開始發送,然后等待發送完成,i++,進行第二次for循環。最后一次for循環,關閉計時器停止發送,整個程序作用是發送一遍01~09給計算機串口助手。現在是不停的發送01~09,i==8的語句不起作用,請問是為什么???
問題2:SBUF未賦值前內容未定,是否應該先賦值,再啟動定時器,還是像上述程序一樣先啟動后賦值也可以?


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:18297 發表于 2021-3-16 09:05 | 只看該作者
你這個需要完整的程序,上傳以下,我們大家可以給你分析。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:390416 發表于 2021-3-16 09:27 | 只看該作者
串口1打印程序 可以打印3個十六位的變量 波特率9600 http://www.zg4o1577.cn/bbs/dpj-201660-1.html
可以用這個貼子的代碼,
回復

使用道具 舉報

地板
ID:390416 發表于 2021-3-16 09:27 | 只看該作者
還可以用這個貼子的代碼,需要發送的信息存入數組就行
串口發送 不需要while死等 串口接收執行軟件復位 http://www.zg4o1577.cn/bbs/dpj-200927-1.html
回復

使用道具 舉報

5#
ID:892488 發表于 2021-3-16 10:27 | 只看該作者
你看看是不是程序一直在重啟啟動

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:160197 發表于 2021-3-16 10:52 | 只看該作者
TI = 0;
SBUF = a[i];
while(!TI);
我知道這么寫,就只發一次

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

7#
ID:693038 發表于 2021-3-16 11:00 | 只看該作者
首先a是數組首地址,不是元素元素應該是a[i],第二for里面i的值是從0-8所以當你判斷i==8的時候其實所有的東西都已經執行完了,第三初始化完后賦值給SBUF就會開始發送數據了

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:881998 發表于 2021-3-16 14:46 | 只看該作者
沒有數據緩沖吧!
回復

使用道具 舉報

9#
ID:340765 發表于 2021-3-16 15:39 | 只看該作者
#include "reg52.h"

typedef unsigned int u16;
typedef unsigned char u8;

u16 i,j;

void Usartinit()
{
        TMOD = 0x20;//9600=(2÷32)×((12M/12)/(256-TH1))    1M=10E6
        TH1 = 0xf3;
        TL1 = 0xf3;
        PCON = 0x80;
        SCON = 0x50;
        EA = 1;
        ES = 1;
        TR1 = 1;
}

void main()
{
        Usartinit();
        while(1)
        {
                if(j == 1)
                {
                        ES = 0;
                        j = 0;
                        SBUF = i;
                        while(!TI);
                        TI = 0;
                        ES = 1;                 
                       
                }
        }
}

void Sart() interrupt 4
{
        RI = 0;
        P0 = SBUF;
        i = SBUF;
        j = 1;
}
回復

使用道具 舉報

10#
ID:123289 發表于 2021-3-16 15:56 | 只看該作者
你要知道串口在硬件上就是一個移位寄存器!
1、移位寄存器要工作必須有CLK才能移位。這個CLK可以從幾個地方獲取,手冊上有說明,你要看書。
你這里的CLK取自于:T1定時器的輸出。而起動T1的命令是TR1=1。
2、移位需要一個起動命令,當你向SBUF中送數時,起動命令就下達了。
了解以上兩點你就明白是先做TR1=1,還是先做SBUF=N了。
回復

使用道具 舉報

11#
ID:422684 發表于 2021-3-16 15:58 | 只看該作者
先用例程測試。
回復

使用道具 舉報

12#
ID:123289 發表于 2021-3-16 16:05 | 只看該作者
當I=8時,你關閉了TR1,這樣移位寄存器(串口)就無法移位了。理論上串口也就無法工作了。
FOR語句執行完之后,TR1=0了。
但是,程序再回頭時,TR1又被你打開了,就是FOR語句前的[TR1=1;//啟動發送],當然如果你的程序不回頭不(大循環)也就不會再發送了。
你調試看看,在何處TR1又被置1了。
回復

使用道具 舉報

13#
ID:814525 發表于 2021-3-16 16:31 | 只看該作者
a[9]和a[i][i]不是一個概念,a[9]是一維數組,a[i][i]是二維數組。所以正確調用為SBUF = a[i];
回復

使用道具 舉報

14#
ID:743654 發表于 2021-3-17 08:52 | 只看該作者
要看主函數,串口中斷是否一直打開,或者有死循環。
回復

使用道具 舉報

15#
ID:304608 發表于 2021-3-18 11:22 | 只看該作者
SBUF=a[ i][ i];  此處有問題,a不能當二維數組使用(你竟然可以編譯通過,詭異。。)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧州一区二区三区 | 99亚洲精品| 国产电影精品久久 | 日韩欧美三级电影在线观看 | 亚洲a视频 | 日本精品视频在线 | 久久婷婷麻豆国产91天堂 | 97色在线观看免费视频 | 欧美福利在线 | 亚洲一区久久 | 精品综合 | 久久精品视频网站 | 国产在线观看一区二区三区 | 久久免费精品 | 久久久国产一区二区三区四区小说 | 欧美综合久久久 | 99re在线视频免费观看 | 久久久精品 | 午夜在线观看免费 | 亚洲精品视频在线 | 国产成人免费视频 | 黑色丝袜三级在线播放 | 国产精品区二区三区日本 | 91精品国产手机 | 91av在线免费观看 | 日韩精品在线观看视频 | 久久久新视频 | 国产精品久久久久久久免费大片 | 一区二区三区欧美 | 精品中文字幕一区二区三区 | 欧美videosex性极品hd | 日批免费观看 | 国产免费一区二区三区最新6 | 久久九九99 | 国产在线视频一区二区 | 美女久久 | 国产一区二区三区在线视频 | 狠狠色狠狠色综合系列 | 99日韩| 国产亚洲精品久久久久动 | 成人一级视频在线观看 |