打印
[51单片机]

求助如何设计一个可调闹钟,用c语言,说下思路就行了。

[复制链接]
1850|12
手机看帖
扫描二维码
随时随地手机跟帖
沙发
ayb_ice| | 2014-5-28 08:03 | 只看该作者
一个基本计时器,
秒计数
分计数
...

一个简单的比较器

使用特权

评论回复
板凳
lu50211| | 2014-5-28 13:11 | 只看该作者
本帖最后由 lu50211 于 2014-5-28 13:18 编辑

1)如果不用掉电走时,可以用2楼的方法,采用单片内部定时器作时基,分别计算时分秒,
使用一个定时器设置定时50ms中断一次,再用一个变量计次数,50ms*20=1S,再用一个变量计秒次数,1S*60=1min,再用一变量计分次数,1min*60=1H,再用一变量计时次数,1H*24=1day.其它的分别就是处理显示模块,按键调节时钟等。。。
2)如果需要掉电走时,那就需要找日历时钟芯片,比如:HT1380,DS1302,PCF8563等.还有就是要选择显示的方式,比如:数码管6个,分别显示时分秒,年月日,这个显示内容很单一;LCM1602,LCM12864等液晶显示模块,这样显示内容比较丰富。
这个就只需要读取日历时钟内的时钟数据,送到相应的显示设备显示即可,其它就是处理按键调节时钟,再把数据写入日历时钟即可。

使用特权

评论回复
地板
限量_个性。| | 2014-5-28 15:19 | 只看该作者
LZ想用时钟芯片做还是只用单片机的定时器?

使用特权

评论回复
5
ff1212112|  楼主 | 2014-5-28 17:47 | 只看该作者
限量_个性。 发表于 2014-5-28 15:19
LZ想用时钟芯片做还是只用单片机的定时器?

用单片机的定时器做,毕竟我还是初学者

使用特权

评论回复
6
ff1212112|  楼主 | 2014-5-28 17:53 | 只看该作者
lu50211 发表于 2014-5-28 13:11
1)如果不用掉电走时,可以用2楼的方法,采用单片内部定时器作时基,分别计算时分秒,
使用一个定时器设置定 ...

恩恩,谢谢你详细的回复我了。我还是你的第一种方法。还有个问题是闹钟的问题,我可以在程序里面写好,然后利用蜂咛器响,但是怎么才能在板子上调试呢?而不是一次次改程序。

使用特权

评论回复
7
ff1212112|  楼主 | 2014-5-28 17:53 | 只看该作者
ayb_ice 发表于 2014-5-28 08:03
一个基本计时器,
秒计数
分计数

谢谢你的回复了,我正在尝试中。

使用特权

评论回复
8
keer_zu| | 2014-5-28 18:13 | 只看该作者
本帖最后由 keer_zu 于 2014-5-28 18:42 编辑

1. 一个实时时钟芯片:像DS1302,用于时钟功能。
2. 一个小一点的flash或者EEROM用于保存设定值(设定值掉电不能丢)
3. 一个断码屏,显示时间和人机交互(设定等操作)
4. n个按键(看你如何定义)
5. 一个蜂鸣器(闹钟提示),高档一点可以用语音芯片+扬声器(用现成的方案也很便宜,如广州一家记不清了)

mcu随便选一个合适的。

软件嘛,底层是每个设备的操作(如DS1302的读写,LCD的读写),然后封装出更上层功能(比如DS1302的设置或者读取什么的,LCD显示时间和显示设定界面等操作),最后将这些基本功能按照需求组织操作场景。最后实现在这些场景。
尽量用面向对象模型组织资源:实现实时时钟对象,显示界面对象,蜂鸣器对象,IO对象,设置对象,闹铃对象,系统对象等。根据实际添加对象之间的关联关系,在各个对象中实现这种关联。在“系统对象”中实现最终的功能。

使用特权

评论回复
9
yyuukk| | 2014-5-29 11:36 | 只看该作者

楼主辛苦了      

使用特权

评论回复
10
ningling_21| | 2014-5-29 12:25 | 只看该作者
ff1212112 发表于 2014-5-28 17:53
恩恩,谢谢你详细的回复我了。我还是你的第一种方法。还有个问题是闹钟的问题,我可以在程序里面写好,然 ...

选用C8051FXXX的单片机或其它可以调试的MCU就可以在板上调试了...

使用特权

评论回复
11
moxue10| | 2014-5-29 15:54 | 只看该作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar qian,bai,shi,ge,aa,modal,flag;
uchar qian1,bai1,shi1,ge1,modal1;
uchar code table []={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
sbit sound=P1^2;
sbit den1=P0^2;
sbit den2=P0^5;
sbit den3=P0^7;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
void init();
void keyscan();
void display(uchar qian,uchar bai,uchar shi,uchar ge);
void alarmclock();
//void light();
void show();
void delay(uint z);

void main()
{
       
        init();
        while(1)
        {
                display(qian,bai,shi,ge);
                if(ge==ge1 && shi==shi1 && bai==bai1 && qian==qian1)
                {
                        sound=0;
                        delay(1000);
                        sound=1;
                }


                while(flag==2)
                        {
                                display(qian,bai,shi,ge);
                               
                                alarmclock();
                                display(qian1,bai1,shi1,ge1) ;
                        }
                while(flag==1)
                        {
                        display(0,0,0,0);
                        keyscan();
                        }
        //        light();
               
        }
}

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

void exter0() interrupt 0
{
          den3=0;       
          flag++;
          TR0=0;
          if(flag==3)
          {
                  flag=0;
          }
}  

void show()
{
                den1=0;
                if(aa==20)
                {
                        aa=0;
                        ge++;
                        if(ge==10)
                        {
                                ge=0;
                                shi++;
                                if(shi==6)
                                {
                                        shi=0;
                                        bai++;
                                        switch(qian)
                                        {
                                                case 0:
                                                        if(bai==10)
                                                        {
                                                                bai=0;
                                                                qian++;
                                                                break;
                                                        }
                                //                        break;                                                       
                                                case 1:
                                                        if(bai==10)
                                                        {
                                                                bai=0;
                                                                qian++;
                                                                break;
                                                        }
                                                        break;
                                                case 2:
                                                        if(bai==4)
                                                        {
                                                                bai=0;
                                                                qian=0;

                                                        }
                                                        break;
                                        }
                                }
                        }
                }
}

void keyscan()
{

        if(key1==0)
        {
               
                delay(10);
                if(key1==0)
                {
                        while(!key1);
                        modal++;
                        if(modal>=5)
                        {
                                den3=1;
                                flag=0;
                                TH0=(65536-50000)/256;
                                TL0=(65536-50000)%256;
                                aa=0;
                                TR0=1;

                                modal=0;
                        }
                        while(modal)
                        {
                                if(key1==0)
                                {
               
                                        delay(10);
                                        if(key1==0)
                                        {
                                                while(!key1);
                                                modal++;
                                                if(modal>=5)
                                                {
                                                        den3=1;
                                                        flag=0;
                                                        TH0=(65536-50000)/256;
                                                        TL0=(65536-50000)%256;
                                                        aa=0;
                                                        TR0=1;

                                                        modal=0;
                                                }
                                        }
                                }
                       
                                switch(modal)
                                {
                                        case 1:
                                       
                                                if(key2==0)
                                                {
                                                        delay(10);               
                                                        if(key2==0)
                                                        {
                                                                while(!key2);
                                               
                                                                qian++;
                                                                if(qian>2)
                                                                {
                                                                        qian=0;
                                                                }       
                                                                display(qian,bai,shi,ge);
                                                       
                                                        }
                                                }
                                                if(key3==0)
                                                {
                                                        delay(10);
                                                        if(key3==0)
                                                        {
                                                                while(!key3);
                                                                qian--;
                                                                if(qian<0)
                                                                {
                                                                        qian=2;
                                                                }
                                                                display(qian,bai,shi,ge);
                                                        }
                                               
                                                }
                                                break;

                                        case 2:
                                                if(key2==0)
                                                {
                                                        delay(10);
                                                        if(key2==0)
                                                        {
                                                                while(!key2);
                                                                bai++;
                                                                switch(qian)
                                                                {
                                                                        case 0 :
                                                                                        if(bai>9)
                                                                                                {
                                                                                                        bai=0;
                                                                                                }
                                                                        case 1 :
                                                                                        if(bai>9)
                                                                                                {
                                                                                                        bai=0;
                                                                                                }                                                                                                       
                                                                        case 2 :
                                                                                        if(bai>4)
                                                                                                {
                                                                                                        bai=0;
                                                                                                }
                                                                }       
                                                                display(qian,bai,shi,ge);
                                                        }
                                                }
                                                if(key3==0)
                                                {
                                                        delay(10);
                                                        if(key3==0)
                                                        {
                                                                while(!key3);
                                                                bai--;
                                                                display(qian,bai,shi,ge);
                                                        }
                                               
                                                }
                                                break;

                                        case 3:
                                                if(key2==0)
                                                {
                                                        delay(10);
                                                        if(key2==0)
                                                        {
                                                                while(!key2);
                                                                shi++;
                                                                display(qian,bai,shi,ge);
                                                        }
                                                }
                                                if(key3==0)
                                                {
                                                        delay(10);
                                                        if(key3==0)
                                                        {
                                                                while(!key3);
                                                                shi--;
                                                                display(qian,bai,shi,ge);
                                                        }
                                               
                                                }
                                                break;

                                        case 4:
                                                if(key2==0)
                                                {
                                                        delay(10);
                                                        if(key2==0)
                                                        {
                                                                while(!key2);
                                                                ge++;
                                                                display(qian,bai,shi,ge);
                                                        }
                                                }
                                                if(key3==0)
                                                {
                                                        delay(10);
                                                        if(key3==0)
                                                        {
                                                                while(!key3);
                                                                ge--;
                                                                display(qian,bai,shi,ge);
                                                        }
                                               
                                                }
                                                break;
                                         
                                }
                                display(qian,bai,shi,ge);
                        }
                }
        }
}

void alarmclock()
{
        if(key4==0)
        {
                delay(10);
                if(key4==0)
                {
                        while(!key4);
                        modal1++;
                        if(modal1>=5)
                        {               
                                den3=1;
                                flag=0;
                                TH0=(65536-50000)/256;
                                TL0=(65536-50000)%256;
                                aa=0;
                                TR0=1;
                               
                                modal1=0;
                        }
                        while(modal1)
                        {
                                if(key4==0)
                                {
                                                delay(10);
                                                if(key4==0)
                                                {
                                                        while(!key4);
                                                        modal1++;
                                                        if(modal1>=5)
                                                        {
                                                                 den3=1;
                                                                flag=0;
                                                                TH0=(65536-50000)/256;
                                                                TL0=(65536-50000)%256;
                                                                aa=0;
                                                                TR0=1;
                                                                modal1=0;
                                                        }
                                                }
                                }
       
                                switch(modal1)
                                {
                                        case 1:
                                                if(key2==0)
                                                {
                                                        delay(10);
                                                        if(key2==0)
                                                        {
                                                                while(!key2);
                                                                qian1++;
                                                                display(qian1,bai1,shi1,ge1);
                                                        }
                                                }
                                                if(key3==0)
                                                {
                                                        delay(10);
                                                        if(key3==0)
                                                        {
                                                                while(!key3);
                                                                qian1--;
                                                                display(qian1,bai1,shi1,ge1);
                                                        }
                                               
                                                }
                                                break;

                                        case 2:
                                                if(key2==0)
                                                {
                                                        delay(10);
                                                        if(key2==0)
                                                        {
                                                                while(!key2);
                                                                bai1++;
                                                                display(qian1,bai1,shi1,ge1);
                                                        }
                                                }
                                                if(key3==0)
                                                {
                                                        delay(10);
                                                        if(key3==0)
                                                        {
                                                                while(!key3);
                                                                bai1--;
                                                                display(qian1,bai1,shi1,ge1);
                                                        }
                                                       
                                                }
                                                break;
                          
                                        case 3:
                                                if(key2==0)
                                                {
                                                        delay(10);
                                                        if(key2==0)
                                                        {
                                                                while(!key2);
                                                                shi1++;
                                                                display(qian1,bai1,shi1,ge1);
                                                        }
                                                }
                                                if(key3==0)
                                                {
                                                        delay(10);
                                                        if(key3==0)
                                                        {
                                                                while(!key3);
                                                                shi1--;
                                                                display(qian1,bai1,shi1,ge1);
                                                        }
                                               
                                                }
                                                break;

                                        case 4:
                                                if(key2==0)
                                                {
                                                        delay(10);
                                                        if(key2==0)
                                                        {
                                                                while(!key2);
                                                                ge1++;
                                                                display(qian1,bai1,shi1,ge1);
                                                        }
                                                }
                                                if(key3==0)
                                                {
                                                        delay(10);
                                                        if(key3==0)
                                                        {
                                                                while(!key3);
                                                                ge1--;
                                                                display(qian1,bai1,shi1,ge1);
                                                        }
                                               
                                                }
                                                break;
               
                                }
                        }
                }
        }
}
/*
void light()
{
        if(key2==0 && key3==0)
        {
                delay(10);
                if(key2==0 && key3==0)
                {
                        den2=0;
                        delay(1000);
                        den2=1;
                }
        }
}

                 */


void init()
{
        TMOD=0x01;
        TH0=65536/256;
        TL0=65536%256;
        EA=1;
        EX0=1;
        IT0=1;
        TF0=0;
        ET0=1;
        TR0=1;
        display(0,0,0,0);
}

void display(uchar qian,uchar bai,uchar shi,uchar ge)
{
        P2=table[ge];
        P1=0x7f;
        delay(10);

        P2=table[shi];
        P1=0xbf;
        delay(10);

        P2=table[bai];
        P1=0xdf;
        delay(10);

        P2=table[qian];
        P1=0xef;
        delay(10);

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

你可以看看这个  看有没有思路

使用特权

评论回复
12
ff1212112|  楼主 | 2014-5-30 09:40 | 只看该作者
我已经写出来,谢谢各位了哈

使用特权

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

本版积分规则

1

主题

5

帖子

0

粉丝