亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
單片機上位機控制下位機顯示聯合 Proteus仿真程序
[打印本頁]
作者:
寄語
時間:
2020-10-21 13:43
標題:
單片機上位機控制下位機顯示聯合 Proteus仿真程序
還有很多不足的地方,多多包容
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
]Y0(]Y][}GUR@306A[[DKAS.png
(36.36 KB, 下載次數: 47)
下載附件
2020-10-21 13:42 上傳
目前程序還無法正常運行,求大神幫忙修改:
矩陣鍵盤 點陣 上位機 數碼管 蜂鳴器聯合仿真.zip
(325.64 KB, 下載次數: 15)
2020-10-21 13:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
寄語
時間:
2020-10-21 13:50
標題:
RE: 上位機控制下位機顯示聯合仿真。
主機代碼如下,下屬還有兩個從機代碼。
//主機
#include<reg51.h>
#include<string.h>
#define _SUCC_ 0x0f//數據傳送成功
#define _ERR_ 0xf0//數據傳送失敗
unsigned char Table[50]={
0x01, 0x01, 0xd6, 0x93, 0x91, 0xff,0x01,0x01,
0x01, 0x40, 0x4c, 0x66, 0x72, 0x5e,0x4c,0x40,
0xc4, 0xc6, 0xc3, 0xff, 0xff, 0xc0,0xc0,0xc0,
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92,0x82,0xf8};//要發送的數據
unsigned char Table0[8]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92,0x82,0xf8};
unsigned char Buff[50]; //數據緩沖區
unsigned char temp=0xff;
sbit KEY1=P1^0;//開關一號
sbit KEY2=P1^1;//開關二號
//unsigned char addr;
//延時1ms函數
void delay_1ms(unsigned int t)
{
unsigned int x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
//緩沖區初始化
void Buff_init()
{
unsigned char i; //將Table里的數據放到緩沖區里
// for(i=0;i<20;i++)
for(i=0;i<50;i++)
{
Buff[i]= Table[i];//將Table里的數據放到Buffp[]里
delay_1ms(100);//延時100ms
}
}
//緩沖區初始化0
void Buff_init0()
{
unsigned char i; //將Table里的數據放到緩沖區里
for(i=0;i<20;i++)
{
Buff[i]= Table0[i];//將Table里的數據放到Buffp[]里
delay_1ms(100);//延時100ms
}
}
//串口初始化函數
void serial_init()
{
TMOD=0x20; //定時器1工作于方式2(00100000)M1=1,M0=0
TH1=0xfd;//定時器賦初值
TL1=0xfd; //波特率為9600
PCON=0;//波特率正常
SCON=0xd0; //串口工作于方式3 11010000
TR1=1; //開啟定時器
TI=0;//開啟發送數據
RI=0;//開啟接受數據
}
//發送數據函數
void SEND_data(unsigned char *Buff)//Buff數據緩沖區
{
unsigned char i;
unsigned char lenth;
unsigned char check;
lenth=strlen(Buff); //計算數據長度
check=lenth;
TI=0; //開啟發送
TB8=0; //發送數據幀
SBUF=lenth;//發送數據長度 sbuf:串行口數據緩沖寄存器
while(!TI);//此時ti==0
TI=0;//開啟發送
for(i=0;i<lenth;i++) //發送數據
{
check=check^Buff[i];//按位異或,同為一不同為零,
TB8=0;
SBUF=Buff[i]; //將Buff[i]中的數據存入單片機數據緩存區
while(!TI);
TI=0;//開啟發送
}
//發送校驗字節
TB8=0;
SBUF=check;
while(!TI);
TI=0;
}
//向指定從機地址發送數據
void ADDR_data(unsigned addr)
{
while(temp!=addr) //主機等待從機返回其地址作為應答信號
{
TI=0; //發送從機地址
TB8=1; //發送地址幀
SBUF=addr;
while(!TI);
TI=0;
RI=0;//開始接受數據
while(!RI);
temp=SBUF;
RI=0;
}
temp=_ERR_; //主機等待從機數據接收成功信號
while(temp!=_SUCC_)//當發送成功時
{
SEND_data(Buff);
RI=0;
while(!RI);
temp=SBUF;
RI=0;
}
}
void chushihua()
{
Buff_init();//先進行緩沖區初始化
serial_init();//串口初始化
while(1)
{
if(KEY1==0)//開關一按下
{
delay_1ms(5);//延時5ms確認是否誤判
if(KEY1==0) //如果沒有誤判
{
while(!KEY1);
ADDR_data(0x01);//發送從機地址
}
}
}
}
void chushihua0()
{
Buff_init0();//先進行緩沖區初始化
serial_init();//串口初始化
while(1)
{
if(KEY1==0)//開關一按下
{
delay_1ms(5);//延時5ms確認是否誤判
if(KEY1==0) //如果沒有誤判
{
while(!KEY1);
ADDR_data(0x01);//發送從機地址
}
}
}
}
void main()
{
Buff_init();//先進行緩沖區初始化
serial_init();//串口初始化
while(1)
{
ADDR_data(0x01);//發送從機地址
ADDR_data(0x02);//發送從機地址
}
}
從機1號
//從機
#include<reg51.h>
#include<string.h>
#define addr 0x01//從機1的地址
#define _SUCC_ 0x0f//數據傳送成功
#define _ERR_ 0xf0//數據傳送失敗
sbit k1=P3^2;
sbit k2=P3^3;
sbit k3=P3^4;
sbit D1=P3^5;
sbit D2=P3^6;
sbit D3=P3^7;
unsigned char x;
//延時1ms函數
void delay_1ms(unsigned int t)
{
unsigned int x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
unsigned char aa=0xff;//主機與從機之間通信標志
//unsigned char Buff[20];//數據緩沖區
unsigned char Buff[50];//數據緩沖區
//串口初始化函數
void serial_init()
{
TMOD=0x20; //定時器1工作于方式2 波特率為9600
TH1=0xfd;
TL1=0xfd; //定時器初值
PCON=0;
SCON=0xd0; //串口工作于方式3
TR1=1; //開啟定時器
TI=0;
RI=0;
}
//接收數據函數
unsigned char RECE_data(unsigned char *Buff)
{
unsigned char i,temp;
unsigned char lenth;
unsigned char check;
RI=0; //開啟接收數據(長度)
while(!RI);
if(RB8==1) //若接收到地址幀,則返回0xfe
return 0xfe;
lenth=SBUF;
RI=0; //開啟再次接收數據
check=lenth;
for(i=0;i<lenth;i++) //接收數據
{
while(!RI);
if(RB8==1) //若接收到地址幀,則返回0xfe
return 0xfe;
Buff[i]=SBUF;
check=check^(Buff[i]);//按位異或
RI=0;
}
while(!RI); //接收校驗字節
if(RB8==1) //若接收到地址幀,則返回0xfe
return 0xfe;
temp=SBUF;
RI=0;
check=temp^check; //將從主機接收到的校驗碼與自己計算的校驗碼比對(同為零,不同則大于零)
if(check!=0) //校驗碼不一致,表明數據接收錯誤,向主機發送錯誤信號,函數返回0xff
{
TI=0;
TB8=0;
SBUF=_ERR_; //把錯誤信號賦值到緩沖區待發送
while(!TI); //發送完畢時跳出循環
TI=0;
return 0xff;
}
TI=0; //校驗碼一致,表明數據接收正確,向主機發送成功信號,函數返回0x00
TB8=0;
SBUF=_SUCC_;
while(!TI); //發送成功的信號給主機
TI=0;
return 0;
}
const unsigned char CharCode0[8]={0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff};//P2口代碼
unsigned char DispBuff[25]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
void chuang1()
{
static char CurPosi; //定義當前輸出位置
D1=0;
P2=Buff[DispBuff[CurPosi]+16]; //輸出當前字符顯示編碼到 P2 口
switch (CurPosi++) //當前輸出位置加 1
{
case 0:P1=0x00;break; //P1.0 置低
case 1:P1=0x20;break; //P1.1 置低
case 2:P1=0x40;break; //開一點窗
case 3:P1=0x60;break; //開一半
case 4:P1=0x80;break;//開大半
case 5:P1=0xa0;break; //全關
case 6:P1=0xc0;break; //全開
case 7:P1=0xe0;break;
}
if(CurPosi>7)
CurPosi=0; //當前輸出位置大于 7 則重頭開始
}
void chuang2()
{
static char CurPosi; //定義當前輸出位置
D2=0;
P2=Buff[DispBuff[CurPosi]+8]; //輸出當前字符顯示編碼到 P2 口
switch (CurPosi++) //當前輸出位置加 1
{
case 0:P1=0x00;break; //P1.0 置低
case 1:P1=0x20;break; //P1.1 置低
case 2:P1=0x40;break; //開一點窗
case 3:P1=0x60;break; //開一半
case 4:P1=0x80;break;//開大半
case 5:P1=0xa0;break; //全關
case 6:P1=0xc0;break; //全開
case 7:P1=0xe0;break;
}
if(CurPosi>7)
CurPosi=0; //當前輸出位置大于 7 則重頭開始
}
void chuang3()
{
static char CurPosi; //定義當前輸出位
D3=0;
P2=Buff[DispBuff[CurPosi]]; //輸出當前字符顯示編碼到 P2 口
switch (CurPosi++) //當前輸出位置加 1
{
case 0:P1=0x00;break; //P1.0 置低
case 1:P1=0x20;break; //P1.1 置低
case 2:P1=0x40;break; //開一點窗
case 3:P1=0x60;break; //開一半
case 4:P1=0x80;break;//開大半
case 5:P1=0xa0;break; //全關
case 6:P1=0xc0;break; //全開
case 7:P1=0xe0;break;
}
if(CurPosi>7)
CurPosi=0; //當前輸出位置大于 7 則重頭開始
}
//中斷函數
void T0_INTProc(void) interrupt 1 //T0 定時中斷函數
{
P1=0xff; //關閉所有顯示,消隱
TH0=0xec;
TL0=0x78; //重裝計數值
TR0=1; //重啟計數,為顯示下一字符作準備
if(k1==0)
chuang1();
else
D1=1;
if(k2==0)
chuang2();
else
D2=1;
if(k3==0)
chuang3();
else
D3=1;
}
void main()
{
serial_init(); //串口初始化
while(1)
{
SM2=1; //開啟接收地址幀
while(aa!=addr) //從機等待主機請求自己的地址
{
RI=0;
while(!RI);
aa=SBUF;
RI=0;
}
TI=0; //一旦被請求,從機返回自己地址作為應答,等待接收數據
TB8=0;
SBUF=addr;
while(!TI);
TI=0;
SM2=0; //接收數據幀
aa=0xff; //從機接收數據,并將數據保存到數據緩沖區
while(aa==0xff)
{
aa=RECE_data(Buff); //接收數據
}
if(aa==0xfe)
continue;
TMOD=0x01; //設定 T0 工作在定時方式 1,16位計數
TH0=0xec; //裝入計數值高字節(中斷時間)
TL0=0x78; //裝入計數值低字節
EA=1; //開總中斷
ET0=1; //開 T0 中斷
TR0=1; //啟動 T0 計數
while(1); //無限循環等待中斷發生
}
}
復制代碼
從機2號
//從機2
#include<reg51.h>
#include<string.h>
#define addr 0x02//從機1的地址
#define _SUCC_ 0x0f//數據傳送成功
#define _ERR_ 0xf0//數據傳送失敗
unsigned char a;
unsigned char x;
//延時1ms函數
void delay_1ms(unsigned int t)
{
unsigned int x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
unsigned char aa=0xff;//主機與從機之間通信標志
unsigned char Buff[50];//數據緩沖區
//串口初始化函數
void serial_init()
{
TMOD=0x20; //定時器1工作于方式2 波特率為9600
TH1=0xfd;
TL1=0xfd; //定時器初值
PCON=0;
SCON=0xd0; //串口工作于方式3
TR1=1; //開啟定時器
TI=0;
RI=0;
}
//接收數據函數
unsigned char RECE_data(unsigned char *Buff)
{
unsigned char i,temp;
unsigned char lenth;
unsigned char check;
RI=0; //開啟接收數據(長度)
while(!RI);
if(RB8==1) //若接收到地址幀,則返回0xfe
return 0xfe;
lenth=SBUF;
RI=0; //開啟再次接收數據
check=lenth;
for(i=0;i<lenth;i++) //接收數據
{
while(!RI);
if(RB8==1) //若接收到地址幀,則返回0xfe
return 0xfe;
Buff[i]=SBUF;
check=check^(Buff[i]);//按位異或
RI=0;
}
while(!RI); //接收校驗字節
if(RB8==1) //若接收到地址幀,則返回0xfe
return 0xfe;
temp=SBUF;
RI=0;
check=temp^check; //將從主機接收到的校驗碼與自己計算的校驗碼比對(同為零,不同則大于零)
if(check!=0) //校驗碼不一致,表明數據接收錯誤,向主機發送錯誤信號,函數返回0xff
{
TI=0;
TB8=0;
SBUF=_ERR_; //把錯誤信號賦值到緩沖區待發送
while(!TI); //發送完畢時跳出循環
TI=0;
return 0xff;
}
TI=0; //校驗碼一致,表明數據接收正確,向主機發送成功信號,函數返回0x00
TB8=0;
SBUF=_SUCC_;
while(!TI); //發送成功的信號給主機
TI=0;
return 0;
}
#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int //宏定義無符號整型
//定義分別表示8255A各口的變量
volatile unsigned char xdata Aport _at_ 0x8000;
volatile unsigned char xdata Bport _at_ 0x8001;
volatile unsigned char xdata Cport _at_ 0x8002;
volatile unsigned char xdata Ctrlport _at_ 0x8003;
const unsigned char CharCode1[10]= {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92,0x82,0xf8, 0x80,0x90};//晶體管真值碼
unsigned char code seg7code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };//鍵盤真值碼
unsigned char k;
void delay10ms(void) //延時程序
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
//行掃描獲取鍵盤函數
void Getch ( ) //取鍵值函數
{
unsigned char X,Y,Z;
Bport=0x0f; //先對P3 置數 行掃描
if(Bport!=0x0f) //判斷是否有鍵按下
{
delay10ms(); //延時,軟件去干擾
if(Bport!=0x0f) //確認按鍵按下
{
X=Bport; //保存行掃描時有鍵按下時狀態
Bport=0xf0; //列掃描
Y=Bport; //保存列掃描時有鍵按下時狀態
Z=X|Y; //取出鍵值
//獲取鍵盤值函數
switch ( Z ) //判斷鍵值(那一個鍵按下)
{
case 0x77: k=0; break; //對鍵值賦值
case 0x7b: k=1; break;
case 0x7d: k=2; break;
case 0x7e: k=3; break;
case 0xb7: k=4; break;
case 0xbb: k=5; break;
/* case 0xbd: k=6; break;
case 0xbe: k=7;
case 0xd7: k=8; break;
case 0xdb: k=9; break;
case 0xdd: k=10;break;
case 0xde: k=11;break;
case 0xe7: k=12;break;
case 0xeb: k=13;break;
case 0xed: k=14;break;
case 0xee: k=15;break;*/
}
}
}
}
void main()
{
serial_init(); //串口初始化
while(1)
{
SM2=1; //開啟接收地址幀
while(aa!=addr) //從機等待主機請求自己的地址
{
RI=0;
while(!RI);
aa=SBUF;
RI=0;
}
TI=0; //一旦被請求,從機返回自己地址作為應答,等待接收數據
TB8=0;
SBUF=addr;
while(!TI);
TI=0;
SM2=0; //接收數據幀
aa=0xff; //從機接收數據,并將數據保存到數據緩沖區
while(aa==0xff)
{
aa=RECE_data(Buff); //接收數據
}
if(aa==0xfe)
continue;
while(1){
a=1;
while(a)
{
Bport=0xff;
Getch(); //調用取鍵值函數
Aport=Buff[k+24]; //查表LED輸出
if(k==5)
P1=0x00;
if(P1==0x02)
{
P1=0X01;
a=0;
}
}
}
}
}
復制代碼
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1