切换到宽版
爱科技/爱创意/爱折腾/爱极致;技术知识分享平台,点击进入新版数码之家网站
  • 3189阅读
  • 5回复

[另类]SD2203MINI闹钟(KC_8023) [复制链接]

上一主题 下一主题
离线pumaoboy
 
发帖
307
M币
754
专家
3
粉丝
15
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2011-06-11
flash: http://player.youku.com/player.php/sid/XMjc0MTM5NjA0/v.swf
void main()
{
    sys_init();
    smg_dis();
//    date_dat[0]=year;    //初始BCD写入SD2203
//    date_dat[1]=moth;
//    date_dat[2]=date;
//    date_dat[3]=week;
//    date_dat[4]=hour;
//    date_dat[5]=min;
//    date_dat[6]=sec;
//    I2CWriteStatus();
//    I2CWriteTime();

/*    if(flag_w)
    {
        hour_c=0x08;    //第一次使用写入闹时初始值为8点
        write_IIC();
        flag_w=0;
    }
    else               //第二次以后为读之前存入的闹时
        read_IIC();    */
    while(1)
    {
        I2CReadDate();     //读出的是BCD码
        if(key_ok)
        {
            read_key();    //将数组的BCD转ASC 方便加减 再转BCD存入SD2203
            key_ok = 0;    
        }
        display();         //判断是否是范围内,并将BCD转ASC显示
    }
}

/***************定时器0中断函数***************/
void timer0() interrupt 1 using 2  
{
    static uchar count,count1;
//    TH0=(65536-50000)/256;   // 定时器0设置初始值50ms中断初始值
//    TL0=(65536-50000)%256;
    TH0=0xd8;                  //10ms
     TL0=0xf0;    
    key_ok = 1;
    if(++count>=50)            // 定时 .5S 到,以下为时钟的正常走钟逻辑
    {            
        count=0;
        flag = ~flag;
        if(++count1>=120)    //1min
        {        
            count1=0;
            /*sec++;
            if(sec>= 60)
            {                
                sec=0;
                min++;
                if(min>= 60)
                {          
                    min=0;
                    hour++;
                    if(hour>= 24)
                    {    
                        hour=0;
                    }
                }
             }    */
        }    
        if(count1==0||count1==42||count1==82)          //00-10   21-30    41-50
            flag_dis = true;                //显示时分
        else if(count1==22||count1==62||count1==102)   //11-20      31-40       51-59
            flag_dis = false;                //显示月日
    }                            
}


<DIV id=read_3013570 mb10?>#include <REG2051.H>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char
#define true  1
#define false 0

#define dis_time 2

sbit key = P3^4;
sbit SDA=P3^5;            /*模拟I2C数据传送位*/
sbit SCL=P3^7;            /*模拟I2C时钟控制位*/

//共阴
uchar code tab1[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar code tab2[]={0x3F,0x06,0x9B,0x8F,0xa6,0xaD,0xbD,0x07,0xbF,0xaF};
uchar year = 0x11,moth = 0x06,date = 0x08,week = 0x03,hour = 0x09,min = 0x13,sec = 0x56;
uchar mode = 0,hour_c = 8,min_c = 0;    //默认开08:00闹钟
bit flag = false,key_ok = false,flag_dis = true,flag_c = true;//,flag_w = true;
                                                                        
uchar   date_dat[7];   //日期数组
                  /*date[0]=year,date[1]=month,date[2]=day,date[3]=week,
                    date[4]=hour,date[5]=minute,date[6]=second*/


void delayms(uint t)      // 晶振频率12M
{
    uint i;
       while(t--)
    for(i=0;i<125;i++);
}

//▄︻┻═┳一
uchar bcdtoasc(uchar cha)    //16转10
{
     return ((cha/16)*10+(cha%16));
}
//▄︻┻═┳一    
uchar asctobcd(uchar cha)  //10转16
{
     return ((cha/10)*16+(cha%10));
}
<DIV mb10?>  2011-06-09
    KC_8023
    Ver 1.0
    XTAL 12MHz
    MCU  AT89C2051

1、整体结构采用USB供电,SD2203备用电池3.6可充电,充电由数码管小数点控制引脚给出同秒点闪烁的脉冲信号,
可显示月日和时分,可设置一路闹钟,由于SD2203内部只一个字节的RAM,所以只能保存住闹钟的小时数据,闹钟
信号由按键引脚送出,蜂鸣器采用无源的,这样手动设置时,按键按下频率不够高而不能发出声音,当有闹钟信
号时,在按键脚发出高频率的信号便可蜂鸣,同时把此信号放在显示函数中,以防止程序误认为是手动设置信号,
并在走时短按键时,数码管可花样显示,让MINI闹钟更具魅力。

2、每10秒显示时分(有两个秒点闪烁) 每5秒显示月日(有一个下秒点,并且十位为0时不显示)

3、每一个整点时钟数码管花样显示一次(成波浪状),所谓的整点报时

4、按键工作过程:在正常走时短按下,数码管都会花样显示波浪一次,第一次长按后,显示小时数据,同时个位
秒点闪烁,此时短按可调小时,第二次长按后,显示分钟数据,同时十位秒点闪烁,此时短按可调分钟,第三次
长按后,显示月数据,同时十位秒点闪烁,十位为0时不显示,此时短按可调月,第四次长按后,显示日数据,同
时个位秒点闪烁,十位为0时不显示,此时短按可调日,第五次长按后,显示ON,短按时可在ON和OFF间切换,这个
是用来开关闹钟,第六次长按,显示闹钟时数据,短按可调闹时,第七次长按,显示闹钟分数据,短按可调闹分,
第八次长按,退出调节,正常走时。
    2011-06-11
    KC_8023
    Ver 2.0
    XTAL 12MHz
    MCU  AT89C2051

0、在Ver1.0的基础上,省去了一个长按开关闹钟的功能,把这一功能加设到走时短按状态下,即节约调节时间,
又让闹钟更具人性化。

1、整体结构采用USB供电,SD2203备用电池3.6可充电,充电由数码管小数点控制引脚给出同秒点闪烁的脉冲信号,
可显示月日和时分,可设置一路闹钟,由于SD2203内部只一个字节的RAM,所以只能保存住闹钟的小时数据,闹钟
信号由按键引脚送出,蜂鸣器采用无源的,这样手动设置时,按键按下频率不够高而不能发出声音,当有闹钟信
号时,在按键脚发出高频率的信号便可蜂鸣,同时把此信号放在显示函数中,以防止程序误认为是手动设置信号,
并在走时短按键时可以让数码管花样显示或蜂鸣,让MINI闹钟更显魅力。

2、每10秒显示时分(有两个秒点闪烁) 每5秒显示月日(有一个下秒点,并且十位为0时不显示)

3、每一个整点时钟数码管花样显示一次(成波浪状),所谓的整点报时

4、按键工作过程:在正常走时短按下,数码管都会花样显示波浪一次,若没有蜂鸣跟随说明当前闹钟关闭,若再
短按一次,显示花样并有蜂鸣跟随,说明当前闹钟开启;第一次长按后,显示小时数据,同时个位秒点闪烁,此
时短按可调小时,第二次长按后,显示分钟数据,同时十位秒点闪烁,此时短按可调分钟,第三次长按后,显示
月数据,同时十位秒点闪烁,十位为0时不显示,此时短按可调月,第四次长按后,显示日数据,同时个位秒点闪
烁,十位为0时不显示,此时短按可调日,第五次长按,显示闹钟时数据,短按可调闹时,第六次长按,显示闹钟
分数据,短按可调闹分,第七次长按,退出调节,正常走时。<DIV mb10?> <DIV mb10?> <DIV mb10?>
if((hour==hour_c)&&(min==min_c)&&(mode==0)&&(flag_c))//时 分 闹标志 及不是在调节模式时数据一致则产生闹钟
  clock = true;
else
  clock = false;
if((min==0)&&(sec==0)&&(mode==0))     //每小时显示报告 (整点报时)
{
  hour_b = true;
  smg_dis();
}
else
  hour_b = false;
  
switch(mode)
{
  case 0:
   //正常计时显示
       //时分
   if(flag_dis)
   {    
    P1=tab1[hour/10];        //  显示时的十位
    P3_0=0;
    delayms(dis_time);
    P3_0=1;
    clock_();
  
    P1=tab1[hour%10];        //  显示时的个位
    if(flag)
     P1_7 = ~ P1_7;   //秒闪
    P3_1=0;
    delayms(dis_time);
    P3_1=1;
    clock_();
  
    P1=tab2[min/10];         //  显示分的十位
    if(flag)
     P1_6 = ~ P1_6;  //秒闪
    P3_2=0;
    delayms(dis_time);
    P3_2=1;
    clock_();
  
    P1=tab1[min%10];         //  显示分的个位
    P3_3=0;
    delayms(dis_time);
    P3_3=1;
    clock_();
   }
   else   //月日
   {
    if(moth/10 != 0)
     P1=tab1[moth/10];        //  月的十位不为0则显否则不显示(消稳十位的0)
    else
     P1=0x00;
    P3_0=0;
    delayms(dis_time);
    P3_0=1;
    clock_();
  
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共4条打赏M币+25
离线pumaoboy
发帖
307
M币
754
专家
3
粉丝
15
只看该作者 1楼 发表于: 2011-06-11
请登录后查看
离线咏珩

发帖
18054
M币
1704
专家
60
粉丝
4491
只看该作者 2楼 发表于: 2011-06-11
请登录后查看
离线pumaoboy
发帖
307
M币
754
专家
3
粉丝
15
只看该作者 3楼 发表于: 2011-06-11
请登录后查看
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线pumaoboy
发帖
307
M币
754
专家
3
粉丝
15
只看该作者 4楼 发表于: 2011-06-11
回 2楼(咏珩) 的帖子
请登录后查看
离线pumaoboy
发帖
307
M币
754
专家
3
粉丝
15
只看该作者 5楼 发表于: 2011-06-11
请登录后查看
快速回复
限80 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个