flash: http://player.youku.com/player.php/sid/XMjc0MTM5NjA0/v.swfvoid 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_();