打印
[51单片机]

用定时器0模拟时钟,控制1602液晶显示时间,

[复制链接]
1378|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qdszd|  楼主 | 2016-3-27 22:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用定时器0模拟时钟,控制1602液晶显示时间,操作了3个晚上了,现在怎么会一下子就进到秒数等于60的if里!miao++;后的if不应该没到1分钟就进去了,miao++后面的sfm()都没有执行就执行分钟了。求指点。
#include<reg52.h>

typedef unsigned char uchar;
typedef unsigned int uint;
uchar i,shi,fen,miao,aa;
uint d1;

sbit oe=P2^0;
sbit rs=P2^1;
sbit rw=P2^2;

uchar code dis1[]={"2016-3-27 SUN"};
uchar code dis2[]={"00:00:00"};

void delay(uchar z)
{
        uchar x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void lcd_wcmd(uchar comd)
{
        rs=0;
        rw=0;
        oe=1;
        P0=comd;
        delay(2);
        oe=0;
}

void lcd_pos(uchar pos)
{
        lcd_wcmd(pos|0x80);
}
void lcd_wdat(uchar dat)
{
        rs=1;
        rw=0;
        oe=1;
        P0=dat;
        delay(2);
        oe=0;
}

void init()
{
//        i=0;
        lcd_wcmd(0x38);            //8位数据总线,2行显示,5X8点阵
        lcd_wcmd(0x0c);            //开显示,光标不显示,不闪烁
        lcd_wcmd(0x14);           //光标向右移动,AC自动加1
        lcd_wcmd(0x01);           //清显示。
        lcd_wcmd(0x06);           //写入一个,地址加1,显示不移动

//        shi=0;
//        fen=0;
        miao=0;
        aa=0;
        lcd_pos(0x02);

        while(dis1[i]!='\0')
        {
                lcd_wdat(dis1[i]);
                i++;       
        }
        i=0;
        lcd_pos(0x42);
        while(dis2[i]!='\0')
        {
                lcd_wdat(dis2[i]);
                i++;
        }
        i=0;

        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;

}

void sfm(uchar add,uchar date)
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;
        lcd_pos(0x40+add);       
        lcd_wdat(0x30+shi);
        lcd_wdat(0x30+ge);
}

void main()
{
        init();
        while(1)
        {
                if(aa==20)
                {
                        aa=0;
                        miao++;
                        if(miao==60);
                        {
                                miao=0;
                                fen++;
                                P1=0;
                                if(fen==60)
                                {
                                        fen=0;
                                        shi++;
                                        if(shi==24)
                                        {
                                                shi=0;
                                        }
                                        sfm(5,shi);
                                }
                                sfm(8,fen);
                        }

//                        sfm(11,miao);
                }
        }
}
void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        aa++;

}

相关帖子

沙发
ningling_21| | 2016-3-28 15:30 | 只看该作者
试试把
if (aa==20)

改为

if( aa>=20)

其它一样

使用特权

评论回复
板凳
qdszd|  楼主 | 2016-3-29 14:35 | 只看该作者
还是一样,和没改没有区别。奇了怪了,没到1S为什么能到if里面区!

使用特权

评论回复
地板
NE5532| | 2016-3-29 14:58 | 只看该作者
1.秒到60以后,后面是如何走的?看显示的现象是啥?
2.自己仿真看流程。

使用特权

评论回复
5
qdszd|  楼主 | 2016-3-29 21:11 | 只看该作者
已经仿真了,没有执行60S计时,执行程序后,直接进入   
               if(aa==20)
                {
                        aa=0;
                        miao++;
                        if(miao==60);
                        {
                                miao=0;
                                fen++;
                                P1=0;
                                if(fen==60)
                                {
                                        fen=0;
                                        shi++;
                                        if(shi==24)
                                        {
                                                shi=0;
                                        }
                                        sfm(5,shi);
                                }
                                sfm(8,fen);
                        }
没有计时60S,进入if(miao==60);后,分钟的显示直接按照秒在增加,1秒钟分钟数加1,秒钟显示00不动。

使用特权

评论回复
6
无超~吞立吉| | 2016-3-31 22:36 | 只看该作者
会不会是LCD的显示秒的指针和显示分的指针弄错了

使用特权

评论回复
7
qdszd|  楼主 | 2016-4-1 07:11 | 只看该作者
用pos函数写了0x80,sfm里面写了0x40是指到第二行,main函数里面的数直接赋给add,就是第二行指针位置,应该不会错。

使用特权

评论回复
8
singleMCU| | 2016-4-1 10:55 | 只看该作者
DREAMER开发板:
你这个中断函数好像有问题吧,这样好像会紊乱,你进入中断应该先把中断关了在进行重新的赋值,完成配置之后再次打开中断。

使用特权

评论回复
9
dwq175| | 2016-4-1 14:34 | 只看该作者
if(miao==60);《---这里有一个分号,去掉就好了。

使用特权

评论回复
10
qdszd|  楼主 | 2016-4-7 19:19 | 只看该作者
dwq175 发表于 2016-4-1 14:34
if(miao==60);《---这里有一个分号,去掉就好了。

大哥厉害

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝