⑴ 51單片機通過串口實現數據的發送與接收程序
串口收發,要有通信協議。也就是什麼時候開始接收,接收到指令後,轉發什麼數據。這個要知道,才可以寫。而且使用不同的51單片機,其內部寄存器配置是不同的。
一般來說,過程如下:
1,配置串口參數、波特率等,開啟串口中斷;
void Init_UART()
{
}
2,中斷函數里寫中斷響應函數,根據接收的指令或者數據,執行相應的動作;
程序一般為:
void UART_ISR() interrupt x using y
{
;串口中斷處理函數
}
x - 單片機的C51中斷號
y - 指定使用的當前工作寄存器組號(0-3 PSW中的RS0,RS1組合)
3,主程序
int main(void)
{
Init_UART();
while(1)
{
;//數據發送函數
}
}
⑵ 單片機串列通信實驗
1、實驗:用單片機串列口,實現兩個實驗台之間的串列通訊。其中一個實驗台作為發送方,
另一側為接收方。發送方讀入按鍵值,並發送給接收方,接收方收到數據後在LED上顯示
2、原理:串列通信是指數據按位順序傳送的通信。串列數據傳送的特點是:通信線路簡單,最多隻需一對傳輸線即可實現通信,成本低但速度慢,其通信線路既能傳送數據信息,又能傳送控制信息。它對信息的傳送格式有固定要求,具體分為非同步和同步兩種信息格式.與此相應有非同步通信和同步通信兩種方式;在串列通信中,對信息的邏輯定義與TTL不兼容,需要進行邏輯電平轉換:計算機與外界的數據傳送大多是串列的,其傳送的距離可以從幾米到幾千公里。單片機中使用的串列通信通常都是非同步方式的
3、實驗目的:1)掌握單片機串列口工作方式的程序設計,及簡易三線式通訊的方法。 2)了解實現串列通訊的硬環境、數據格式的協議、數據交換的協議。 3)學習串口通訊的中斷方式的程序編寫方法
4、參考實現:
http://wenku..com/link?url=uyYKlkBQqwjGl-akFJ3xWa67R814ShF50uwd3
⑶ 您好請問一下,兩個單片機互相傳數據的程序怎麼寫
兩個單片機互相傳數據,其實很簡單的 就是兩個單片機的串口通信,當然需要一個串口通信的協議,如指令碼、數據長度、數據等等,就是什麼指令需要怎麼操作、操作數據是什麼。如這是兩個單片機簡單通信操作的模擬實例可以作為參考。
#include <reg52.h> // 單片機1
#define uchar unsigned char
#include <stdio.h>
unsigned char* c;
sbit k0=P3^2;
sbit k1=P3^3;
sbit led1=P3^5;
uchar k;
bit y0,y1;
bit t,s;
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};
void SendOneChar(char c) //發送位元組到PC
{
TI=0;
SBUF = c;
while(!TI);
TI=0;
}
void SendString(char *st) //發送字元串到PC
{
while(*st)
{
SendOneChar(*st++);
}
}
void main()
{
SCON = 0x50; //SCON: mode 1, 8-bit UART, enable rcvr
TMOD = 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON = 0x80; // 數據位8、停止位1。效驗位無 (11.0592M)
TH1 = 0xF4; //TH1: reload value for [email protected]
TR1 = 1; //啟動定時器1
ES = 1; //允許串口中斷位
EA = 1; //允許總中斷位
c=0;
s=1;
k=0;
P1 =~table[k];
while(1)
{
if(k0==0 && y0==0)
{
y0=1;
c = "az";
SendString(c); //發送字元串
}
if(k0==1 ) { y0=0; }
if(k1==0 && y1==0)
{
y1=1;
c = "as";
SendString(c); //發送字元串
}
if(k1==1 ) { y1=0; }
// for(i = 0; i < 4000; i++); //延遲一小段時間
}
}
void chuankou(void) interrupt 4
{
if(RI==1)
{
RI = 0;
if(t==1)
{
if(SBUF=='z') { k++;led1=~led1; }
s=1; t=0;
if(k==10) { k=0;}
P1 =~table[k];
}
if(SBUF=='a' && s==1) { t=1;s=0;}
}
}
------------------
#include <reg51.h> // 單片機2
#define uchar unsigned char
unsigned char* c;
sbit led1=P3^2; // 接收 az , P.2 輸出低電平, P3.3 輸出高電平。
sbit led2=P3^3; // 接收 aa , P.2 輸出高電平, P3.3 輸出低電平。
sbit k0=P3^5;
bit y0,t,s;
uchar k;
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};
void SendOneChar(char c) //發送位元組到PC
{
TI=0;
SBUF = c;
while(!TI);
TI=0;
}
void SendString(char *st) //發送字元串到PC
{
while(*st)
{
SendOneChar(*st++);
}
}
void main (void)
{
SCON = 0x50; // REN=1允許串列接受狀態,串口工作模式1
TMOD = 0x21; // 定時器工作方式2
PCON = 0x80; // 數據位8、停止位1。效驗位無 (11.0592M)
TH1 = 0xF4; // TH1 = 0xFD; 波特率 2400
TH0=(65536-54253)/256; // 50 mS
TL0=(65536-54253)%256;
TR1 = 1;
ES = 1; // 開串口中斷
EA = 1; // 開總中斷
// ET0=1;
// TR0=1;
s=1;
k=0;
P1 =~table[k];
while(1)
{
if(k0==0 && y0==0)
{
y0=1;
c = "az";
SendString(c); //發送字元串
}
if(k0==1 ) { y0=0; }
}
}
void chuankou(void) interrupt 4
{
if(RI==1)
{
RI = 0;
if(t==1)
{
if(SBUF=='z') {led1=0;led2=1; k++; }
if(SBUF=='s') {led1=1;led2=0; k--; }
s=1; t=0;
if(k==10) { k=0;}
if(k==255) { k=9; }
P1 =~table[k];
}
if(SBUF=='a' && s==1) { t=1;s=0;}
}
}
void T0_time()interrupt 1
{
TH0=(65536-54253)/256; // 50 mS
TL0=(65536-54253)%256;
k++;
if(k==10) // 這里修改時間
{
k=0;
led1=1;
led2=1;
}
}
⑷ 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
調試結果:
⑸ 求單片機數據傳送試驗源程序
我來答
1.假定16個頃碧數放在20H為首的地址里,送到目的50H為首的地址里
LOOP:
MOV R0,#20H
MOV R1,#50H
MOV A,@R0
MOV @R1,A
INC R0
INC R1
CJNE R0,#30H,LOOP;當inc r0 前,R0=2FH,加1後R0+1=30H,不跳轉
2.假定16個數放在內部RAM20H為首的地址里,送到外部RAM目的0010H為首的地址里
MOV R0,#20H
MOV DPTR,#0010H
MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
CJNE R0,#30H,LOOP;當R0=2FH時,R0+1=30H,不跳轉
3.將外部RAM以1000H為首的16個數據放入,外部RAM以2000h為首的地址內
MOV R7,#0FH
MOV DPTR,#1000H;將源地址放入第一個DPTR
INC AUXR1;轉換指針,指向圓隱第二個DPTR
MOV DPTR,#2000H;將目的地址放入第二個DPTR
INC AUXR1;指向源dptr
LOOP:
MOV A,@DPTR;將源地址數據放入A
INC DPTR;源地址加1
INC AUXR1;轉換為目的橘乎廳地址
MOV @DPTR,A;將A內容放入目的地址
INC DPTR;目的地址加1
INC AURX1;指向源地址
DJNZ R7,LOOP;R7減1,循環,減15次