黎穆晨曦 2022-12-04 00:21 采纳率: 80%
浏览 42
已结题

pretous做定时闹钟,keil的C语言程序下载到pretous仿真图中可以运行,但是运行结果不太对,麻烦哪位大神帮忙调一下。

问题遇到的现象和发生背景
问题遇到的现象和发生背景

pretous做定时闹钟,keil的C语言程序下载到pretous仿真图中可以运行,但是运行结果不太对,麻烦哪位大神帮忙调一下。

“强调以下,写这么多文字主要是想描述清楚问题,12月4号15点截止,觉得麻烦或者没时间的可以直接划走,谢谢,”

以下功能基本都能实现,遇到的问题是:
1,计时的时候跳转太快,感觉像分和秒的计时,但是我要实现的是时和分的计时;
2,按下按钮后有时候数字会跳好几个;
3,复位处按钮无法确定电平。
pretous仿真:https://wwqv.lanzout.com/i3B9u0hp9nqb

1、原理及工作过程说明
(1)定时闹钟的基本功能如下:
(a)使用LCD液晶显示器来显示现在的时间。
(b)程序执行之后显示“Time;00:00m并且LED 闪烁,表示开始已经计时。
(c)由LED 闪动来做秒计数表示。
(2)按键功能如下:
按键 K1 设置现在的时间和时调整:按键K2 显示闹钟设置的时间和分调整:按键K3设置闹铃的时间和设置完成:按键K4闹铃ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为 0FF 发出“哗”的一声和闹铃时间到时,发出一阵声响,按下本键可以停止声响。
(3)调整计时器时间如下:
按下K1键,然后按K1调整小时,K2调整分钟,按下K3 表示时间设置完成。
(4)调整闹钟时间设置如下:
再次按下K3开始闹中设置,LCD下一行显示“Alarm:00:00”按下K1设置小时,按一下K2 设置分钟,再次按下K3设置完成,并且设置时间消失,当再次按一下K2时“Alarm:00:00再次显示并马上消失。按一下K4关闭闹钟,再次按下打开闹钟。

用代码块功能插入代码,请勿粘贴截图

C语言代码如下:调试的过程中麻烦对每段程序注释一下,

#include<reg52.h>

#define uchar unsigned char 
#define uint unsigned int 
uchar code shuzi[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20};
uchar kongbai=0x20;
sbit rs=P2^5;
sbit rw=P2^6;
sbit en=P2^7;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit led_miao=P1^7;
sbit buzz=P2^3;
sbit lamp=P2^4;
uchar shi1=0x85,shi2=0x86;
uchar fen1=0x88,fen2=0x89;
uchar ns1=0xcb,ns2=0xcc;
uchar nf1=0xce,nf2=0xcf;
uchar aaak1=1,aaak2=1,aaak3=1,aaak4=1, clockon, ringoff;
uchar b,c,d,e,ch,hou=10;
uchar bn,cn,dn,chn,houn=10;
uchar tt0, tt1, tt2, tt3, tt4, change, ho=10;
int tt5, a, an;
uchar pt;
void time0();
//-----时钟说明-----//
//     ab:cd        //
//-----闹钟说明-----//
//    an bn:cn dn   //
//------------------//


void delay (uint z)    //延时程序
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110; y>0;y--);
}


void wc(uchar com)
{
    rs=0;
    P0=com;
    delay (5) ;
    en=1;
    delay(5);
    en=0;
}


void wd(uchar date)
{
    rs=1;
    P0=date;
    delay(5);
    en=1;
    delay(5);
    en=0;
}


void init()
{
    en=0;
    rs=0;
    rw=0;//写数据或指令时,的口必须为低电平
    wc(0x38);
    wc(0x0c);
    wc(0x06);//写一个字符后地址指针加
    wc(0x01);
}


void showtime(uchar fen_1,uchar fen_2,uchar f1,uchar f2)
{
    wc(fen_1);delay(1);
    wd(shuzi[f1]);delay(1);
    wc(fen_2);delay(1);
    wd(shuzi[f2]);delay(1);
}


void showmao(uchar kkkkk)
{
    if(kkkkk==0)
    {wc(0x87);delay(1);wd(0x3a);delay(1);}
    else if(kkkkk==1)
    {wc(0xcd);delay(1);wd(0x3a);delay(1);}
    else
    {wc(0xcd);delay(1);wd(kongbai);delay(1);}
}


void key()
{
    if(k1==0)//1 start
    {
        delay(100);
        if(k1==0)
        {
            wc(0x80+0x40);delay(1);
            wd(0x59);delay(1);
            delay(100);
            while(1)
            {
                if(k1==0) //1-1 start
                {
                    delay(100);
                    if(k1==0)
                    {
                        b++;
                        if(b>=hou)
                        {
                        ch++;
                        if(ch>=2)
                            hou=4;
                        else
                            hou=10;
                        if(a>=2&&b>=hou)
                        {
                            a=(-1);
                            b=0;
                            ch=0;
                            hou=10;
                        }
                        a++;
                        b=0;
                    }
                    showtime(shi1,shi2,a,b);
                    }
                }//1-1 end


                if(k2==0)//1-2 start 
                {
                    delay (100);
                    if(k2==0)
                    {
                        d++;
                        if(d>=10)
                        {
                            d=0;
                            c++;
                            if(c>=6)
                            c=0;
                        }
                        showtime (fen1, fen2,c, d);
                    }
                }//1-2 end


                if(k3==0)//1-3 start
                {
                    wc (0x80+0x40);delay(1);
                    wd(kongbai);delay(1) ; 
                    tt5=a;tt4=b;tt3=c;tt2=d;
                    EA=1;ET0=1;TR0=1;
                    break;
                }//1-3 end


                if(k4==0)//1-4 start
                {
                        //待定
                }//1-4 end
            }
        }
    }//1 end 


    if(k2==0)//2 start
    {
        delay (100) ;
        if(k2==0)
        {
            if(aaak1==1)
            {
            aaak1++;
            wc(0x80+0x41);delay(1);wd(0x59);delay(1);
            showtime (ns1,ns2,an,bn) ;
            showmao(1) ;
            showtime (nf1,nf2,cn,dn);
            }
            else
            {
            wc(0x80+0x41);delay(1);wd(kongbai);delay(1);
            showtime(ns1,ns2,10,10);
            showtime(nf1,nf2,10,10);
            showmao(2) ;
            aaak1=1;
            }
        }
    }//2 end


    if(k3==0)//3 start
    {
        delay (100);
        if(k3==0)
        {
            showtime (ns1,ns2,an,bn) ;
            showmao(1) ;
            showtime(nf1,nf2,cn,dn);
            wc(0x80+0x42);delay(1);wd(0x59);delay(1);
            delay (100) ;
            while(1)
            {

                if(k1==0)//3-1 start
                {
                    delay(100);
                    if(k1==0)
                    {
                    bn++;
                    if (bn>=houn)
                    {
                        chn++;
                        if(chn>=2)
                            houn=4;
                        else
                            houn=10;
                        if(an>=2&&bn>=houn)
                        {
                            an=(-1);
                            bn=0;
                            chn=0;
                             houn=10;
                        }
                        an++;
                        bn=0;
                    }
                    showtime(ns1, ns2, an, bn);
                    }
                }//3-1 end


                if(k2==0)//3-2 start
                {
                    delay (100);
                    if(k2==0)
                    {
                    dn++;
                    if(dn>=10)
                    {
                        dn=0;
                        cn++;
                        if(cn>6)
                            cn=0;
                    }
                    showtime(nf1, nf2, cn, dn);
                    }
                }//3-2 end 


                if(k3==0)//3-3 start
                {
                    wc(0x80+0x42);delay(1);wd(kongbai);delay(1);
                    showtime(ns1, ns2, 10, 10);
                    showtime(nf1, nf2, 10, 10);
                    showmao(2) ; 
                    break;
                }//3-3 end


                if(k4==0)//3-4start
                {
                    delay(100);
                    if(k4==0)
                    {
                        if(aaak3==1) 
                        {                    
                            aaak3++;ringoff=1;
                            wc(0x80+0x43);delay(1);wd(0x52);delay(1);
                        } 
                        else 
                        {    
                            aaak3=1;ringoff=0;
                            wc(0x80+0x43);delay(1);wd(kongbai) ;delay(1);
                        }
                    }
                }//3-4 end
            }
        }
    }//3 end


    if(k4==0)//4 start
    {
        delay (100) ;
        if(k4==0)
        {    
            if(aaak4==1)
            {
                aaak4++;
                lamp=1;
                clockon=1;
                wc(0x80+0x4a);delay(1);wd(0xef);delay(1);
                buzz=0;delay(50);buzz=1;delay(50);
                buzz=0;delay(50);buzz=1;delay(50) ;
                buzz=0;delay(50);buzz=1;
            }
            else
            {
                aaak4=1;
                lamp=0;
                clockon=0; 
                wc(0x80+0x4a);delay(1);wd(kongbai);delay(1);
                buzz=0;delay(50);buzz=1;
            }
        }
    }//4 end
}


void main()
{
    TMOD = 0x01;
    init();
    showtime(shi1,shi2,0,0);
    showtime(fen1,fen2,0,0);
    showmao(0); 
    showtime(ns1,ns2,10,10);
    showtime(nf1,nf2,10,10);
    showmao(2);
    time0();

    TR0 = 1;
    ET0 =1;
    EA = 1;
    lamp=0;
    while(1)
    {
        key();
    }
}

void time0()
{
    TH0=(65536-50000)/256;    //50MS
    TL0=(65536-50000)%256;
}
void time1()
{
    TH0=(65536-50000)/256;    //50MS
    TL0=(65536-50000)%256;
}


void t0() interrupt 1
{
    time1();
    tt0++;


    if(k1==0)
    {
        delay(5);//硬件实现时,延时-10
        if(k1==0)
        {
            a=tt5;b=tt4;c=tt3;d=tt2;
            EA=0;ET0=0;TR0=0;
        }
    }


    if(k2==0)
    {
        delay (5) ;//硬件实施时,延时-10
        if(k2==0)
        { 
            if (aaak1==1)
            {
                aaak1++;
                wc(0x80+0x41);delay(1);wd(0x59);delay(1);
                showtime(ns1,ns2,an,bn) ;
                showmao(1);
                showtime(nf1,nf2,cn,dn) ;
            }
            else
            {
                wc(0x80+0x41);delay(1);wd(kongbai) ;delay(1);
                showtime(ns1,ns2,10,10);
                showtime(nf1,nf2,10,10);
                showmao(2) ;
                aaak1=1;
            }
        }
    }


    if(k4==0)
    {
        delay(5) ;
        if(k4==0)
        {
            if(aaak4==1)
            {
                aaak4++; 
                lamp=1;
                clockon=1;
                wc(0x80+0x4a);delay(1);wd(0xef);delay(1);
                buzz=0;delay(50);buzz=1;delay(50);
                buzz=0;delay(50);buzz=1;delay(50);
                buzz=0;delay(50);buzz=1;
            }
            else
            {
                aaak4=1;
                lamp=0;
                clockon=0; 
                wc(0x80+0x4a);delay(1);wd(kongbai);delay(1);
                buzz=0;delay(50);buzz=1;
            }
        }
    }


    if(tt0>=1)//20
    {
        tt0=0;
        led_miao=~led_miao;
        tt1++;
        if(tt1>=1)//判断是否 够秒
        {
            tt2++;
            if(tt2>=10) //判断分钟的个位是否满
            {
                tt2=0;
                tt3++;
                if(tt3>=6)//判断分钟的十位是否满
                {
                    tt3=0;
                    tt4++;
                    if(tt4>=hou)//判断小时的个位是否满或
                    {
                        ch++;
                        if(ch>=2)//当到了时以上时,判断条件变为
                        {
                            hou=4;
                        }
                        else
                        {
                            hou=10;
                        }

                        if(tt5>=2&&tt4>=hou) //当满小时的时候,全部清零,从头算起
                        {
                            tt5=(-1);
                            tt4=0;
                            ch=0;
                            hou=10;
                        }
                        tt5++;
                        tt4=0;
                        showtime(shi1, shi2, tt5, tt4) ;//小时十位加一
                    }
                    showtime(shi1, shi2, tt5, tt4);//小时个位加一
                }
                showtime(fen1, fen2, tt3, tt2);//分钟十位加一
            }
            showtime(fen1, fen2, tt3, tt2) ;//分钟个位加一-
            tt1=0;
        }
    }


    if(clockon==1&&tt5==an&&tt4==bn&&tt3==cn&&tt2==dn&&pt<=60)//ring for 3s
    {
        buzz=0;e=1; lamp=0;pt++;
    }
        if((k4==0&&e==1)|pt>=60)//if ring more than 3s,it will stop
        {
            buzz=1;e=0;clockon=0;wc(0x80+0x4a);delay(1);wd(kongbai);delay(1);pt=0;
        }
}










img

  • 写回答

3条回答 默认 最新

  • yy64ll826 2022-12-04 09:49
    关注

    利用C语言和51单片机制作一个可调节时间和闹钟的keil程序与proteus仿真
    https://blog.csdn.net/qq_40730335/article/details/81659882

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月4日
  • 已采纳回答 12月4日
  • 修改了问题 12月4日
  • 修改了问题 12月4日
  • 展开全部

悬赏问题

  • ¥15 有卷积神经网络识别害虫的项目吗
  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
  • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
  • ¥15 操作系统相关算法中while();的含义
  • ¥15 CNVcaller安装后无法找到文件