標(biāo)題: 新手學(xué)習(xí)串行口通信遇到問(wèn)題,求大神幫忙 [打印本頁(yè)]
作者: 夏日有余暉 時(shí)間: 2016-8-5 14:09
標(biāo)題: 新手學(xué)習(xí)串行口通信遇到問(wèn)題,求大神幫忙
我只是把波特率改成9600bps的,就不能收到正常信號(hào)了???源程序是這樣的:
#include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
typedef unsigned int u16; //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;
/*******************************************************************************
* 函數(shù)名 :UsartInit()
* 函數(shù)功能 :設(shè)置串口
* 輸入 : 無(wú)
* 輸出 : 無(wú)
*******************************************************************************/
void UsartInit()
{
SCON=0X50; //設(shè)置為工作方式1
TMOD=0X20; //設(shè)置計(jì)數(shù)器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
TL1=0XF3;
ES=1; //打開接收中斷
EA=1; //打開總中斷
TR1=1; //打開計(jì)數(shù)器
}
/*******************************************************************************
* 函 數(shù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void main()
{
UsartInit(); // 串口初始化
while(1);
}
/*******************************************************************************
* 函數(shù)名 : Usart() interrupt 4
* 函數(shù)功能 : 串口通信中斷函數(shù)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
*******************************************************************************/
void Usart() interrupt 4
{
u8 receiveData;
receiveData=SBUF;//出去接收到的數(shù)據(jù)
RI = 0;//清除接收中斷標(biāo)志位
SBUF=receiveData;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標(biāo)志位
}
作者: zl2168 時(shí)間: 2016-8-6 09:53
本帖最后由 zl2168 于 2016-8-6 09:55 編輯
實(shí)例77 雙機(jī)串行通信方式1
先Proteus仿真一下,確認(rèn)有效。
串1.jpg (113.33 KB, 下載次數(shù): 127)
下載附件
2016-8-6 09:54 上傳
以上摘自張志良編著《單片機(jī)實(shí)驗(yàn)實(shí)訓(xùn)100例》 ISBN 978-7-5124-1603-1,北航社出版
書中電路和程序設(shè)計(jì)有詳細(xì)說(shuō)明,程序語(yǔ)句條條有注解。
作者: zl2168 時(shí)間: 2016-8-6 09:55
實(shí)例78 雙機(jī)串行通信方式2
先Proteus仿真一下,確認(rèn)有效。
串2.jpg (274.9 KB, 下載次數(shù): 148)
下載附件
2016-8-6 09:56 上傳
以上摘自張志良編著《單片機(jī)實(shí)驗(yàn)實(shí)訓(xùn)100例》 ISBN 978-7-5124-1603-1,北航社出版
書中電路和程序設(shè)計(jì)有詳細(xì)說(shuō)明,程序語(yǔ)句條條有注解。
作者: zl2168 時(shí)間: 2016-8-6 10:10
實(shí)例79 雙機(jī)串行通信方式3
先Proteus仿真一下,確認(rèn)有效。
串3.jpg (190.6 KB, 下載次數(shù): 124)
下載附件
2016-8-6 10:11 上傳
以上摘自張志良編著《單片機(jī)實(shí)驗(yàn)實(shí)訓(xùn)100例》 ISBN 978-7-5124-1603-1,北航社出版
書中電路和程序設(shè)計(jì)有詳細(xì)說(shuō)明,程序語(yǔ)句條條有注解。
作者: zl2168 時(shí)間: 2016-8-6 10:13
實(shí)驗(yàn)16 單片機(jī)與PC機(jī)虛擬串行通信
先Proteus仿真一下,確認(rèn)有效。
pc.jpg (298.36 KB, 下載次數(shù): 127)
下載附件
2016-8-6 10:13 上傳
以上摘自張志良編著《80C51單片機(jī)實(shí)用教程》ISBN978-7-04-044532-9,高教社出版。 書中電路和程序設(shè)計(jì)有詳細(xì)說(shuō)明,程序語(yǔ)句條條有注解。
作者: baofu 時(shí)間: 2016-8-6 16:43
帖子中說(shuō)的不清楚,按常理,改動(dòng)單片機(jī)波特率后,另一端的波特率也要改得與之一致才行,如果收、發(fā)雙方波特率不相等,當(dāng)然會(huì)出問(wèn)題。
希望能幫到你。
作者: pengrubin 時(shí)間: 2016-8-6 20:58
學(xué)習(xí)下?纯戳
作者: 夏日有余暉 時(shí)間: 2016-8-7 19:46
我全都改了,也不行,收到的是亂碼
作者: 夏日有余暉 時(shí)間: 2016-8-7 19:48
謝謝了,不過(guò)覺得好麻煩,只是一個(gè)很簡(jiǎn)單的問(wèn)題
作者: xljxlj 時(shí)間: 2016-8-7 21:04
可能有干擾,把線減短試試。
作者: jubaolun 時(shí)間: 2016-8-8 09:36
波特率,數(shù)據(jù)位,停止位.效驗(yàn)位.正確嗎;還有晶振頻率.
作者: 夏日有余暉 時(shí)間: 2016-8-8 11:32
我是按著郭天祥那本書上來(lái)的,書上并沒有說(shuō)要改數(shù)據(jù)位、停止位、校驗(yàn)位,還有晶振頻率。。。。。。。。。。。。。。。。。。。。。。。。。
作者: 夏日有余暉 時(shí)間: 2016-8-8 11:52
已經(jīng)很短了 十厘米左右 我4800bps正常
作者: wangliannc 時(shí)間: 2016-8-8 13:57
/*-------------------------------------------------
串口 初始化函數(shù) (可變更波特率 ) 串口_波特率_初始 無(wú)EA=1 ;//z總中斷 開
--------------------------------------------------*/
void chuankou_BTL_int(UINT16 botelv)
{
SCON = 0x50; //配置串口為模式 1
TMOD &= 0x0F; //清零 T1 的控制位
TMOD |= 0x20; //配置 T1 為模式 2
TH1 = 256 - (11059200/12/32)/botelv; //計(jì)算 T1 重載值
TL1 = TH1; //初值等于重載值
// ET1 = 0; //禁止 T1 中斷 此句似乎沒用因?yàn)門1是自動(dòng)重裝的方式
ES = 1; //使能串口中斷
TR1 = 1; //啟動(dòng) T1
}
/*-------------------------------------------------
串口 初始化函數(shù) (固定波特率9600 ) 串口_波特率固定_9600MHZ 無(wú)EA=1 ;//z總中斷 開
--------------------------------------------------*/
void chuankou_int()
{
SCON = 0x50; //配置串口為模式 1
TMOD |= 0x20; //TMOD: timer1, mode 2,8bit 自動(dòng)重裝
PCON = 0x00; //波特率正常模式, 如PCON=0x80是波特率加倍模式
TH1 = 0xFD; // 9600MHZ 在晶振11.0592MHZ 下 可查表
TL1 = 0xFD; //初值等于重載值
// ET1 = 0; //禁止 T1 中斷 此句似乎沒用因?yàn)門1是自動(dòng)重裝的方式
ES = 1; //使能串口中斷
TR1 = 1; //啟動(dòng) T1
}
9600用的TH1和TL =0xfd
作者: wangliannc 時(shí)間: 2016-8-8 13:58
如上回復(fù) 給了2個(gè) 初始化的函數(shù)。我用的是正常的
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |