qq_37870130 2017-07-21 08:59 采纳率: 100%
浏览 4282
已采纳

如何通过串口修改时钟的时间

请问大神们如何在这个程序里添加串口来改变时钟啊
#include
#include
#define uchar unsigned char
#define uint unsigned int
/*七段共阴管显示定义*/
//此表为 LED 的字模, 共阴数码管 0-9 -
uchar code dispcode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制
/*定义并初始化变量*/
uchar seconde=0;//秒
uchar minite=0;//分
uchar hour=12; //时
uchar mstcnt=0;//定时器计数,定时50ms,mstcnt满20,秒加1
uchar shi=0;//闹铃功能
uchar fen=0;
uchar bjcs;//报警次数
sbit P1_0=P1^0; //second 调整定义
sbit P1_1=P1^1; //minite调整定义
sbit P1_2=P1^2; //hour调整定义
sbit P1_5=P3^0; //整点报时
sbit P1_3=P1^3; //闹铃功能,调整时间
sbit P1_6=P1^6; //调整时
sbit P1_7=P1^7; //调整分
sbit P1_4=P1^4; //关闭闹铃

/*函数声明*/
void delay(uint k ); //延时子程序
void time_pro( ); //时间处理子程序
void display( ); //显示子程序
void keyscan( ); //键盘扫描子程序

/*延时子程序*/
void delay (uint k)
{
uchar j;
while((k--)!=0)
{
for(j=0;j<125;j++)
{;}
}
}

/*时间处理子程序*/
void time_pro(void)
{
if(seconde==60)
{
seconde=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
/*显示子程序*/
void display(void)
{
if(P1_3==1)
{
P2=0XFE;
P0=dispcode[seconde%10];//秒个位
delay(1);
P2=0XFD;
P0=dispcode[seconde/10];//秒十位
delay(1);
P2=0XFB;
P0=dispcode[10];//间隔符 -
delay(1);
P2=0XF7;
P0=dispcode[minite%10];//分个位
delay(1);
P2=0XEF;
P0=dispcode[minite/10];//分十位
delay(1);
P2=0XDF;
P0=dispcode[10];//间隔符 -
delay(1);
P2=0XBF;
P0=dispcode[hour%10];//时个位
delay(1);
P2=0X7F;
P0=dispcode[hour/10];//时十位
delay(1);
}
}
/*键盘扫描子程序*/
void keyscan(void)
{
if(P1_0==0)//秒位的调整
{
delay(30);
if(P1_0==0)
{
seconde++;
if(seconde==60)
{
seconde=0;
}
}
delay(250);
}
if(P1_1==0)//分位的调整
{
delay(30);
if(P1_1==0)
{
minite++;
if(minite==60)
{
minite=0;
}
}
delay(250);
}
if(P1_2==0)//时位的调整
{
delay(30);
if(P1_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
}
delay(250);
}
}
/*整点报警*/
void zhengdian (void)
{
if((seconde==0)&(minite==0))//整点报时
{
P1_5=0;
delay(1000);
P1_5=1;
}
}
/*定时闹钟*/
void dingshi(void)
{
if(P1_3==0)//按住P1_3BU不松,显示闹铃设置界面,分别按P1_6、P1_7设置闹铃时间。
{
P2=0XFE;
P0=dispcode[0];//秒个位
delay(1);
P2=0XFD;
P0=dispcode[0];//秒十位
delay(1);
P2=0XFB;
P0=dispcode[10];//间隔符 -
delay(1);
P2=0XF7;
P0=dispcode[fen%10];//分个位
delay(1);
P2=0XEF;
P0=dispcode[fen/10];//分十位
delay(1);

P2=0XDF;
P0=dispcode[10];//间隔符 -
delay(1);

P2=0XBF;
P0=dispcode[shi%10];//时个位
delay(1);
P2=0X7F;
P0=dispcode[shi/10];//时十位
delay(1);
}
if(P1_6==0)//设定时
{
delay(30);
if(P1_6==0)
{
shi++;
if(shi==24)
{
shi=0;
}
}
delay(250);
}
if(P1_7==0)//设定分
{
delay(30);
if(P1_7==0)
{
fen++;
if(fen==60)
{
fen=0;
}
}
delay(250);
}
if((hour==shi)&(minite==fen)&(seconde==0))//闹铃时间到,报警六十次。
{
for(bjcs=0;bjcs<60;bjcs++)
{
P1_5=0;
delay(500);
P1_5=1;
delay(500);
}
}
}
/*主函数*/
void main(void)
{
P1=0XFF;
TMOD = 0x11; //time0为定时器,方式1
TH0=0x3c; //预置计数初值,50ms
TL0=0xb0;
EA=1; //总中断开
ET0=1; //允许定时器0中断
TR0=1; //开启定时器0
while (1)
{

keyscan(); //按键扫描
dingshi();//定时闹钟
zhengdian();//整点报时
display(); //显示时间
}
}

void timer0(void) interrupt 1 //定时器0方式1,50ms中断一次
{
TH0=0x3c; //手动加载计数脉冲次数
TL0=0xb0;
TMOD=0x11;
mstcnt++; //用于计算时间,每隔50ms加1
if(mstcnt==20)//mstcnt满20即为一秒
{
seconde++;//秒+1
time_pro( ); //时间处理
mstcnt=0; //对计数单元的清零,重新开始计数
}

}

  • 写回答

3条回答

  • devmiao 2017-07-21 12:28
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败