单片机时钟.docx
- 文档编号:28413214
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:30
- 大小:51.58KB
单片机时钟.docx
《单片机时钟.docx》由会员分享,可在线阅读,更多相关《单片机时钟.docx(30页珍藏版)》请在冰豆网上搜索。
单片机时钟
注:
本设计使用三个独立按键,具有调时,调日期,调报警时间,整点报警等功能;非常适合做课程设计,附电路图;
具体操作为:
点击Key3查看日期,长按Key3查看设定时间,长长按Key3调整设定时间;
长按key1调整时间;
长按key2调整日期;
注:
在调整模式下按key3切换调整参数。
#include
#defineu8unsignedchar
#defineu16unsignedshort
#definefz
#ifdeffz
sbitrtc_clk=P3^5;
sbitrtc_io=P3^6;
sbitrtc_rst=P3^7;
sbitSeg1=P2^0;
sbitSeg2=P3^3;
sbitSeg3=P3^4;
sbitSeg4=P3^2;
sbitkey1=P2^7;
sbitkey2=P2^6;
sbitkey3=P2^5;
sbitbeep=P2^1;
#endif
//#ifdefkfb
//sbitrtc_clk=P3^6;
//sbitrtc_io=P3^4;
//sbitrtc_rst=P3^5;
//sbitSeg1=P1^0;
//sbitSeg2=P1^1;
//sbitSeg3=P1^2;
//sbitSeg4=P1^3;
//sbitkey1=P1^5;
//sbitkey2=P1^4;
//sbitkey3=P1^6;
//sbitbeep=P2^1;
//#endif
typedefstruct{
unsignedcharb0:
1;
unsignedcharb1:
1;
unsignedcharb2:
1;
unsignedcharb3:
1;
unsignedcharb4:
1;
unsignedcharb5:
1;
unsignedcharb6:
1;
unsignedcharb7:
1;
}flag_T;
typedefstruct
{
unsignedchardown_time:
7;
unsignedchardown_flag:
1;
}key_information;
u8wei1,wei2,wei3,wei4,mark;
u8second=0;
u8key_value=0;
u8break_time=0;
u8offet=0;
u8coruscate_time=0;
chartime_dat[7]={0,5,14,2,12,3,15};//秒分时日月星期年
charset_time_dat[7]={0,5,14,2,12,3,15};//秒分时日月星期年
flag_Tflag0;
key_informationkey_left;
key_informationkey_middle;
key_informationkey_right;
#defineno_key_click0//无按键按下
#definekey_right_short_click1//key1短点击
#definekey_right_long_click4//key1长点击
#definekey_right_long_long_click7//key1更长点击
#definekey_middle_short_click2//key2短点击
#definekey_middle_long_click5//key2长点击
#definekey_middle_long_long_click8//key2更长点击
#definekey_left_short_click3//key3短点击
#definekey_left_long_click6//key3长点击
#definekey_left_long_long_click9//key3更长点击
#definesecond_flagflag0.b0
#defineset_flagflag0.b1
#definedis_flagflag0.b2
#definebeep_closeflag0.b3
#definebeep_enflag0.b4
constchartable[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
};
constcharmax[]={59,59,23,31,12,7,99};
voiddelay(u8z)
{
u8x;
u16y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidrtc_delay(void)
{
u8i;
for(i=5;i>0;i--);
}
/*
*===FUNCTION======================================================================
*Name:
write_1byte_to_ds1302
*Description:
向ds1302写入1byte数据
*=====================================================================================
*/
voidwrite_1byte_to_ds1302(unsignedcharda)
{
unsignedinti;
rtc_clk=0;
for(i=8;i>0;i--){
if((da&0x01)!
=0)
rtc_io=1;
else
rtc_io=0;
rtc_delay();
rtc_clk=0;
rtc_delay();
rtc_clk=1;
da>>=1;//相当于汇编中的RRC
rtc_delay();
}
}
/*
*===FUNCTION======================================================================
*Name:
read_1byte_from_ds1302
*Description:
从ds1302读取1byte数据
*=====================================================================================
*/
unsignedcharread_1byte_from_ds1302(void)
{
unsignedchari;
unsignedcharda=0;
rtc_clk=0;
for(i=8;i>0;i--){
da>>=1;//相当于汇编中的RRC
if(rtc_io!
=0)
da|=0x80;
rtc_delay();
rtc_clk=1;
rtc_delay();
rtc_clk=0;
rtc_delay();
}
return(da);
}
/*
*===FUNCTION======================================================================
*Name:
write_data_to_ds1302
*Description:
向ds1302写入数据
*=====================================================================================
*/
voidwrite_data_to_ds1302(unsignedcharaddr,unsignedcharda)
{
rtc_rst=0;//复位,低电平有效
rtc_delay();
rtc_clk=0;
rtc_delay();
rtc_rst=1;
rtc_delay();
write_1byte_to_ds1302(addr);//地址,命令
write_1byte_to_ds1302(da);//写1Byte数据
rtc_delay();
rtc_clk=1;
rtc_delay();
rtc_rst=0;
}
/*
*===FUNCTION======================================================================
*Name:
read_data_from_ds1302
*Description:
从ds1302读取数据
*=====================================================================================
*/
unsignedcharread_data_from_ds1302(unsignedcharaddr)
{
unsignedcharda;
rtc_rst=0;
rtc_delay();
rtc_clk=0;
rtc_delay();
rtc_rst=1;
rtc_delay();
write_1byte_to_ds1302(addr);
rtc_delay();
da=read_1byte_from_ds1302();
rtc_delay();
rtc_clk=1;
rtc_delay();
rtc_rst=0;
return(da);
}
/*
*===FUNCTION======================================================================
*Name:
set_time
*Description:
设置时间
*=====================================================================================
*/
voidset_time(void)
{
unsignedchari,time;
unsignedcharaddr=0x80;
write_data_to_ds1302(0x8e,0x00);//控制命令,WP=0,写操作
for(i=0;i<7;i++){
time=time_dat[i]/10*16+time_dat[i]%10;
write_data_to_ds1302(addr,time);//秒分时日月星期年
addr+=2;
rtc_delay();
rtc_delay();
}
write_data_to_ds1302(0x8e,0x80);//控制命令,WP=1,写保护
}
/*
*===FUNCTION======================================================================
*Name:
get_time
*Description:
获取时间,读取的时间为BCD码,需要转换成十进制
*=====================================================================================
*/
voidget_time(void)
{
unsignedchari;
unsignedcharaddr=0x81;
chartime;
for(i=0;i<3;i++){
time=read_data_from_ds1302(addr);//读取的时间为BCD码
time_dat[i]=time/16*10+time%16;//格式为:
秒分时日月星期年
addr+=2;
}
}
//voiddig_dis_unsigned(u8dat)//显示无符号数
//{
//registeru8bai,shi,ge;
//ge=*(table+(dat%10));
//shi=*(table+(dat/10%10));
//bai=*(table+(dat/100));
//wei1=ge;
//wei2=0;
//wei3=0;
//wei4=0;
//if(dat>=100)
//{
//wei3=bai;
//wei2=shi;
//}elseif(dat>=10)
//{
//wei2=shi;
//}
//}
voiddis_time(u8*dat)
{
if(second!
=time_dat[0])
{
second=time_dat[0];
second_flag=~second_flag;
}
if(second_flag==1)
{
mark=0x80;
}elsemark=0;
wei1=*(table+(dat[1]%10));
wei2=*(table+(dat[1]/10%10));
wei3=*(table+(dat[2]%10))|0x80;
wei4=*(table+(dat[2]/10%10));
}
voiddis_date(void)
{
if(second!
=time_dat[0])
{
second=time_dat[0];
second_flag=~second_flag;
}
if(second_flag==1)
{
mark=0x80;
}elsemark=0;
wei1=*(table+(time_dat[3]%10));
wei2=*(table+(time_dat[3]/10%10));
wei3=*(table+(time_dat[4]%10))|0x80;
wei4=*(table+(time_dat[4]/10%10));
}
signedcharsigned_parameter_set(signedchardat,signedcharpara_min,signedcharpara_max)
{
if(key_value==key_middle_short_click||key_value==key_right_short_click)
{
delay(200);
}elsedelay(60);
if(dat>para_max)
dat=para_max;
elseif(dat dat=para_min; if(key_middle.down_flag) { if(dat { dat++; } returndat; } if(key_right.down_flag) { if(dat>para_min) { dat--; } } returndat; } u8get_ri_value(u8dat) { if((dat==1)||(dat==3)||(dat==5)||(dat==7)||(dat==8)||(dat==10)||(dat==12)) return31; elseif(dat==2) { return29; } else{ return30; } return0; } u8key_scan(void) { key_value=no_key_click; if(key3==0)//key_set { key_left.down_flag=1; if(key_left.down_time<=20)//小于1秒表示短按 { key_value=key_left_short_click; }elseif(key_left.down_time>60)//大于3秒为长按 { key_value=key_left_long_long_click; } elseif(key_left.down_time>20)//按键大于1秒 { key_value=key_left_long_click; } }else{ key_left.down_flag=0; key_left.down_time=0; } if(key2==0)//key_down { key_middle.down_flag=1; if(key_value! =no_key_click) return0; if(key_middle.down_time<=20)//小于1秒表示短按 { key_value=key_middle_short_click; }elseif(key_middle.down_time>60)//大于3秒为长按 { key_value=key_middle_long_long_click; } elseif(key_middle.down_time>20)//按键大于1秒 { key_value=key_middle_long_click; } }else{ key_middle.down_flag=0; key_middle.down_time=0; } if(key1==0)//key_up { key_right.down_flag=1; if(key_value! =no_key_click) return0; if(key_right.down_time<=20)//小于1秒表示短按 { key_value=key_right_short_click; }elseif(key_right.down_time>60)//大于3秒为长按 { key_value=key_right_long_long_click; } elseif(key_right.down_time>20)//按键大于1秒 { key_value=key_right_long_click; } }else{ key_right.down_flag=0; key_right.down_time=0; } returnno_key_click; } u8action_state=0; u8action_state_temp=0; u8state=0; u8limit=0; u8key_action(void) { if(key_value==no_key_click) { action_state=action_state_temp; }elsebreak_time=0; if((action_state>0)&&(action_state<3)) { if((break_time>=5)||(key_left.down_flag==1)) { state=0; action_state_temp=0; } }elseif((action_state==3)||(action_state==4)||(action_state==5)) { if(break_time>=30) { state=0; offet=0; action_state_temp=0; } } if(action_state! =4) { get_time(); } switch(action_state) { case0: if(key_value==key_left_short_click)//日期查询 { state=1; action_state_temp=1; } elseif(key_value==key_left_long_click)//设定时间查询 { state=2; action_state_temp=2; } elseif(key_value==key_left_long_long_click)//设定时间 { state=2; action_state_temp=3; } elseif(key_value==key_right_long_click) { state=0; action_state_temp=4; } elseif(key_value==key_middle_long_click) { state=1; action_state_temp=5; } else{ state=0; action_state_temp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 时钟