基于51单片机双机通信的数字时钟测试仿真版Word文件下载.docx
《基于51单片机双机通信的数字时钟测试仿真版Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于51单片机双机通信的数字时钟测试仿真版Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
ucharModeFlag;
//模式标志
bitFLICKERFLAG;
//闪烁标志
//---------函数申明-----------
voidHourSet(void);
//小时设置
voidMinSet(void);
//分钟设置
voidDisp(void);
//显示函数
voidTimer0(void);
//定时器0
voiddelay(uchart);
//延时
voidUART_Init(void);
//串口初始化
voidUART_SendReceive(void);
//串口发送接收
//-----------------------
voidmain(void)
{
UART_Init();
TMOD|=0x01;
//定时器0工作方式1定时器1工作方式0
EA=1;
//开总中断
ET0=1;
//开定时器0中断
TH0=(65536-50000)/256;
//设定定时器0初始值
TL0=(65536-50000)%256;
TR0=1;
//开定时器0
ModeFlag=0xff;
FLICKERFLAG=1;
m=0;
n=0;
for(;
;
)
{
if(KeyMode==0)
{
while(!
KeyMode)//等待按键释放
{
n=0;
Disp();
}
if(ModeFlag==0xff)
ModeFlag=0;
FLICKERFLAG=1;
elseif(ModeFlag==0)
ModeFlag=1;
elseif(ModeFlag==1)
{
ModeFlag=0xff;
m=0;
}
if(ModeFlag==0)HourSet();
//设置小时
elseif(ModeFlag==1)MinSet();
//设置分钟
Disp();
//显示
if(ModeFlag==0xff)UART_SendReceive();
//工作状态串口发送接收
}
}
voidDisp(void)
ucharH1,H2,M1,M2;
H1=Hour/10;
H2=Hour%10;
M1=Min/10;
M2=Min%10;
//----工作状态显示---------------
if(ModeFlag==0xff)
{
P3=0x1f;
P2=table[H1];
delay
(1);
P3=0x2f;
P2=table[H2];
if(!
FLICKERFLAG)//秒钟显示
P2=table[10];
delay
(1);
P3=0x4f;
P2=table[M1];
P3=0x8f;
P2=table[M2];
}
//----设置状态显示----------------
if(ModeFlag==0)//小时
{
FLICKERFLAG)
P3=0x1f;
P2=table[H1];
P3=0x2f;
P2=table[H2];
elseif(ModeFlag==1)//分钟
if(!
P3=0x4f;
P2=table[M1];
delay
(1);
P3=0x8f;
P2=table[M2];
}
voidHourSet(void)
if(Inc==0)//加
while(Inc==0)//等待按键释放
FLICKERFLAG=0;
if(Hour==23)Hour=0;
elseHour++;
if(Dec==0)//减
while(Dec==0)//等待按键释放
if(Hour==0)Hour=23;
elseHour--;
voidMinSet(void)
while(Inc==0)
if(Min==59)Min=0;
elseMin++;
while(Dec==0)
if(Min==0)Min=59;
elseMin--;
//50MS定时器中断一次因软件模拟时钟有误差,根据实际调试发现40MS初始值走时比较准确
voidTimer0(void)interrupt1
TH0=(65536-40000)/256;
//重装初值
TL0=(65536-40000)%256;
m++;
if(m==20)//20*50MS==1S
m=0;
Sec++;
if(Sec==60)
Sec=0;
Min++;
if(Min==60)
{
Min=0;
Hour++;
if(Hour==24)
{
Hour=0;
Min=0;
Sec=0;
}
}
n++;
if(n==10)//10*50MS==500MS
n=0;
FLICKERFLAG=~FLICKERFLAG;
voiddelay(uchart)
ucharn;
ucharT;
for(n=0;
n<
t;
n++)
T=70;
while(T!
=0)T--;
voidUART_Init(void)
TMOD=0x20;
//定时器1工作方式2
TH1=0xfd;
//波特率9600
TL1=0xfd;
SCON=0x50;
//设置串口工作方式1,允许接收
PCON=0x00;
TR1=1;
voidUART_SendReceive(void)
//--甲机发送数据给乙机--------------
do{
SBUF=Hour;
TI);
TI=0;
SBUF=Min;
SBUF=Sec;
RI);
//接收
RI=0;
}while((SBUF^0xff)!
=0);
乙机(液晶显示)程序如下:
/***引脚定义****/
sbitRS=P3^5;
sbitRW=P3^6;
sbitEN=P3^7;
//--------数组初始化------------
ucharcodetable[]="
ILIKEMCU"
ucharcodetable1[]="
"
ucharcodetable2[]={'
0'
'
1'
2'
3'
4'
5'
6'
7'
8'
9'
};
ucharcodetable3[]="
2012-07-28"
ucharidatatimeBuff[3];
voiddelay(uinttime)
{//延时
uinti;
for(i=0;
i<
time;
i++)
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
while(!
TF0);
TF0=0;
TR0=0;
voidwrite_com(uchartemp)
{//写指令
EN=0;
RS=0;
RW=0;
P2=temp;
delay(5);
EN=1;
voidwrite_data(uchartemp)
{//写数据
RS=1;
voidLCD_Init(void)
{//液晶初始化
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
{//串口初始化
TMOD|=0x20;
//定时器工作方式2
TH1=0xfd;
//波特率为9600
TL1=0xfd;
//串口工作方式1
ES=1;
//开串口中断
//开定时器
voidUART_SendReceive()interrupt4
{//串口发送接收
staticuchari=0;
RI=0;
if(i>
2)i=0;
timeBuff[i++]=SBUF;
if(i==2)
{//接收完毕,发送反馈信号
SBUF=0xff;
while(!
TI=0;
//--------------------------------
voidmain()
uchari;
TMOD=0x01;
LCD_Init();
//---------滚屏----------------
write_com(0x80+0x10);
10;
write_data(table[i]);
write_com(0x80+0x50);
13;
write_data(table1[i]);
16;
write_com(0x1c);
delay(100);
//--------------------------
write_com(0x80+0x43);
write_data(table3[i]);
write_com(0x80+0x04);
//设置地址
write_data(table2[timeBuff[0]/10]);
write_data(table2[timeBuff[0]%10]);
write_data('
:
'
);
write_data(table2[timeBuff[1]/10]);
write_data(table2[timeBuff[1]%10]);
write_data(table2[timeBuff[2]/10]);
write_data(table2[timeBuff[2]%10]);
}