单片机主从机通信

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ temp=0;
second++;
}
if(second==60)
{ second=0;
if(minute<59)
minute++;
else { minute=0;
hour++;
hour%=24;
}
}
if(temp%250==0) //每250ms
S_flag=!S_flag;//闪烁标志位取反
if(k==8) k=0;
while(TI==0); //等待发送完成
TI=0;//发送中断标志位清零
delay(10);
SBUF=minute;
while(TI==0);
TI=0;
delay(10);
SBUF=hour;
while(TI==0);
TI=0;
delay(10);
}
void init()
{
M=0;
S_flag=0; //闪烁标志位
#define uint unsigned int
uchar code led[]= {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6 }; //数码管
uchar code k[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f };//位选
{
if(hour<23) hour++;
else hour=0;
}
while(!K2);//等待按键释放
}
if(K3==0)
{
delay(10);
if(K3==0)
{
if(hour> 0) hour--;
else hour=23;
}
while(!K3);
}
} break;
case 2://模式2——调分
{
if(K2==0)
{
delay(10);
if(K2==0)
{
if(minute<59) minute++;
else minute=0;
}
while(!K2);
}
if(K3==0)
{
delay(10);
if(K3==0)
{
if(minute>0) minute--;
else minute=59;
}
while(!K3);
a[5]=led[10];
if(S_flag==1)
{
a[6]=led[second/10];
a[7]=led[second%10];
}
else
{
a[6]=led[11];
a[7]=led[11];
}
}break;
}
}
void key_prc()//按键调整时分秒
{
if(K1==0) //按键1按下
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
void delay(unsigned n)//0.2毫秒
{
int x,y;
for(x=0;x<n;x++)
for(y=0;y<24;y++);
}
void Send_Time() //发送时间函数
{
SBUF=second;
g++;
send=SBUF; //接收数据
while(RI!=1);//等待接收完成
RI=0;//防止错误判断下次中断的产生
ES=1;//允许串行中断
if(g==1)
{
second=send;
}
if(g==2)
{
minute=send;
}
if(g==3)
{
hour=send;
g=0;
}
}
void main()//主函数
delay(10);
P0=k[7]; //时,高位
P2=led[e];
}
}
#include <reg51.h>
unsigned char led[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //用一维数组定义0-9、横杠
unsigned char a[8];
unsigned char second=0,minute=0,hour=0;
a[0]=led[11];
a[1]=led[11];
}
a[2]=led[10];
a[3]=led[minute/10];
a[4]=led[minute%10];
a[5]=led[10];
a[6]=led[second/10];
a[7]=led[second%10];
}break;
case 2://闪烁分位
}
} break;
case 3://模式3——调秒
{
if(K2==0)
{
delay(10);
if(K2==0)
{
if(second<59) second++;
else second=0;
}
while(!K2);
}
if(K3==0)
{
delay(10);
if(K3==0)
{
if(second>0) second--;
a[4]=led[minute%10];
a[5]=led[10];
a[6]=led[second/10];
a[7]=led[second%10];
}break;
case 1://闪烁时位
{
if(S_flag==1)
{
a[0]=led[hour/10];
a[1]=led[hour%10];
}
else
{
else second=59;
}
while(!K3);
}
} break;
}
}
}
void main()
{
display_led();
init();
while(1) //死循环
{
Send_Time();
key_prc();
di来自百度文库play();
}
}
从机程序
#include <reg51.h>
#define uchar unsigned char
unsigned char b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//扫描
unsigned char k=0;
unsigned int temp;//记录1000毫秒为1秒的变量
unsigned char M,S_flag;//M是模式,更新时间的4种模式加上正常模式S_flag闪烁标志
uchar second=0,minute=0,hour=0;
uchar a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,send=0;
void delay(uint x)//延时函数
{
while(x--);
}
void serial ( ) interrupt 4
{
ES=0;//禁止串行中断,
ET0=1;
}
void display_led()//时间显示位置
{
char m;
for(m=0;m<8;m++)
{
P0=b[m];
}
}
void time0() interrupt 1//定时器0中断函数
{
TH0=0xFC;//定时1ms
TL0=0x18;
temp++;
if(temp==1000)//配合定时器定时1s
P2=led[b];
delay(10);
P0=k[1]; //秒,高位
P2=led[a];
delay(10);
P0=k[3]; //分,低位
P2=led[d];
delay(10);
P0=k[4]; //分,高位
P2=led[c];
delay(10);
P0=k[6]; //时,低位
P2=led[f];
{
TMOD=0x20; //定时器1的工作方式2
TH1 = 0xFD;
TL1 = TH1; //串口波特率为9600
PCON=0x00; //波特率不加倍
TR1=1;//启动定时器
SCON=0x90;
//串口工作方式2,多机工作控制位SM2=0,允许接收控制位REN=1
EA=1; //中断控制位
ES=1;//允许串行中断
{
a[0]=led[hour/10];
a[1]=led[hour%10];
a[2]=led[10];
if(S_flag==1)
{
a[3]=led[minute/10];
a[4]=led[minute%10];
}
else
{
a[3]=led[11];
a[4]=led[11];
}
a[5]=led[10];
while(1)//循环
{
a=second/10;//定义时分秒位置
b=second%10;
c=minute/10;
d=minute%10;
e=hour/10;
f=hour%10;
P0=k[2];//定义横杠
P2=0x02;
delay(10);
P0=k[5];
P2=0x02;
delay(10);
P0=k[0]; //秒,低位
PCON=0x00; //波特率不加倍
TMOD=0x21; //定时器1以方式1定时
TH0=0xFC;
TL0=0x18;
TH1=0xfD;
TL1=0xfD;//串口波特率为9600
EA=1;//;总中断
SCON=0xa0;
//串口工作方式2,多机通信位SM2=1
TR1=1;//开启定时器1
TR0=1;//开启定时器0
P2=a[k];
P0=b[k++];
delay(1);
P0=0xff;
}
void display()//时钟闪烁函数
{
switch(M)
{
case 0://不闪烁
{
a[0]=led[hour/10];
a[1]=led[hour%10];
a[2]=led[10];
a[3]=led[minute/10];
a[6]=led[second/10];
a[7]=led[second%10];
}break;
case 3://闪烁秒位
{
a[0]=led[hour/10];
a[1]=led[hour%10];
a[2]=led[10];
a[3]=led[minute/10];
a[4]=led[minute%10];
{
delay(10);//延时去抖
if(K1==0)//按K1进行模式切换
{ M++;
if(M==4)
M=0;
}
while(!K1);//等待按键释放
}
if(M!=0)//进入调节模式
{
switch(M)
{
case 1://模式1——调时
{
if(K2==0)
{
delay(10);//延时去抖
if(K2==0) //加键按下
相关文档
最新文档