A. C語言---51單片機與PC串口通信程序
可以用個一維陣列來儲存,然後判斷是否為3.06
B. 請問51單片機與51單片機之間的串口通信程序怎麼寫
1、查詢方式:
#include<reg51.h>
main()
{
unsigned char dat;
TMOD=0x20;
TH1=TL1=0xfd;
SCON=0x50;
TR1=1;
while(1)
{
if(RI)//接收
{
RI=0;
dat=SBUF;
}
SBUF=dat;//發送
while(!TI);
TI=0;
}
}
2、中斷方式:
#include<reg51.h>
unsigned char dat;
bit flag;
void uart_isr() interrupt 4
{
if(RI)//接收
{
RI=0;
dat=SBUF;
flag=1;
}
if(TI)TI=0;
}
main()
{
TMOD=0x20;
TH1=TL1=0xfd;
SCON=0x50;
TR1=1;
EA=1;
ES=1;
flag=0;
while(1)
{
if(flag)
{
SBUF=dat;
flag=0;
}
}
}
C. 如何實現2個51單片機之間通過串口通信的源程序
匯編編寫的模擬串口通信程序
T2作為波特率控制
UART_RXD 是硬中斷0或1口,如果能進入中斷,說明該線有一個起始位產生,進入中斷後調
用下面的接收程序。退出硬中斷之前還需要將硬中斷標志重新復位。
UART_TXD是任何其它IO即可。
UART_SEND:
PUSH IE
PUSH DPH
PUSH DPL
PUSH PSW
PUSH 00H
PUSH ACC
CLR EA
SETB UART_TXD ;START BIT
MOV R0,A
CLR TR2 ;TR2置1,計數器2啟動,時間計數啟動。
MOV A,RCAP2L;計數器2重新裝載值
MOV TL2,A ;置計數器2初值 ;T2需要重新裝載
MOV A,DPH
MOV A,RCAP2H
MOV TH2,A
MOV A,R0
SETB TR2 ;TR2置1,計數器
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
CLR UART_TXD ;START BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
MOV R0,#08H
UART_SEND_LOOP:
RRC A
MOV UART_TXD,C ;8 BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
DJNZ R0,UART_SEND_LOOP
SETB UART_TXD ;END BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
POP ACC
POP 00H
POP PSW
POP DPL
POP DPH
POP IE
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UART_REC:
PUSH IE
PUSH DPH
PUSH DPL
CLR EA
CLR TR2 ;TR2置1,計數器2啟動,時間計數啟動。
MOV A,RCAP2L;計數器2重新裝載值
MOV TL2,A ;置計數器2初值 ;T2需要重新裝載
MOV A,DPH
MOV A,RCAP2H
MOV TH2,A
JB UART_RXD,$ ;REC
SETB TR2 ;TR2置1,計數器2啟動,時間計數啟動。
JNB TF2,$
CLR TF2 ;0.5 BIT
JNB TF2,$
CLR TF2 ;1 BIT
JNB TF2,$
CLR TF2 ;1.5 BIT
MOV C,UART_RXD
MOV ACC.0,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;2.5
MOV C,UART_RXD
MOV ACC.1,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;3.5
MOV C,UART_RXD
MOV ACC.2,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;4.5
MOV C,UART_RXD
MOV ACC.3,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;5.5
MOV C,UART_RXD
MOV ACC.4,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;6.5
MOV C,UART_RXD
MOV ACC.5,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;7.5
MOV C,UART_RXD
MOV ACC.6,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;8.5
MOV C,UART_RXD
MOV ACC.7,C
JNB TF2,$
CLR TF2 ;9.5
JNB UART_RXD,$ ;等待停止位,並重新復位計數器
SETB UART_RXD
POP DPL
POP DPH
POP IE
RET
補充回答:
串口調試
1. 發送:向匯流排上發命令
2. 接收:從匯流排接收命令,並分析是地址還是數據。
3. 定時發送:從內存中取數並向主機發送.
經過調試,以上功能基本實現,可以通過上位機對單片機進行實時控制。
程序如下:
//這是一個單片機C51串口接收(中斷)和發送常式,可以用來測試51單片機的中斷接收
//和查詢發送,發送沒有必要用中斷,因為程序的開銷是一樣的
#include <reg51.h>
#include<stdio.h>
#include <string.h>
#define INBUF_LEN 4 //數據長度
unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3 , flag,temp,ch;
bit read_flag=0;
sbit cp=P1^1;
sbit DIR=P1^2;
int i;
unsigned int xdata *RAMDATA; /*定義RAM地址指針*/
unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ;
void init_serialcomm(void)
{
SCON=0x50; //在11.0592MHz下,設置串列口波特率為9600,方式1,並允許接收
PCON=0x00;
ES=1;
TMOD=0x21; //定時器工作於方式2,自動裝載方式
TH0=(65536-1000)%256;
TL0=(65536-1000)/256;
TL1=0xfd;
TH1=0xfd;
ET0=1;
TR0=1;
TR1=1;
// TI=0;
EA=1;
// TI=1;
RAMDATA=0x1F45;
}
void serial () interrupt 4 using 3
{
if(RI)
{ RI=0;
ch=SBUF;
TI=1; //置SBUF空
switch(ch)
{
case 0x01 :printf("A"); TI=0;break;
case 0x02 :printf("B"); TI=0;break;
case 0x03 :printf("C"); TI=0;break;
case 0x04 :printf("D"); TI=0;break;
default :printf("fg"); TI=0;break;
}
}
}
//向串口發送一個字元
void timer0() interrupt 1 using 3{
// char i;
flag++;
TH0=0x00;
TL0=0x00;
if(flag==10)
{// cp=!cp;
// for(i=0;i<6;i++)
P2=0x25;
TI=1;
temp=*RAMDATA;
printf("%c",temp);
TI=0;
// RAMDATA--;
flag=0;
}
}
//主程序
main()
{
init_serialcomm(); //初始化串口
//向6264中送數據
{
*RAMDATA=0x33;
}
while(1)
{
*RAMDATA=0x33;;
}
}
調試需要注意的問題:
1. 發送過程:在發送時必須保證TI=1:即發送緩沖器為空,否則將導致數據發不出去,如果想強制發送可以用:TI=1.具體發送數據:利用printf(「abcd」);函數直接發送即可。
2. 接收過程:在接收時多選用中斷方式,這樣可以節約CPU的時間,提高效率,
D. 51單片機串口通信c語言編程
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
sbit ring=P3^7;
sbit CASE1=P2^0;
sbit CASE2=P2^1;
sbit CASE3=P2^2;
sbit CASE4=P2^3;
uchar se=0,re=0;
uchar temp=0;
void wait(uint cnt)
{
while(--cnt);
}
//串口發送程序
void send(uchar se)
{
SBUF=se; //發送數據
while(TI == 0);
TI = 0;
}
//串口接收程序
uchar receive(void)
{
re=SBUF; //接收數據
while(RI==0);
RI=0;
return re;
}
//串口初始化
void sinti(void)
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = 0xFD;
TR1 = 1;
EA = 1;
ES = 1;
}
void delay(int cnt)
{
while(--cnt);
}
//主程序
int main (void)
{
int i;
sinti(); //串口初始化程序
ring=1;
while(1)
{
while (1)
{
if(CASE1==0)
{
send('a');
ring=0;
break;
}
if(CASE2==0)
{
send('b');
ring=0;
break;
}
if(CASE3==0)
{
send('c');
ring=0;
break;
}
if(CASE4==0)
{
send('d');
ring=0;
break;
}
}
if(ring==0)
{
wait(60000);
ring=1;
}
for(i=0;i<10000;i++);
}
}
//串口中斷程序
void UART_SER (void) interrupt 4 //串列中斷服務程序
{
if(RI) //判斷是接收中斷產生
{
RI=0; //標志位清零
temp=SBUF;
}
if(TI) //如果是發送標志位,清零
TI=0;
}
E. 51單片機串口通信程序
程序不正確,你這個程序的結果,應該是電腦上發一次''1",後永遠 SBUF=='1' ,所有在重復
亮 與 滅,因為時間很快,人眼睛反應不過來,所以 一直是 亮 的,
簡單的 你 可以改變 一種方式 試試, 發''1" 亮, 發''0" 滅,
去掉 if(cont==0),if(cont==1) 等等。
F. 高分求51單片機串口通信的程序
利用方式1實現單片機雙機通信,主頻為6M,波特率為2400bps,電路見圖5-10。當兩個單片機距離較近時,甲、乙兩機的發送端與接收端分別直接相聯,兩機共地。執行程序,甲機將亮燈信號發送給乙機,若通信正常,乙機接收到信號後點亮20個發光二極體。乙機採用查詢與中斷兩種工作方式。當然20個LED乙機可單獨控制,也可接受甲機的控制,並執行甲機指令,還需要進一步完善程序.
甲機發送程序:
org 0000h
sta: mov tmod,#20h ;設置波特率
mov tl1,#0FAh
mov th1,#0FAh
setb tr1
mov scon,#40h ;置工作方式1
clr ti
mov a,#00h
mov sbuf,a ;發送亮燈信號
wait: jbc ti,cont ;發送成功清標志
ajmp wait ;等待發送完畢
cont: sjmp sta ;重復發送
end
乙機查詢工作方式接收:
org 0000h
mov tmod,#20h ;設置通信波特率
mov tl1,#0FAh
mov th1,#0FAh
setb tr1
mov scon,#40h
clr ri
setb ren ;允許接收
wait: jbc ri,read ;接收成功清標志
ajmp wait ;接收未完等待
read: mov a ,sbuf
mov p1,a ;接收亮燈信號送P1口
sjmp $
end
乙機中斷工作方式接收
org 0000h
ajmp main
org 0023h
ajmp zd ;轉串口中斷程序
START: MOV TMOD,#20h
mov tl1,#0FAh
mov th1,#0FAh
setb tr1
mov scon,#50h
clr ri
mov ie,#90h ;開中斷
MAIN:sjmp $ 主程序
zd: clr ri ;清接收標志
;==============中斷程序還要再完善==============
mov a ,sbuf ;讀接收信號
mov p1,a
MOV R1,A ;將收到的信號送緩存
reti ;中斷返回
end
採用方式2 通信,數據幀格式是11位的,TB8為奇偶校驗位,接收過程要求判斷RB8,若出錯置F0標志為1,正確則置F0標志為0,然後返回。發送波特率375kbps,晶振為12MHz,所以SMOD=l。由於傳送數據的波特率與定時器無關,所以程序中無需對定時器編程.
send:
MOV SCON,#80H ;設置串列口為方式2
MOV PCON,#80H ;SMOD=l
MOV R0,#50H ;設數據塊指針
MOV R7,#20 ;設數據塊長度
STA: MOV A,@R0 ;取數據給A
MOV C,P
MOV TB8,C ;奇偶位P送給TB8,
MOV SBUF,A ;啟動發送
;====================================================
WAIT: JBC TI,CONT ;若發完一幀數據,清標志後發下一幀數據
AJMP WAIT ;未完等待
;=======================================================
CONT:INC R0 ;修改數據指針
DJNZ R7,STA ;循環發送至結束
RET
;========================================================
;乙機接收程序如下:
; 在進行雙機通信時,兩機應採用相同的工作方式和波特率。
;=============================================================
MOV SCON,#90H ;設置串列口為方式2,REN為1,允許接收
MOV PCON,#80H ;SMOD=1
MOV R0,#50H ;設置數據塊首址
MOV R7,#20 ;置數據塊長度
;=========================================================
WAIT:JBC RI,READ ;接收完一幀數據則RI清零並讀入數據
AJMP WAIT ;未完等待
;==========================================
READ:MOV A,SBUF ;讀入數據
JNB PSW.0,PZ ;收到數為偶數則轉
JNB RB8,ERR ;收到數為奇數,發端為偶數則通信出錯
SJMP RIGHT ;相符則正確
PZ:JB RB8,ERR ;收到數為偶數,發端為奇數則出錯
;========================================
RlGHT:MOV @R0,A ;通信正確,存放數據
INC R0 ;更改地址指針
DJNZ R7,WAIT ;數據塊接收完否,未完繼續
CLR PSW.5 ;通信正確,置F0為0
RET ;返回
ERROR:SETB PSW.5 ;通信出錯,置F0為l
RET ;返回
G. 兩個51單片機之間串口通訊程序
參考一下:
http://hi..com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/725053edc5cec62d27979143.html
H. 51單片機與PC串口通信程序,求指導 ! 具體要求如下:
功能如下:
1、程序燒進去,串口接收顯示一個菜單!《如圖》A、B、……分別代表一定的功能
例如:A項,代表修改ds1302的時間的數組
2、按照菜單的提示,如:發送A就進入了修改ds1302的時間函數,串口接收界面顯
示 A,像圖片那種,並顯示修改ds1302的操作方法,如從串口發送界面發送
0162115347就表示10年10月16日21時15分34秒星期7,
3、正如第二所說,馬上輸入1010162115347,就成功的修改了ds1302相關數據,
並返回change success!到串口界面!
4、設置一個功能就是返回主菜單界面。然後又可以就行第二、三步的操作!
5、通過串口,讀取單片機裡面相關的數據,如時鍾的數據
6、說明:可以不要ds1320相關的程序,可以用發光二極體亮來代表修改功能!
I. 51單片機串口通信的過程
單片機要用串口通信,用中斷是最好不過的了,因為單片機的內部運行速度非常快(相對串口來說的),發送後需要等好久,這段時間你可以安排它做別的事,當然你可以不用中斷,那就是由軟體來模擬串口進行,但這樣程序設計就更麻煩,單片機也不能做別的事了!