智能电子钟应用电子专业综合课程设计 精品Word文档下载推荐.docx
- 文档编号:18006004
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:90
- 大小:259.05KB
智能电子钟应用电子专业综合课程设计 精品Word文档下载推荐.docx
《智能电子钟应用电子专业综合课程设计 精品Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《智能电子钟应用电子专业综合课程设计 精品Word文档下载推荐.docx(90页珍藏版)》请在冰豆网上搜索。
完整C程序源代码
/**************************************************************************************
*主程序:
顶层程序*
*显示默认功能:
时间日期显示;
*
*调用子程序;
*
**
***************************************************************************************/
#include<
intrins.h>
#include"
zimo.h"
//字模程序;
nokia5110.h"
//5110驱动程序;
ds1302.h"
//ds1302驱动程序;
key.h"
//按键扫描程序;
printf.h"
//显示函数;
power.h"
//电源模块;
main.h"
//引脚定义;
delay.h"
//延时函数;
macroandconst.h"
//数据类型宏定义;
ADC.H"
//ADC电压测量
ds18b20.h"
//温度模块;
voidmain()
{
system_inint();
//系统初始化;
//Set_RTC();
while
(1)
{
checkclock();
caidan();
//菜单显示;
if(menue==0)
{
if(ok==1)
LCD_clear();
//清屏幕
while(menue==0)//由此进入时钟功能
ok=0;
logo();
Read_RTC();
//读取时钟;
data_change();
//时钟数据处理
tiaozheng_flag();
date_time();
//显示年月日时分秒;
week();
//星期处理;
set_date_time();
//设置改变时间和日期;
powervcc();
}
LCD_clear();
elseif(menue==1)//由此进入温度检测功能
{
while(menue==1)
temperatuercheck();
elseif(menue==2)//由此进入电压测量功能
while(menue==2)
power();
//电量检测
elseif(menue==3)//由此进入闹钟功能
while(menue==3)
clock();
else{LCD_clear();
}
voidextern0()interrupt0/*外部中断0中断函数定义;
*/
key();
*子程序:
底层程序*
*功能:
时间日期数据处理;
*
**
stc12c5a60s2.h"
sbitSCK=P0^2;
//DS1302时钟;
sbitSDA=P0^1;
//DS1302数据;
sbitRST=P0^0;
//DS1302复位;
ucharl_tmpDate[]={0,0,0,1,1,1,13};
//秒分时日月周年08-05-1512:
00:
00
ucharl_tmpdisplay[13];
codeucharWrite_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
//秒分时日月周年最低位读写位
codeucharRead_RTC_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
/******************************************************************/
/*写一个字节*/
voidWrite_Ds1302_Byte(unsignedchartemp)
{
unsignedchari;
for(i=0;
i<
8;
i++)//循环8次写入数据
SCK=0;
SDA=temp&
0x01;
//每次传输低字节
temp>
>
=1;
//右移一位
SCK=1;
}
/*写入DS1302*/
voidWrite_Ds1302(unsignedcharaddress,unsignedchardat)
RST=0;
_nop_();
SCK=0;
RST=1;
_nop_();
//启动
Write_Ds1302_Byte(address);
//发送地址
Write_Ds1302_Byte(dat);
//发送数据
//恢复
/*读出DS1302数据*/
unsignedcharRead_Ds1302(ucharaddress)
unsignedchari,temp=0x00;
for(i=0;
i++)//循环8次读取数据
{
if(SDA)
{
temp|=0x80;
}//每次传输低字节
temp>
SCK=1;
SCK=0;
}
//以下为DS1302复位的稳定时间
RST=0;
SDA=0;
SDA=1;
return(temp);
//返回
/*读时钟数据*/
voidRead_RTC(void)//读取日历
unsignedchari,*p;
p=Read_RTC_address;
//地址传递
for(i=0;
7;
i++)//分7次读取秒分时日月周年
l_tmpDate[i]=Read_Ds1302(*p);
p++;
/*设定时钟数据*/
voidSet_RTC(void)//设定日历
uchari,*p,tmp;
i++)
{//BCD处理
tmp=l_tmpDate[i]/10;
l_tmpDate[i]=l_tmpDate[i]%10;
l_tmpDate[i]=l_tmpDate[i]+tmp*16;
}
Write_Ds1302(0x8E,0X00);
//关闭写保护;
p=Write_rtc_address;
//传地址
for(i=0;
i++)//7次写入秒分时日月周年
{
Write_Ds1302(*p,l_tmpDate[i]);
p++;
Write_Ds1302(0x8E,0x80);
//打开写保护;
底层程序*
按键处理,键值显示;
eeprom.h"
ucharset=0;
//按键选择标志位;
charkey_flag=0;
//按键加减标志位;
ucharmenue=0;
//菜单选择标志位;
ucharok=0;
//确认标志位;
charmiao,fen,shi,ri,yue,zhou,nian;
/*时间日期数值标志位;
ucharclocktable[5];
//分,时,星期;
charhour=7;
charminute=30;
charweek2=1;
voidDelay10ms()//@11.0592MHz
unsignedchari,j;
i=108;
j=145;
do
while(--j);
}while(--i);
voidkey()
EA=0;
/*判断选择按键是否按下;
如果按下了当松开的时候让背光打开;
set++;
if(keyswitch==0)
{
Delay10ms();
if(keyswitch==0)
{
Delay10ms();
while(keyswitch==0);
LCD_BLA=1;
if(set>
8)set=0;
set++;
}
}
/*up和down按键的检测;
加减标志位*/
if(keyup==0)
{Delay10ms();
if(keyup==0)
{
LCD_BLA=1;
Delay10ms();
while(keyup==0);
key_flag++;
if(keydown==0)
if(keydown==0)
while(keydown==0);
key_flag--;
if(keymenue==0)
if(keymenue==0)//菜单选择标志位;
{
while(keymenue==0);
LCD_BLA=1;
menue++;
if(menue>
3)menue=0;
}if(keyok==0)
if(keyok==0)//确认标志位;
while(keyok==0);
ok++;
if(ok>
1)ok=0;
set=0;
LCD_BLA=0;
TR0=0;
if(set>
=2)TR0=0;
EA=1;
voidset_date_time()
if(set==2)
//while(keyup==0|keydown==0);
miao=l_tmpdisplay[10]*10+l_tmpdisplay[11];
miao=miao+key_flag;
if((key_flag<
0)&
(miao==0))miao=59;
if(miao>
59)miao=0;
miao=miao%10+(miao/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x80,miao);
Write_Ds1302(0x8E,0x80);
if(set==3)
{
//while(keyup==0||keydown==0);
fen=l_tmpdisplay[8]*10+l_tmpdisplay[9];
fen=fen+key_flag;
if(fen>
59)
fen=0;
if((key_flag<
&
(fen<
0))
fen=59;
fen=fen%10+(fen/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x82,fen);
if(set==4)
shi=l_tmpdisplay[6]*10+l_tmpdisplay[7];
shi=shi+key_flag;
if(shi>
23)shi=0;
(shi<
0))shi=23;
shi=shi%10+(shi/10)*16;
Write_Ds1302(0x84,shi);
if(set==5)
ri=l_tmpdisplay[4]*10+l_tmpdisplay[5];
ri=ri+key_flag;
if(ri>
31)ri=1;
(ri<
1))ri=31;
ri=ri%10+(ri/10)*16;
Write_Ds1302(0x86,ri);
if(set==6)
//while(keyup==0||keydown==0);
yue=l_tmpdisplay[2]*10+l_tmpdisplay[3];
yue=yue+key_flag;
if(yue>
12)yue=1;
(yue<
1))yue=12;
yue=yue%10+(yue/10)*16;
Write_Ds1302(0x88,yue);
if(set==7)
zhou=l_tmpdisplay[12];
zhou=zhou+key_flag;
if(zhou>
7)zhou=1;
(zhou<
1))zhou=7;
zhou=zhou%10+(zhou/10)*16;
Write_Ds1302(0x8A,zhou);
if(set==8)
nian=l_tmpdisplay[0]*10+l_tmpdisplay[1]+key_flag;
;
if(nian>
79)nian=0;
(nian<
0))nian=79;
nian=nian%10+(nian/10)*16;
Write_Ds1302(0x8C,nian);
key_flag=0;
voidcaidan()
ucharcounter;
ucharfunction;
/*光标显示位置控制*/
if(menue==0)
LCD_write_hanzi(0,4,10);
Delay1ms(120);
LCD_write_hanzi(0,0,3);
LCD_write_hanzi(0,2,10);
LCD_write_hanzi(4,0,10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能电子钟应用电子专业综合课程设计 精品 智能 电子钟 应用 电子 专业 综合 课程设计