① 我用80C51單片機做模擬,有一個串列口的實驗,請問高手下面這段程序對嗎
匯編看的好累啊,51也很長時間沒用了。
51單片機中的所有外設,都可以在程序中多次設置,不會有隻能設置一次的情況。
串列口輸出肯定是可以用示波器檢測到的,如果沒檢測到,應該是串口沒有工作,具體為什麼沒工作,要看程序設置的是不是有問題。
串口工作在非同步方式下,必須設置波特率。
② 簡述c51單片機串列口數據發送和數據接收過程
參考吳鑒鷹吧裡面的資料,我也學習單片機,有吳鑒鷹單片機開發板(評價不錯的一款單片機開發板),這樣實驗+理論,然後看視頻學習會更好。有興趣可以看下
串列口初始化編程格式:
SIO: MOV TMOD,#20H ;T1作波特率發生器
MOV TH1,#X ;定時初值選定波特率
MOV TL1,#X MOV PCON,#00H ;SMOD=0,就是波特率不增倍CLR TI ;清除發送中斷標志SETB TR1 ;打開定時器1 2、發送程序
查詢方式: TRAM: MOV A,@R0 ;取數據
MOV SBUF,A ;發送一個字元
WAIT:JBC TI,NEXT ;等待發送結束
SJMP WAIT NEXT: INC R0 ;准備下一次發送
SJMP TRAM3、接收程序
WAIT: JBC RI,NEXT ;查詢等待
SJMP WAIT NEXT: MOV A,SBUF ;讀取接收數據
MOV @R0,A ;保存數據
INC R0 ;准備下一次接收
SJMP WAIT 這個是用軟體查詢方法做的,沒有設定數據校驗。
③ 89C51單片機到PC機數據傳送實驗
匯編語言:
ORG0000H
LJMPSt
ORG0020H
St:
CLRA
MOVR7,A
ANLPCON,#0x7F ;波特率不倍速
MOVSCON,#0x50 ;8位數據,可變波特率
ANLTMOD,#0x0F ;清除定時器1模式位
ORLTMOD,#0x20 ;設定定時器1為8位自動重裝方式
MOVTL1,#0xE8 ;設定定時初值
MOVTH1,#0xE8 ;設定定時器重裝值
CLRET1 ;禁止定時器1中斷
SETBTR1 ;啟動定時器1
LOOP1:
CLRTI
MOVSBUF,R7 ;串口發送
INCR7
SETBC
MOVA,R7
XRLA,#0x80
SUBBA,#0xE4
JCLOOP2
CLRA
MOVR7,A
LOOP2:
JBTI,LOOP1
SJMPLOOP2
end
調試結果:
④ 單片機串列口設計走馬燈,斷開其中兩根串口線其中一條,為什麼不會影響實驗結果
單片機串列口設計走馬燈,斷開其中兩根串口線其中一條,為什麼不會影響實驗結果
⑤ 單片機串口
關於串口實驗你可以看看這篇文章:
http://www.hificat.com/dpj_step/rs232.asp
手把手教你用增強型51實驗板實現RS232串口通信 《電子製作》2006年8月 站長原創,如需引用請註明出處
上一期,我們已經利用增強型51實驗板學會了單片機控制步進電機轉動的方法,這一期,我們將一起來學習一下單片機如何與PC機進行通信,一起來完成一個簡單的RS232通信實例,我們不做太多的理論,從實例出發,相信能夠給大家一個比較通俗、透徹地認識,掌握了它的原理,那你就可以編出任何和PC機進行通信的程序了。
前幾期,我們學習和介紹的內容都是以單機的形式,即所有的功能都是在一塊增強型51實驗板上得以實現。當單片機技術具體應用到工廠、企業及各類工業、民用領域中,它肯定要與外部設置作數據傳輸,其交互性也使得單片機的應用越來越廣泛,我們可以利用它來傳數據,傳控制命令等等。因此,單片機與PC機的通信是我們學習單片機技術所經歷的必要環節,由此,也使我們的學習更具趣味性。
下面我們一起來完成一個用單片機從串列口接收PC機數據,並在數碼管上顯示出來的實驗。
先介紹一下串口通信基本知識。目前較為常用的串口有9針串口(DB9)和25針串口(DB25)。最為簡單且常用的是三線制接法,即地、接收數據和發送數據三腳相連,本文只涉及到最為基本的接法,且直接用RS232相連。串口引腳定義如圖1所示。
9針串口(DB9) 25針串口(DB25)
針號
功能說明
縮寫
針號
功能說明
縮寫
1
數據載波檢測
DCD
8
數據載波檢測
DCD
2
接收數據
RXD
3
接收數據
RXD
3
發送數據
TXD
2
發送數據
TXD
4
數據終端准備
DTR
20
數據終端准備
DTR
5
信號地
GND
7
信號地
GND
6
數據設備准備好
DSR
6
數據准備好
DSR
7
請求發送
RTS
4
請求發送
RTS
8
清除發送
CTS
5
清除發送
CTS
9
振鈴指示
DELL
22
振鈴指示
DELL
圖1 DB9和DB25的常用信號腳說明
我們來看一下本次實驗的電路圖,如圖2所示,即增強型51實驗板實現串口通信及數碼管顯示的電路部分。圖2中的4個三極體分別與4個共陽數碼管相連,是各個數碼管的使能端,分別通過單片機的P2.0,P2.1,P2.2,P2.3來控制,數碼管顯示的詳細工作原理,我們已在前幾期雜志中作過介紹,有興趣的朋友可以去看一下以前幾期的內容。圖2中MAX232晶元起到RS232與TTL電平轉換的作用,我們通過9芯串口與PC機相連。
圖2 硬體電路原理圖
下面是我們完成本次實驗的源程序代碼,使用Keil編譯軟體,將其編譯生成HEX文件,然後,通過A51編程器燒入AT89S51晶元即可。
#include "reg51.h"
#include <absacc.h>
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char dat;
void Init_Com(void)
{
TMOD = 0x20; //定時器工作方式2,初值自動裝入
PCON = 0x00; //波特率不增倍
SCON = 0x50; //串列工作方式設定
TH1 = 0xFd; //定時器初值高位
TL1 = 0xFd; //定時器初值低位
TR1 = 1; //啟動定時器
}
/*函數功能:LED數碼管延時程序*/
void delay(void)
{
int k;
for(k=0;k<600;k++);
}
/*函數功能:LED數碼管顯示程序*/
void display(int k)
{
P2=0xfe; //位選
P0=tab[k/1000]; //顯示千位數字
delay(); //延時
P2=0xfd; //位選
P0=tab[k%1000/100]; //顯示百位數字
delay(); //延時
P2=0xfb; //位選
P0=tab[k%100/10]; //顯示十位數字
delay(); //延時
P2=0xf7; //位選
P0=tab[k%10]; //顯示個位數字
delay(); //延時
P2=0xff; //位選
}
/*函數功能:主程序*/
void main()
{
P2=0xff; //埠初始化,關LED顯示
P0=0xff;
Init_Com(); //調用串口初始化程序
while(1) //主循環
{
if ( RI ) //判斷是否收到數據
{
dat = SBUF; //接收數據
RI = 0; //軟體清除標志位
}
display(dat-48); //顯示收到的數據
}
}
我們來一起分析一下程序代碼,main主程序首先將P2口和P0口全部輸出高電平,即數據管不顯示任何內容,Init_Com函數用來初始化串口設置,如波特率設置,工作方式的設置,這些都是程序運行的一切初始化設置。然後,我們看到了一個while(1)語句,該語句的作用是產生死循環,即單片機上電復位後,我們就不斷地去接收由PC機發過來的串口數據,同時將接收到的數據放在dat 這個變數中,每接收完一次數據,我們需要執行RI = 0這條語句,用來清除串口數據接收標志位,現在我們已經收到了PC機傳過來的數據了,餘下的任務就是要將數字通過數碼管顯示出來,我想大家看了我們前幾期的介紹,已經並不陌生數碼管的使用了,在這里,我們也寫得非常簡潔,通過display這個函數將數字顯示出來,因為我們收到的是字元型的ASCII碼數據,如數字「0」的ASCII碼值是48,所以,我們要顯示「0」的話,還需要將其值減去48後才是真正要顯示的數據。數碼管我們採用動態掃描法進行顯示,delay函數的作用是產生一定時間的延時,對於人眼來說是分辨不出來的,在display的函數體內,我們先將數據裝載到P0口,如我們在程序開始時定義的:unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}語句,意思相當於:數字「0」對應的數碼管段碼值為「0xc0」, 數字「1」對應的數碼管段碼值為「0xf9」, 數字「2」對應的數碼管段碼值為「0xa4」……以此類推,最後通過數碼管的使能端來顯示各位數碼管的值。至此,整個程序的功能就輕松地實現了我們所需要的功能,看到這里相信你現在對串列通信感到並不是原來想的那麼深奧了吧。
現在我們已經將程序寫好,並燒入了單片機晶元,下面我們要做的就是用串口線將增強型51實驗板和PC機相連起來,同時給實驗板接上電源,然後就是通過PC機軟體來發數據了,要在PC機上向串口發送數據一定要藉助相應軟體,打開光碟內附帶的串口調試軟體,它設置方便、靈活,界面簡潔明。因為我們得告訴實驗板來顯示哪些數字,程序的功能是發送「1」、「2」、「3」......「8」、「9」、「0」等字元,增強型51實驗板收到數據後通過數碼管顯示出來,所以我們得在軟體發送區內填上我們所需要發送的數字,如圖3所示。
圖3
串口調試軟體中,設置參數如下:串口:COM1;波特率:9600;校驗位:無;數據位:8位;停止位:1位;發送內容:5
當我們點擊「手動發送」按鈕後,我們可以看到增強型51實驗板上的數碼管已顯示數字「5」的字樣,如圖4所示。當然,我們也可以選擇「自動發送」,即每隔一定的時間,由軟體自動發送「發送緩沖區」內的數據,時間周期可以在軟體界面中設置。
圖4
現在,你已經可以自由發揮來接收PC機發過來的數據了,只要發揮你的想像力,定義好PC機和單片機兩端的數據通信協議,你可以做出任何通過電腦來對單片機進行控制的程序,實現各種各樣的數據傳輸,遠程式控制制功能,比如通過PC機來控制液晶顯示、控制步進電機的轉動、控制蜂鳴器奏樂等等,您也可以將本期所講的知識與前幾期所講的關聯起來,完成功能更多,更實用的具體應用實例。因此,到本期的學習,我們已經可以將單片機與PC相連,藉助PC機強大而靈活的功能,就可以為我們解決各類實際生產及應用型問題提供了方便。這一期的內容我們就介紹到這里,增強型51實驗板更多的學習內容,我們將在以後幾期陸續為大家作介紹,祝大家學習順利。
⑥ 單片機串口實驗
;;用單片機口串口通信工作於方式0,串列輸出,
;;再接CD4094或74HC164寄存器實現並出,8個發光管從左到右交替地亮滅
;;P1.0接CD4094的STR作並出允許控制,RXD接DATA,TXD接CLK作時鍾
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 000H
JMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV SCON,#00H;設串口方式0
MOV A,#80H;最左位先亮
CLR P1.0;關並行輸出
OUT0:
MOV SBUF,A;串出
OUT1:JBC T1,NEXT
JMP OUT1
NEXT:SETB P1.0;並出
CALL DELAY ;延時一會
RR A
CLR P1.0
AJMP OUT0
DELAY: MOV R7,#250
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
RET
END
⑦ 單片機串列通信實驗
1、實驗:用單片機串列口,實現兩個實驗台之間的串列通訊。其中一個實驗台作為發送方,
另一側為接收方。發送方讀入按鍵值,並發送給接收方,接收方收到數據後在LED上顯示
2、原理:串列通信是指數據按位順序傳送的通信。串列數據傳送的特點是:通信線路簡單,最多隻需一對傳輸線即可實現通信,成本低但速度慢,其通信線路既能傳送數據信息,又能傳送控制信息。它對信息的傳送格式有固定要求,具體分為非同步和同步兩種信息格式.與此相應有非同步通信和同步通信兩種方式;在串列通信中,對信息的邏輯定義與TTL不兼容,需要進行邏輯電平轉換:計算機與外界的數據傳送大多是串列的,其傳送的距離可以從幾米到幾千公里。單片機中使用的串列通信通常都是非同步方式的
3、實驗目的:1)掌握單片機串列口工作方式的程序設計,及簡易三線式通訊的方法。 2)了解實現串列通訊的硬環境、數據格式的協議、數據交換的協議。 3)學習串口通訊的中斷方式的程序編寫方法
4、參考實現:
http://wenku..com/link?url=uyYKlkBQqwjGl-akFJ3xWa67R814ShF50uwd3
⑧ 8031雙機串列通信實驗設計
哎直接給我算咯, 串列通信
一、實驗目的
1、掌握串列口工作方式2的程序設計,掌握單片機通信程序編制方法。
2、了解實現串列通信的硬環境,數據格式的協議,數據交換的協議。
3、掌握雙機通信的原理和方法。
二、實驗設備
DVCC模擬系統二套。
三、實驗內容
1、 利用8031單片機串列口,實現雙機通信。將1號實驗機鍵盤上鍵入的數字顯示到2號實驗機的數碼管上。
四、實驗步驟
1、按圖接線
2、兩台DVCC實驗系統處於「P.」狀態下。
3、在1號機上選擇「雙機通信」發送程序,編譯並連接,輸入0D00後,按EXEC鍵。
4、在2號機上選擇「雙機通信」接收程序,編譯並連接,輸入0E30後,按EXEC鍵。
5、從1號機的鍵盤上輸入數字鍵,會顯示在3號機的顯示器上。
五、實驗線路
六、程序框圖
一 工作方式
1)方式 0
當設定SM1、SM0為00時,串列口工作於方式0,在方式0下,RXD為數據輸入/輸出端,TXD為同步脈沖輸出端,發送或接收的數據為8位,低位在前,高位在後,方式0的波特率固定為ƒ /12,也就是每一機器周期傳送一位數據。方式0可以外接移位寄存器,將串列口擴展為並行口,也可以外接同步輸入/輸出設備。
2)方式 1
當設定SM1、SM0為01時,串列口工作方式1。方式1為波特率可變的8位非同步通信方式,由TXD發送RXD接收,一幀數據為10位,1位起始位(低電平),8位數據位(低位在前)和1位停止位(高電平),波特率取決於定時器 的T 溢出率(1/溢出周期)和波特率的選擇位SMOD。
波特率 = *(定時器T 溢出率)
3)方式2和方式3
當設定SM0、SM1為10或11時,串列口工作於方式2或方式3,這兩種方式都是9位非同步通信,僅波特率不同,適用於多機通信。在方式2或方式3下,數據由TXD發送RXD接收,1幀數據為11位,1位起始位(低電平),8位數據位(低位在前),1位可編程位(第9位數據,用作奇偶校驗或地址/數據選擇),1位停止位(高電平)。與方式1相比,多了一位可編程位,發送時,第9位數據為TB8,接收時,第9位數據送入RB8。
方式(2)波特率 = *ƒ
方式(3)波特率 = *(定時器T 溢出率)
二 波特率的設置
Mcs-51系列單片機串列通信的波特率取決於串列口的工作方式。方式0的波特率固定等於ƒ /12,方式2的波特率有兩種:當SMOD=0時,波特率=ƒ /64;當SMOD=1時,波特率=ƒ /32。 SMOD是PCON寄存器的最高位,通過軟體可設置SMOD=0或1,但注意PCON無位定址功能。
當串列口工作於方式1和方式3時,波特率= *定時器T 溢出率/32,其中T 溢出率=1/T 溢出周期。因此,影響波特率的因素除了設定的SMOD值以外,還有T 溢出率,使波特率的設置更靈活,范圍更廣。下面說明溢出率計算和波特率設方法。
1) T 溢出率的計算
串列通信方式1和3 下,使用定時器T 作為波特率發生器。T 可以工作於方式0、方式1和方式2。其中方式2為自動裝入時間常數的8位定時器使用時只需進行初始化,不需要安排中斷服務程序重裝時間常數,因此是一種常用方式。
Mcs-51系列單片機定時器時間計算式為:
T = (2 -N)*12/ƒ
式中:T ——定時器溢出周期
n ——定時器位數
N——時間常數即定時器初值
ƒ ——振盪頻率(2 -N)*12/ƒ
當定時器T 工作於方式2,則有
溢出周期=(2 -N)*12/ƒ
溢出率=1/溢出周期= ƒ /12*(2 -N)
2)波特率的設置:由上述可得當串列口工作於方式1或方式3,定時器T 工作於方式2時。 波特率 = 2 * T 溢出率/32
=2 * ƒ /[32*12(2 -N)
;系統晶振是 6.0 MHz
ORG 0E30H
START:
MOV SP,#60H
mov A,#02H
MOV R0,#79H
MOV @R0,A
INC R0
MOV A,#10H
MOV @R0,A
INC R0
MOV A,#01H
MOV @R0,A
INC R0
MOV A,#03H
MOV @R0,A
INC R0
MOV A,#00H
MOV @R0,A
INC R0
MOV A,#08H
MOV @R0,A
MOV A,#7EH
MOV DPTR,#1FFFH
MOVX @DPTR,A
MOV SCON,#50H ;串口 方式 1
MOV TMOD,#20H ;T1 方式 1
MOV TL1,#0CCH ;波特率 9600 的常數
MOV TH1,#0CCH
SETB TR1 ;開中斷
CLR ET1
CLR ES
WAIT:
JBC RI,DIS_REC ;是否接收到數據
LCALL DISP ;
SJMP WAIT ;
DIS_REC:
MOV A,SBUF ;讀串口接收到的數據
LCALL DATAKEY ;顯示輸入的數字(0-F)
DB 79H,7EH
AJMP WAIT
DATAKEY:MOV R4,A
MOV DPTR,#1FFFH
MOVX A,@DPTR
MOV R1,A
MOV A,R4
MOV @R1,A
CLR A
POP 83H
POP 82H
MOVC A,@A+DPTR
INC DPTR
CJNE A,01H,DATAKEY2
DEC R1
CLR A
MOVC A,@A+DPTR
DATAKEY1:PUSH 82H
PUSH 83H
MOV DPTR,#1FFFH
MOVX @DPTR,A
POP 83H
POP 82H
INC DPTR
PUSH 82H
PUSH 83H
RET
DATAKEY2:DEC R1
MOV A,R1
SJMP DATAKEY1
DISP: SETB 0D4H
MOV R1,#7EH
MOV R2,#20H
MOV R3,#00H
DISP1:
MOV DPTR,#DATACO
MOV A,@R1
MOVC A,@A+DPTR
MOV DPTR,#0FF22H
MOVX @DPTR,A
MOV DPTR,#0FF21H
MOV A,R2
MOVX @DPTR,A
LCALL DELAY
DEC R1
CLR C
MOV A,R2
RRC A
MOV R2,A
JNZ DISP1
CLR 0D4H
RET
DELAY: MOV R7,#03H
DELAY0: MOV R6,#0FFH
DELAY1: DJNZ R6,DELAY1
DJNZ R7,DELAY0
RET
DATACO: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0BFH,0CH,89H,0DEH
END