单片机主从机通信.doc
文本预览下载声明
#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;
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闪烁标志
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
void delay(unsigned n) //0.2毫秒
{
int x,y;
for(x=0;xn;x++)
for(y=0;y24;y++);
}
void Send_Time() //发送时间函数
{
SBUF=second;
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; //闪烁标志位
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
ET0=1;
}
void display_led() //时间显示位置
{
char m;
for(m=0;m8;m++)
{
P0=b[m];
}
}
void time0() interrupt 1// 定时器0中断函数
{
TH0=0xFC; //定时1ms
TL0=0x18;
temp++;
if(temp==1000) //配合定时器定时1s
{ temp=0;
second++;
}
if(second==60)
{ second=0;
if(minute59)
minute++;
else { minute=0;
hour++;
hour%=24;
}
}
if(temp%250==0) //每250ms
S_flag=!S_flag; //闪烁标志位取反
if(k==8) k=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[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
{
a[0]=led[11];
a[1]=led[11];
}
a[2]=led[10];
a[3]=led[minute/10];
显示全部