单片机多功能电子钟程序编程参考Word文件下载.docx
- 文档编号:5273042
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:29
- 大小:23.21KB
单片机多功能电子钟程序编程参考Word文件下载.docx
《单片机多功能电子钟程序编程参考Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机多功能电子钟程序编程参考Word文件下载.docx(29页珍藏版)》请在冰点文库上搜索。
#defineALARM0xFB//定义ALARM键值为FBH;
#defineEnte_Snooze0xFB//定义E/S键值为BFH;
voidkey_task(void);
voidprocess(ucharcurrent_key);
externbitflash_flag;
//定义全局变量(标志位);
externucharfunction_count;
externbitalarm_flag;
externbitkey_enable;
voiddis();
voidsendbyte();
voidreset_3w();
voidwbyte_3w(uchar);
ucharrbyte_3w();
voidwrite_byte(ucharClock_Add,ucharClock_Data);
ucharread_byte(uchar);
voidwrite_clock_burst();
voidds1302_init();
voidds1302_task();
voidlcd_disp_time1();
voiddis_WD();
voidds18b20();
voidalarm_clock(void);
voiddelay(unsignedinttime)//10ms延时
{unsignedchara,b,c;
for(a=0;
a<
time;
a++)
for(b=0;
b<
10;
b++)
for(c=0;
c<
120;
c++);
}
voidmain()//主程序;
{ds1302_init();
//初始化DS1302;
beeper=1;
//初始化闹铃管脚;
while
(1)//循环;
{key_task();
//扫描键盘子程序;
ds1302_task();
//DS1302子程序;
ds18b20();
//DS18B20子程序;
alarm_clock();
//闹铃子程序;
disp_time();
//时间显示子程序;
delay(55);
//延时;
beeper=1;
//闹铃管脚置1;
}}
程序A.2电子时钟程序
//主要是对时钟芯片DS1302初始化;
/*-------------定义初始化时间----------*/
ucharsec=00;
ucharmin=25;
ucharhour=14;
uchardate=12;
ucharmonth=5;
ucharyear=8;
ucharday_of_week;
ucharclk_hour=14;
ucharclk_min=28;
//-14:
28-
/*-----------------定义寄存器地址----------------------*/
#defineREAD_SEC_ADD0x81//读秒寄存器
#defineREAD_MIN_ADD0x83//读分寄存器
#defineREAD_HOUR_ADD0x85//读时寄存器
#defineREAD_DATE_ADD0x87//读日寄存器
#defineREAD_MONTH_ADD0x89//读月寄存器
#defineREAD_DOW_ADD0x8B//读周寄存器
#defineREAD_YEAR_ADD0x8D//年寄存器
#defineWRITE_SEC_ADD0x80//写秒寄存器
#defineWRITE_MIN_ADD0x82//写分寄存器
#defineWRITE_HOUR_ADD0x84//写时寄存器
#defineWRITE_DATE_ADD0x86//写日寄存器
#defineWRITE_MONTH_ADD0x88//写月寄存器
#defineWRITE_DOW_ADD0x8A//写周寄存器
#defineWRITE_YEAR_ADD0x8C//写年寄存器
#defineCLOCK_BURST_ADD0xBE//时钟多字节传送模式
externvoidwrite_clock_burst();
externvoidwrite_byte(ucharClock_Add,ucharClock_Data);
sbitSCLK=P3^5;
//定义管脚SCLK
sbitIO=P3^6;
//定义管脚I/O
sbitRST=P3^7;
//定义管脚RST
ucharsec,min,hour,date,month,year;
ucharcodehex2bcd[]={
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,/*00-09*/
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,/*10-19*/
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,/*20-29*/
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,/*30-39*/
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,/*40-49*/
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,/*50-59*/
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,/*60-69*/
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,/*70-79*/
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,/*80-89*/
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,/*90-99*/
};
ucharcodebcd2hex[]={
0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,/*00-09*/
10,11,12,13,14,15,16,17,18,19,0,0,0,0,0,0,/*10-19*/
20,21,22,23,24,25,26,27,28,29,0,0,0,0,0,0,/*20-29*/
30,31,32,33,34,35,36,37,38,39,0,0,0,0,0,0,/*30-39*/
40,41,42,43,44,45,46,47,48,49,0,0,0,0,0,0,/*40-49*/
50,51,52,53,54,55,56,57,58,59,0,0,0,0,0,0,/*50-59*/
60,61,62,63,64,65,66,67,68,69,0,0,0,0,0,0,/*60-69*/
70,71,72,73,74,75,76,77,78,79,0,0,0,0,0,0,/*70-79*/
80,81,82,83,84,85,86,87,88,89,0,0,0,0,0,0,/*80-89*/
90,91,92,93,94,95,96,97,98,99,0,0,0,0,0,0,/*90-99*/
voidreset_3w()//复位子程序
{SCLK=0;
RST=0;
//复位DS1302,中止数据传送
RST=1;
//启动数据传送
}
voidwbyte_3w(ucharW_Byte)//写字节子程序
{uchari;
for(i=0;
i<
8;
++i)
{IO=0;
if(W_Byte&
0x01)
{IO=1;
}
SCLK=0;
SCLK=1;
W_Byte>
>
=1;
ucharrbyte_3w()//读字节子程序
ucharR_Byte;
ucharTmpByte;
R_Byte=0x00;
IO=1;
i++)
{SCLK=1;
TmpByte=(uchar)IO;
TmpByte<
<
=7;
R_Byte>
R_Byte|=TmpByte;
returnR_Byte;
voidwrite_byte(ucharClock_Add,ucharClock_Data)
{reset_3w();
wbyte_3w(Clock_Add);
wbyte_3w(Clock_Data);
reset_3w();
voidwrite_clock_burst()
//复位
wbyte_3w(CLOCK_BURST_ADD);
//写多字节传送模式寄存器
wbyte_3w(hex2bcd[sec]);
//写入初始化时间
wbyte_3w(hex2bcd[min]);
wbyte_3w(hex2bcd[hour]);
wbyte_3w(hex2bcd[date]);
wbyte_3w(hex2bcd[month]);
wbyte_3w(hex2bcd[day_of_week]);
wbyte_3w(hex2bcd[year]);
wbyte_3w(0);
/*mustwritecontrolregisterinburstmode*/
ucharread_byte(ucharClock_Add)//从DS1302读一个字节
{ucharClock_Data;
Clock_Data=rbyte_3w();
return(Clock_Data);
voidds1302_init()/*---initializetime&
datefordefaultvalue---*/
wbyte_3w(0x8e);
//写保护寄存器
//去保护
wbyte_3w(0x90);
//写涓流充电寄存器
wbyte_3w(0xab);
//开涓流充电,在VCC1和VCC2之间串入2个二极管,8KΩ电阻
write_clock_burst();
voidds1302_task()
{if(!
key_enable)
{sec=bcd2hex[read_byte(READ_SEC_ADD)];
//读DS1302sec
min=bcd2hex[read_byte(READ_MIN_ADD)];
//读DS1302min
hour=bcd2hex[read_byte(READ_HOUR_ADD)];
//读DS1302hour
date=bcd2hex[read_byte(READ_DATE_ADD)];
day_of_week=bcd2hex[read_byte(READ_DOW_ADD)];
month=bcd2hex[read_byte(READ_MONTH_ADD)];
//读DS1302month
year=bcd2hex[read_byte(READ_YEAR_ADD)];
//读DS1302year
程序A.3键盘子程序
//主要是用于对时间的设定与调整
uintwait_time;
bitkey_enable;
bitflash_flag;
bitalarm_flag;
ucharflash_count;
ucharfunction_count=0;
ucharkey;
ucharkey_push;
ucharkey_l;
voidkey_scan()//扫描键盘;
{ucharl,a,PUSH;
PUSH=P2&
0xFF;
if(PUSH!
=0xFF)
{for(l=500;
l>
0;
l--)//延时;
for(a=50;
a>
a--);
if(PUSH!
{key_push=P2&
key=key_push;
//key等于键值;
}}}
voidprocess(ucharcurrent_key)//按键功能子程序;
{switch(current_key)
{caseFUNCTION:
//功能选择键;
{key_enable=true;
function_count=function_count+1;
if(function_count>
=9)
function_count=1;
break;
caseUP:
//加1操作键;
{if(function_count==1)//function_count=1,则秒加1操作;
{sec++;
if(sec>
=60)//秒加到60,则被置0;
sec=0;
write_byte(WRITE_SEC_ADD,hex2bcd[sec]);
//写入秒寄存器;
}
if(function_count==2)//function_count=2,则分加1操作;
{min++;
if(min>
=60)//分加到60,则被置0;
min=0;
write_byte(WRITE_MIN_ADD,hex2bcd[min]);
//写入分寄存器;
}
elseif(function_count==3)//function_count=3,则小时加1操作;
{hour++;
if(hour>
=24)//小时加到24,则被置0;
hour=0;
write_byte(WRITE_HOUR_ADD,hex2bcd[hour]);
//写入小时寄存器;
}
elseif(function_count==4)//function_count=4,则闹铃分钟加1操作;
{clk_min++;
if(clk_min>
=60)//分钟加满60自动置0;
clk_min=0;
elseif(function_count==5)//function_count=5,则闹铃小时加1操作;
{clk_hour++;
if(clk_hour>
=24)//小时加满24自动置0;
clk_hour=0;
elseif(function_count==6)//function_count=6,则年加1操作;
{year++;
if(year>
99)
year=0;
write_byte(WRITE_YEAR_ADD,hex2bcd[year]);
}}
elseif(function_count==7)//function_count=7,则月加1操作;
{month++;
if(month>
=13)
month=1;
write_byte(WRITE_MONTH_ADD,hex2bcd[month]);
elseif(function_count==8)//function_count=8,则日加1操作;
{date++;
if(date>
=31)
date=0;
write_byte(WRITE_DATE_ADD,hex2bcd[date]);
break;
caseDOWN:
//键盘减1操作功能
{if(function_count==1)
{if(sec==0)
sec=60;
--sec;
if(function_count==2)
{if(min==0)
min=60;
--min;
}
elseif(function_count==3)
{if(hour==0)
hour=24;
--hour;
elseif(function_count==4)
{if(clk_min==0)
clk_min=60;
--clk_min;
elseif(function_count==5)
{if(clk_hour==0)
clk_hour=24;
--clk_hour;
elseif(function_count==6)
{if(year==0)
year=100;
--year;
elseif(function_count==7)
{if(month==1)
month=13;
--month;
elseif(function_count==8)
{if(date==0)
date=31;
--date;
break;
caseALARM:
{alarm_flag=(~alarm_flag);
caseEnte_Snooze
{Time=true;
//确认键;
if((alarm_flag==true)&
(clk_hour==hour)&
(clk_min==min))//贪睡功能;
{clk_min=clk_min+5;
}}
default:
}}
v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 多功能 电子钟 程序 编程 参考