(原創(chuàng))Proteus 虛擬仿真。甲、乙機(jī)之間采用方式 1 雙向串行通信,具體要求如下:
(1)甲機(jī)的 k1 按鍵可通過串行口控制乙機(jī)的 LEDI 點(diǎn)亮、LED2 滅,甲機(jī)的 k2 按鍵控制乙機(jī)的 LED1 滅、LED2 點(diǎn)亮,甲機(jī)的 k3 按鍵控制乙機(jī)的 LED1和 LED2 全亮。
(2)乙機(jī)的 K4 按鍵可控制串行口向甲機(jī)發(fā)送 k4按鍵接下的次數(shù),并顯示在甲機(jī) P0 口的數(shù)碼管上。
【附上本實(shí)驗(yàn)的全部資源鏈接(代碼+仿真文件)
點(diǎn)擊前往下載】
仿真圖
以下是實(shí)驗(yàn)代碼(分甲乙兩機(jī)程序 不會編寫請移步資源下載 里邊是全部代碼和仿真文件)
//甲機(jī)
#include<reg51.h>
unsigned char j=10;
char sign=1;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
void delay(unsigned char k){
unsigned char i,j,h;
for(h=0;h<k;h++){
for(i=0;i<25;i++){
for(j=0;j<20;j++);
}
}
}
void twoDigitDisplay(unsigned char num,unsigned char time,unsigned char portNumber){
unsigned char box[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0xf82,0xf8,0x80,0x90};
unsigned char k;
if(portNumber==0){
if(num<0||num>99||time<0){
for(k=0;k<40;k++){
P2=0x00;
}
}else{
for(k=0;k<time;k++){
unsigned char numR = num%10;
unsigned char numL = num/10;
P2=0x11;
P0=box[numL];
delay(12);
P2=0x22;
P0=box[numR];
delay(12);
}
}
}
}
void main(){
unsigned char sum=0;
TR0=1;
EA=1;
ET0=1;
TMOD=0x21;
TH0=0xee;
TL0=0x00;
while(1){
if(sign==1){
//執(zhí)行數(shù)據(jù)發(fā)送
TR1=1;
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
SCON=0x40;
PCON=0x00;
}
while(sign==1){
//發(fā)送數(shù)據(jù)SBUF
if(P10==0){SBUF=0xfe;while(TI==0);TI=0;continue;}
if(P11==0){SBUF=0xfd;while(TI==0);TI=0;continue;}
if(P12==0){SBUF=0xfc;while(TI==0);TI=0;continue;}
SBUF=0xff;
}
if(sign==-1){
//執(zhí)行數(shù)據(jù)接收
TR1=1;
TL1=0xfd;
TH1=0xfd;
SCON=0x50;
PCON=0x00;
}
while(sign==-1){
//接收數(shù)據(jù)SBUF
if(SBUF==0xf0){
sum++;
twoDigitDisplay(sum,5,0);
}
if(SBUF==0x0f){
twoDigitDisplay(sum,5,0);
}
}
}
}
void int0() interrupt 1 {
j--;
if(j==0){
TF0=0;
TH0=0xee;
TL0=0x00;
sign=sign*(-1);
j=10;
}
}
//乙機(jī)
#include<reg51.h>
unsigned char j=10;
char sign=1;
sbit P10=P1^0;
void main(){
unsigned char increment=0;
TR0=1;
EA=1;
ET0=1;
TMOD=0x21;
TH0=0xee;
TL0=0x00;
if(sign==1){
//執(zhí)行數(shù)據(jù)接收
TR1=1;
TL1=0xfd;
TH1=0xfd;
TMOD=0x20;
SCON=0x50;
PCON=0x00;
}
while(sign==1){
//接收數(shù)據(jù)SBUF
P2=SBUF;
}
if(sign==-1){
//執(zhí)行數(shù)據(jù)發(fā)送
TR1=1;
TL1=0xfd;
TH1=0xfd;
SCON=0x40;
PCON=0x00;
}
while(sign==-1){
//發(fā)送數(shù)據(jù)SBUF
if(P10==0){
SBUF=0xf0;
while(TI==0);TI=0;
}else{
SBUF=0x0f;
while(TI==0);TI=0;
}
}
}
void int0() interrupt 1 {
j--;
if(j==0){
TF0=0;
TH0=0xee;
TL0=0x00;
sign=sign*(-1);
j=10;
}
}
實(shí)驗(yàn)心得
1.程序的核心思想
本程序采用定時中斷it0 定時,每隔50ms兩機(jī)轉(zhuǎn)換一次接收和發(fā)送狀態(tài)。甲機(jī)開始默認(rèn)執(zhí)行發(fā)送,乙機(jī)默認(rèn)接收。雙機(jī)定時一致,到了時間后甲機(jī)由發(fā)送轉(zhuǎn)為接收。乙機(jī)由接收轉(zhuǎn)為發(fā)送。這樣可保證雙機(jī)步調(diào)完全相反。但推測:采用這樣的方法,機(jī)器長時間運(yùn)行,雙機(jī)步調(diào)將逐漸不協(xié)調(diào)。達(dá)不到長期使用的目的。
① 甲機(jī)發(fā)送數(shù)據(jù):甲機(jī)發(fā)送的數(shù)據(jù)SBUF由P1端口的三個開關(guān)的狀態(tài)控制,交由乙機(jī)接收。
② 乙機(jī)接收數(shù)據(jù):乙機(jī)接收甲機(jī)傳送的SBUF,對其進(jìn)行選擇判斷,從而讓甲機(jī)P0端口的LED燈展示不同的效果。
③ 乙機(jī)發(fā)送數(shù)據(jù):乙機(jī)在每次執(zhí)行發(fā)送任務(wù)時,都會向甲機(jī)發(fā)送一個0xf0或者0x0f,默認(rèn)為0xf0但當(dāng)乙機(jī)的p10端口按鈕按下時,乙機(jī)就會發(fā)送另外一個數(shù)據(jù)0x0f,交付甲機(jī)。
④ 甲機(jī)接收數(shù)據(jù):甲機(jī)根據(jù)乙機(jī)穿來的數(shù)據(jù)SBUF的值作出判斷。如果是0x0f, sum變量自增一然后用twoDigitDisplay(sum,5,0) 函數(shù)進(jìn)行顯示。如果是0xf0 ,sum變量值不增,直接交給twoDigitDisplay(sum,5,0) 函數(shù)顯示。文章來源:http://www.zghlxwxcb.cn/news/detail-482990.html
2.實(shí)驗(yàn)中遇到的問題
由于編程較為匆忙,實(shí)驗(yàn)未將switch替換成button,導(dǎo)致開關(guān)k1到k3按下時必須手動斷開才能進(jìn)行下次狀態(tài)的切換。而且數(shù)碼管顯數(shù)會有微小的閃爍,推測延時函數(shù)delay參數(shù)設(shè)置存在問題。
感興趣的朋友可以繼續(xù)改進(jìn),歡迎與我交流。文章來源地址http://www.zghlxwxcb.cn/news/detail-482990.html
本文完全原創(chuàng) 請尊重勞動果實(shí) 歡迎轉(zhuǎn)發(fā) 點(diǎn)贊 不定時更新更多單片機(jī)實(shí)驗(yàn)內(nèi)容。
最后附上本實(shí)驗(yàn)的全部資源鏈接(代碼+仿真文件)
點(diǎn)擊前往下載
到了這里,關(guān)于甲、乙機(jī)之間采用方式 1 雙向串行通信,具體要求如下: (1)甲機(jī)的 k1 按鍵可通過串行口控制乙機(jī)的 LEDI 點(diǎn)亮、LED2 滅,甲機(jī)的 k2 按鍵控制 乙機(jī)的 LED1的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!