|
單片機(jī)多機(jī)通信仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序:
/**************************************/
#include "PMPDataT.h"
/* 延時(shí)t毫秒 */
void delay(uint t)
{
uint i;
while(t--)
{
/* 對(duì)于11.0592M時(shí)鐘,約延時(shí)1ms */
for (i=0;i<125;i++)
{}
}
}
uchar keyscan(void)
{
uchar scancode,tmpcode;
P1 = 0xf0; // 發(fā)全0行掃描碼
if ((P1&0xf0)!=0xf0) // 若有鍵按下
{
delay(10); // 延時(shí)去抖動(dòng)
if ((P1&0xf0)!=0xf0) // 延時(shí)后再判斷一次,去除抖動(dòng)影響
{
scancode = 0xfe;
while((scancode&0x10)!=0) // 逐行掃描
{
P1 = scancode; // 輸出行掃描碼
if ((P1&0xf0)!=0xf0) // 本行有鍵按下
{
tmpcode = (P1&0xf0)|0x0f;
/* 返回特征字節(jié)碼,為1的位即對(duì)應(yīng)于行和列 */
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行掃描碼左移一位
}
}
}
return(0); // 無鍵按下,返回值為0
}
/* 發(fā)送數(shù)據(jù)函數(shù) */
void senddata(uchar buf)
{
/* 發(fā)送數(shù)據(jù) */
TI = 0;
TB8 = 0; // 發(fā)送數(shù)據(jù)幀
SBUF =buf;
while(!TI);
TI = 0;
}
/* 串口初始化函數(shù) */
void init_serial()
{
TMOD = 0x20; // 定時(shí)器T1使用工作方式2
TH1 = 250;
TL1 = 250;
TR1 = 1; // 開始計(jì)時(shí)
PCON = 0x80; // SMOD = 1
SCON = 0xd0; // 工作方式,9位數(shù)據(jù)位,波特率9600kbit/s,允許接收
}
void Getkey()
{
switch(get_key)
{
case 0x11: // 1行1列,數(shù)字0
key=0xc0;
break;
case 0x21: // 1行2列,數(shù)字1
key=0xf9;
break;
case 0x41: // 1行3列,數(shù)字2
key=0xa4;
break;
case 0x81: // 1行4列,數(shù)字3
key=0xb0;
break;
case 0x12: // 2行1列,數(shù)字4
key=0x99;
break;
case 0x22: // 2行2列,數(shù)字5
key=0x92;
break;
case 0x42: // 2行3列,數(shù)字6
key=0x82;
break;
case 0x82: // 2行4列,數(shù)字7
key=0xf8;
break;
case 0x14: // 3行1列,數(shù)字8
key=0x80;
break;
case 0x24: // 3行2列,數(shù)字9
key=0x90;
break;
case 0x44: // 3行3列,10
key=0x20;
break;
case 0x84: // 3行4列,11
key=0x83;
break;
case 0x18: // 4行1列,12
key=0xc6;
break;
case 0x28: // 4行2列,13
key=0xa1;
break;
case 0x48: // 4行3列,14
key=0x04;
break;
case 0x88: // 3行4列,15
key=0x8e;
break;
default:break;
}
}
/* 主程序 */
void main()
{
uchar i = 0;
key=0xc0;
while(1)
{
get_key = keyscan(); // 調(diào)用鍵盤掃描函數(shù)
Getkey();
buf=key;
/* 通過P0口讀要訪問的從機(jī)地址 */
P0 = 0xff;
addr = P0&0x0f;
init_serial(); // 串口初始化
EA = 1; // 關(guān)閉所有中斷
TI = 0;
TB8 = 1; // 發(fā)送地址幀
SBUF = addr;
while(!TI);
TI = 0;
senddata(buf); // 發(fā)送數(shù)據(jù)
}
}
全部資料51hei下載地址:
0039、多機(jī)通信.rar
(196.39 KB, 下載次數(shù): 251)
2018-12-19 10:11 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|