求51单片机双击通信程序,两机晶振为11.0592MHZ
请高人赐教.....
求51单片机双击通信程序,两机晶振为11.0592MHZ
请高人赐教.....
//=====================================================================
// 多机通讯主机程序
//zhuji.c
//writer:谷雨 2008年3月22日于EDA实验室
//注:主机先发送地址,接收到应答后,再发送数据
//=====================================================================
#include<reg52.h>
#define addr1 0x31 //从机1地址
#define addr2 0x32 //从机2地址
unsigned char xx[10];
unsigned char p = 0;
void delay_1ms(unsigned int i)
{
unsigned char j;
while ((i--)!=0) {for (j=0;j<125;j++);}
}
void Uart_Init(void)
{
TMOD = 0x20; //定时器T1使用工作方式2
TH1 = 0xF3; TL1 = 0xF3;
PCON = 0x00; //SMOD=1;
SCON = 0xf0; //工作方式3,9位数据位,波特率9600bit/s,允许接收
SM2 = 0;
TR1 = 1; //开始计时
EA = 1; //中断允许
ES = 1; //串行中断允许
}
void Serial_INT() interrupt 4
{
if(!RI) return;
ES = 0;
RI = 0;
xx[p] = SBUF;
p++;
ES = 1;
}
void send_addr(unsigned char addr) //发送地址
{
p = 0;
TB8 = 1; //发送地址帧
SBUF=addr; //发送地址
while(!TI); //等待发送完毕
TI=0; //软件复位TI
}
void send_data(unsigned char ddata) //发送数据
{
TB8=0; //发送数据帧
SBUF=ddata; //发送数据
while(!TI);
TI=0; //软件复位TI
}
void main()
{
Uart_Init();
delay_1ms(2000);
while(1)
{
send_addr(addr1); //向从机1发地址
send_data(0x33);
send_data(0x01);
delay_1ms(500);
if(xx[9]=='0') P1=0xaa;
delay_1ms(500);
send_addr(addr2); //向从机2发地址
send_data(0x33);
send_data(0x01);
delay_1ms(500);
if(xx[9]=='9') P1=0x55;
delay_1ms(500);
}
// while(1);
}
//=====================================================================
// 多机通讯从机1程序
//cong1.c
//writer:谷雨 2008年3月22日于EDA实验室
//注:
//=====================================================================
#include<reg52.h>
#define addr 0x31 //从机1地址
unsigned char receive;
unsigned char xx[ ]={"1234567890"};
void Uart_Init(void)
{
TMOD = 0x20; //定时器T1使用工作方式2
TH1 = 0xF3; TL1 = 0xF3;
PCON = 0x00; //SMOD=1;
SCON = 0xf0; //工作方式3,9位数据位,波特率9600bit/s,允许接收
TR1 = 1; //开始计时
EA = 1; //中断允许
ES = 1; //串行中断允许
}
void Serial_INT() interrupt 4
{
if(!RI) return;
RI=0;
if(RB8==1)
{
if(SBUF==addr) SM2=0;
else SM2=1;
}
if(RB8==0) receive=SBUF;
}
void SendOneByte(unsigned char c)
{
TB8=0;
SBUF = c;
while(!TI);
TI = 0;
}
void SendListChar(unsigned char *DData,unsigned char Ef)
{
unsigned char L=0;
if(Ef!=0)
{
for( ;L<Ef;L++) //显示有效长度
SendOneByte(DData[L]); //发送单个字符
}else
while (DData[L]!='\0') //发送至字串结束
{
SendOneByte(DData[L]); //发送单个字符
L++; //下一个字符
}
}
void main()
{
Uart_Init();
while(1)
{
switch(receive)
{
case 0xff:
break;
case 0x01: //在此可以写入要完成的动作,最多可完成256个动作
SendListChar(xx,0);
break;
case 0x02:
break;
case 0x33:
P1=!P1; //为方便其间,赋值给P1口,测P1口电平来检测该程序
break;
default:
break;
}
receive=0xff;
}
}
等答案……
http://shipinkecheng.taobao.com/
有大量的各种单片机的学习视频资料
淘宝网最低价
帮你轻松入门提高单片机。
高薪不是梦