找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4298|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

一個(gè)簡(jiǎn)單的單片機(jī)串口發(fā)送程序問(wèn)題

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:825883 發(fā)表于 2021-3-16 07:47 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
請(qǐng)教一個(gè)簡(jiǎn)單的串口發(fā)送問(wèn)題,無(wú)關(guān)的語(yǔ)句沒(méi)有寫(xiě)。
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;//啟動(dòng)發(fā)送
for(i=0;i<9;i++)
{         SBUF=a[ i][ i];
          while(TI==0)//開(kāi)始檢測(cè)TI是否為零,表示未完成發(fā)送,等待,直到為1,跳出while循環(huán)
          ;//這2行抄教材的,感覺(jué)不太對(duì),因?yàn)闆](méi)有發(fā)送完成時(shí),TI也為0
        TI=0;       if(i==8)
         TR1=0;
}

問(wèn)題1:第一次循環(huán),i=0,將數(shù)組的第一個(gè)元素賦值給SBUF,開(kāi)始發(fā)送,然后等待發(fā)送完成,i++,進(jìn)行第二次for循環(huán)。最后一次for循環(huán),關(guān)閉計(jì)時(shí)器停止發(fā)送,整個(gè)程序作用是發(fā)送一遍01~09給計(jì)算機(jī)串口助手,F(xiàn)在是不停的發(fā)送01~09,i==8的語(yǔ)句不起作用,請(qǐng)問(wèn)是為什么???
問(wèn)題2:SBUF未賦值前內(nèi)容未定,是否應(yīng)該先賦值,再啟動(dòng)定時(shí)器,還是像上述程序一樣先啟動(dòng)后賦值也可以?


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

使用道具 舉報(bào)

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

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

地板
ID:390416 發(fā)表于 2021-3-16 09:27 | 只看該作者
還可以用這個(gè)貼子的代碼,需要發(fā)送的信息存入數(shù)組就行
串口發(fā)送 不需要while死等 串口接收?qǐng)?zhí)行軟件復(fù)位 http://www.torrancerestoration.com/bbs/dpj-200927-1.html
回復(fù)

使用道具 舉報(bào)

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

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

8#
ID:881998 發(fā)表于 2021-3-16 14:46 | 只看該作者
沒(méi)有數(shù)據(jù)緩沖吧!
回復(fù)

使用道具 舉報(bào)

9#
ID:340765 發(fā)表于 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;
}
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

14#
ID:743654 發(fā)表于 2021-3-17 08:52 | 只看該作者
要看主函數(shù),串口中斷是否一直打開(kāi),或者有死循環(huán)。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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