① 51單片機的雙機通信 跪求大神幫我讀懂程序,馬上採納
ORG 0000H
LJMP START
ORG 0023H //定時器中哪叢斷入口地址
LJMP SINT1 //定時器中斷程序
ORG 0040H//主程序從0040h開始執行
START:
MOV SP,#60H//設置堆棧
MOV TMOD,#20H//初始化定時器控制寄存器
MOV TH1,#0F3H
MOV TL1,#0F3H//設置定時器1初值
SETB TR1//開啟定時器1
MOV SCON,#0C0H;方式3//設置串口控制寄存器
MOV PCON,#00H
SETB EA//允許總中斷
SETB ES//允許串口中斷
{ MOV R0,#20H
MOV A,@R0
MOV C,P//p和tb8估計是用偽指令定義的東西
MOV TB8,C
MOV SBUF,A} 讀取地址20h里的內容發送到串口
(JNB TI,$//等待發送完
CLR TI);//發送完以後清除發送標志 這兩句不需要了
AJMP $//原地等待
SINT1:
PUSH PSW
PUSH A//壓入堆棧保護
CLR TI 清發送標志
INC R0 //寄存器ro裡面的內容加1
MOV A,@R0//間接定址 讀取ro所指向地址的內容 比如:ro裡面是21h 就是讀取21h地址的內容到 a
MOV C,P
MOV TB8,C
MOV SBUF,A
CJNE R0,#2FH,RET1 //比較是否發送完如果完了就離開中斷沒有的蔽賀話繼續發送 ;跳出中斷
CLR TI//清標志
CLR ES//不允許串口中斷
CLR EA//關總中斷
POP A
POP PSW //彈出a和psw的數據 回復psw中斷之前的數值
RET1: RETI
END
這個發送程序就是通過定時器中斷依次把數據送到串口發送寄存器。
接收程序:
ORG 0000H
LJMP START
ORG 0023H
LJMP SINT1
ORG 0040H
START:
MOV SP,#60H
MOV TMOD,#20H
MOV TH1,#0F3H
MOV TL1,#0F3H
SETB TR1
MOV SCON,#0D0H
MOV PCON,#00H
SETB EA
SETB ES
MOV R0,#20H
AJMP $
SINT1: PUSH PSW
PUSH A //a和psw壓入堆棧保護
CLR RI//清串口接收標志
MOV A,SBUF//讀取串口的數值
MOV C,P
JNC L1
JNB RB8,ERROR//這幾句是判斷 如果錯誤就跳轉到錯誤處理程序
AJMP NORMAL//沒問題宏緩派的話跳轉到正常執行
L1:JB RB8,ERROR
NORMAL:MOV @R0,A 讀取a的內容到ro所指向的地址 單片機間接定址
INC R0 //
CJNE R0,#30H,RET1 // 比較 如果夠了就中斷返回 ;跳出中斷
POP A //還不夠
POP PSW //還不夠恢復a 和psw的值 准備下一次中斷接收
RET
ERROR: 「出錯了」
CLR RI
CLR ES
CLR EA //錯誤處理 關掉串口中斷和總中斷 不恢復psw裡面的值。單片機將無事可做。老在執行 AJMP $
RET1: RETI
END
夠詳細了吧
自己多查查資料。
② 51單片機c語言串列雙機通信的問題。請直接給我程序,要有注釋說明。
先設計出來電路,然後再談編程的問題。
③ 雙機串列通信
這里有個基本的雙機串列通信範例:
http://hi..com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/b738c5d010b2ce349a5027ee.html
是否可以解決您的問題?
④ 求一個51 雙機通信 的程序 C語言編寫 內容 單片機A傳送數字0~255
參凱掘考資料
51 雙機通搏慶信基孫握
⑤ 單片機雙機通信程序
雙機器通信很容易的。如果用Proteus模擬的話還得安裝虛擬埠軟體。
⑥ 單片機雙機串口通信程序設計
初始化程序:
BTLEQU2FH;波特率放在內部RAM的2FH單元
MOVTMOD,#21H;T0方式1,16位計數器,T1方式2,串口用
SETBTR0;啟動T0
MOVBTL,#0F3H;波特率設定為1200
MOVSCON,#0C0H;串口方式3,9位數據,禁止接收
接收及驗證程序:
NUMEQU2BH;同步符個數值存放在內部RAM的2BH單元
TEMPEQU2CH
ROM-CH:DB55H,55H,55H,55H,55H,55H,55H,55H,55H,55H
DB55H,55H,55H,55H,55H,55H,55H,55H,55H,55H;20位元組同步符
MIMDB'WSC':3位元組密碼「WSC」
SETBP3.5;置電台收狀態
SETBREN;允許串口接收
A1:MOVNUM,#0;記錄連續到同步符55H的個數
A2:JBRI,A2;串口有數據轉A3
A3:CLRRI;清接收中斷標志
MOVA,SBUF;讀串口數據
CJNEA,#55H,A1;不是同步符轉A1
INCNUM;收到的同步符個數加1
MOVA,NUM;取收到的同步符個數
CJNEA,#5,A2;未收夠連續5個55H轉A2
A4:MOVNUM,#0;密碼驗證,記錄收到密碼位元組數
A5:MOVDPTR,#MIM;密碼字元首址
MOVA,NUM
MOVCA,@A+DPTR;查表取密碼
MOVTEMP,A;保存密碼
JBRI,A6;串口收完一個位元組轉A6
…
A6:CLRRI;清接收中斷標志
MOVA,SBUF;讀串口數據
CJNEA,TEMP,A4;與密碼不符轉A4
INCNUM;收到的密碼個數加1
MOVA,NUM;取已收到的密碼位元組數
CJNEA,#3,A5;密碼未收完轉A5
發送程序:
CLRP3.5;置電台發狀態
MOVB,#23
MOVDPTR,#ROM-CH
B1:CLRA
MOVCA,@A+DPTR;查表發送同步符和密碼共24位元組
INCDPTR
LCALLSEND-CH;調發送單位元組子程序
DJNZB,B1
…
CLRA
MOVDPTR,#7000H;外部RAM數據首址,發送外部RAM中的數據到電台
B2:CJNER4,#0,B3
CJNER3,#0,B3;R4R3=發送位元組數
B3:MOVXA,@DPTR;取數據
INCDPTR
LCALLSEND-CH
CJNER3,#0,B4
CJNER4,#0,B5
B4:DECR3
LJMPB2
DECR3
DECR4
LJMPB2
…
SEND-CH:SETBTB8
MOVSBUF,A
DB0,0,0,0,0,0,0,0
JNBTI,$;延時4μs
CLRTI
RET
結語
⑦ 單片機雙機通信,兩個單片機的一方作為發送,另一方作為接收,分別調
#include<reg51.h>
#define uchar unsigned char
uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay(uchar a)
{
uchar i;
while(a--)for(i=0;i<120;i++);
}
main()
{
uchar i;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x40;
while(1)
{
for(i=0;i<16;i++)
{
SBUF=distab[i];
whileTI==0);
TI=0;
delay(200);
}
}
}
#include<reg51.h>
#define uchar unsigned char
main()
{
uchar i;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
while(1)
{
if(RI)
{
RI=0;
P1=SBUF;
}
}
}
⑧ 雙機串列口方式1單工通信(求大神幫幫忙C程序代碼)
http://blog.163.com/asm_c/blog/static/24820311320146138270129/
參櫻亂考脊族檔。穗攔
⑨ 您好請問一下,兩個單片機互相傳數據的程序怎麼寫
兩個單片機互相傳數據,其實很簡單的 就是兩個單片機的串口通信,當然需要一個串口通信的協議,如指令碼、數據長度、數據等等,就是什麼指令需要怎麼操作、操作數據是什麼。如這是兩個單片機簡單通信操作的模擬實例可以作為參考。
#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;
}
}
⑩ 單片機C語言雙機通信求修改
發給我看看
我做單片機的