找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1783|回复: 9
打印 上一主题 下一主题
收起左侧

单片机求修改 怎么把它改成到了1小时置零重记

[复制链接]
跳转到指定楼层
楼主
ID:145536 发表于 2016-11-2 16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>      //添加头文件

#define uint unsigned int   
#define uchar unsigned char

uchar H,M,S,count=0;     //时分秒uchar DAT[10]={0x3f,0x06;0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};    //共阴数码管编码0~9
void delay()    //短延时主要用于减小数据显示的抖动和重影
{
uchar i,j;
for(i=10;i>0;i--)
for(j=30;j>0;j--)
;
}

void judge()   //改变时分秒的值,使分秒都为60进制,时为24进制
{
if(S==60)
{
S=0;
M++;
}
if(M==60)
{
M=0;
H++;
}
if(H==24)
H=0;
}

void show()   //显示函数,P2为位选,P0为段选
{
P2=0X7F,P0=DAT[H/10],delay();    //第一位选中时,显示时的高位,延时下   
P2=0XBF,P0=DAT[H%10],delay();    //第二位选中时,显示时的低位,延时下
P2=0XDF,P0=0X40,delay();         //第三位选中时,显示“-”,延时下
P2=0XEF,P0=DAT[M/10],delay();    //第四位选中时,显示分的高位,延时下
P2=0XF7,P0=DAT[M%10],delay();    //第五位选中时,显示分的低位,延时下
P2=0XFB,P0=0X40,delay();         //第六位选中时,显示“-”,延时下
P2=0XFD,P0=DAT[S/10],delay();    //第七位选中时,显示秒的高位,延时下
P2=0XFE,P0=DAT[S%10],delay();    //第八位选中时,显示秒的低位,延时下
}

void main()    //主函数
{
TMOD=0X01;    //定时器0工作在方式1
TH0=0X3C;     
TL0=0XB0;    //设置定时器的初值,使得定时时间为50ms(晶振为12MHZ时)
EA=1;        //开启总中断
ET0=1;       //允许定时器0中断
TR0=1;       //开启定时器0
while(1)
show();      //一直执行显示函数
}

void timer0()interrupt 1  //定时器0中断服务程序
{
TH0=0X3C;                 
TL0=0XB0;         //重新设置初值
count++;          //每中断一次,计数寄存器加1
if(count==20)     //当定时20次时,即50MS*20=1000ms=1s
{
count==0;         //将计数值重新归零
judge();          //修改时分秒的值
}
}
怎么把它改成到了1小时置零重记
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:138155 发表于 2016-11-2 17:09 | 只看该作者
count++;          //每中断一次,计数寄存器加1
if(count==20)     //当定时20次时,即50MS*20=1000ms=1s
{
count==0;         //将计数值重新归零
judge();          //修改时分秒的值
}
}
这里面在设置个标志位或者 变量进行计分  =20为1S 清零然后变量加一 当秒变量加到59时 该变量清零 分变量加一 到59时 不就一小时了吗
回复

使用道具 举报

板凳
ID:145536 发表于 2016-11-2 17:25 | 只看该作者
wuyibin2003 发表于 2016-11-2 17:09
count++;          //每中断一次,计数寄存器加1
if(count==20)     //当定时20次时,即50MS*20=1000ms=1s ...

可是我把自己绕死了,无从下手
回复

使用道具 举报

地板
ID:145536 发表于 2016-11-2 17:25 | 只看该作者
wuyibin2003 发表于 2016-11-2 17:09
count++;          //每中断一次,计数寄存器加1
if(count==20)     //当定时20次时,即50MS*20=1000ms=1s ...

。无从下手。写懵了
回复

使用道具 举报

5#
ID:7485 发表于 2016-11-2 18:41 | 只看该作者
本帖最后由 ahshmj 于 2016-11-2 18:44 编辑

void judge()   //改变时分秒的值,使分秒都为60进制,时为24进制
{
if(S==60)
{
S=0;
M++;
}
if(M==60)
{
M=0;
//H++;
}
//if(H==24)
//H=0;
}

回复

使用道具 举报

6#
ID:138155 发表于 2016-11-2 19:14 | 只看该作者
版主已经给你写好了
回复

使用道具 举报

7#
ID:102056 发表于 2016-11-2 19:20 | 只看该作者
本帖最后由 king@ 于 2016-11-2 19:29 编辑

void judge()   //改变时分秒的值,使分秒都为60进制,时为24进制 {
if(S>59)
{
  S=0;
  M++; }
if(M>59)
{  
   M=0;
   H++;
}
if(H==24)
   H=0;
}


回复

使用道具 举报

8#
ID:102056 发表于 2016-11-2 19:24 | 只看该作者
本帖最后由 king@ 于 2016-11-2 19:28 编辑

#include <reg52.h>      //添加头文件

#define uint unsigned int
#define uint32 unsigned   long     int   
#define uchar unsigned char
uint32 num=0;
uchar H,M,S,count=0;     //时分秒uchar DAT[10]={0x3f,0x06;0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};    //共阴数码管编码0~9
void delay()    //短延时主要用于减小数据显示的抖动和重影
{
uchar i,j;
for(i=10;i>0;i--)
for(j=30;j>0;j--)
;
}

void judge()   //改变时分秒的值,使分秒都为60进制,时为24进制
{
if(S==60)
{
S=0;
M++;
}
if(M==60)
{
M=0;
H++;
}
if(H==24)
H=0;
}

void show()   //显示函数,P2为位选,P0为段选
{
P2=0X7F,P0=DAT[H/10],delay();    //第一位选中时,显示时的高位,延时下   
P2=0XBF,P0=DAT[H%10],delay();    //第二位选中时,显示时的低位,延时下
P2=0XDF,P0=0X40,delay();         //第三位选中时,显示“-”,延时下
P2=0XEF,P0=DAT[M/10],delay();    //第四位选中时,显示分的高位,延时下
P2=0XF7,P0=DAT[M%10],delay();    //第五位选中时,显示分的低位,延时下
P2=0XFB,P0=0X40,delay();         //第六位选中时,显示“-”,延时下
P2=0XFD,P0=DAT[S/10],delay();    //第七位选中时,显示秒的高位,延时下
P2=0XFE,P0=DAT[S%10],delay();    //第八位选中时,显示秒的低位,延时下
}

void main()    //主函数
{
TMOD=0X01;    //定时器0工作在方式1
TH0=0X3C;     
TL0=0XB0;    //设置定时器的初值,使得定时时间为50ms(晶振为12MHZ时)
EA=1;        //开启总中断
ET0=1;       //允许定时器0中断
TR0=1;       //开启定时器0
while(1)
show();      //一直执行显示函数
}

void timer0()interrupt 1  //定时器0中断服务程序
{
TH0=0X3C;                 
TL0=0XB0;         //重新设置初值
count++;          //每中断一次,计数寄存器加1
if(count==20)     //当定时20次时,即50MS*20=1000ms=1s
{
count==0;         //将计数值重新归零
if(num!=3600)
num++;
if(num==3600)
num=0;
judge();
}


回复

使用道具 举报

9#
ID:145536 发表于 2016-11-2 19:57 | 只看该作者
ahshmj 发表于 2016-11-2 18:41
void judge()   //改变时分秒的值,使分秒都为60进制,时为24进制
{
if(S==60)

谢谢版主大大
回复

使用道具 举报

10#
ID:145536 发表于 2016-11-2 19:58 | 只看该作者
king@ 发表于 2016-11-2 19:24
#include       //添加头文件

#define uint unsigned int

谢谢了,兄弟。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表