信息与通信AT89S52 DS1302 DS18B20多功能数字电子钟.docx
- 文档编号:17270425
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:57
- 大小:236.27KB
信息与通信AT89S52 DS1302 DS18B20多功能数字电子钟.docx
《信息与通信AT89S52 DS1302 DS18B20多功能数字电子钟.docx》由会员分享,可在线阅读,更多相关《信息与通信AT89S52 DS1302 DS18B20多功能数字电子钟.docx(57页珍藏版)》请在冰点文库上搜索。
信息与通信AT89S52DS1302DS18B20多功能数字电子钟
我的单片机课程设计:
AT89S52+DS1302+DS18B20多功能数字电子钟一2010-07-1617:
35:
55|分类:
单片机|标签:
|字号大
中
小订阅
实现功能:
1.显示年、月、日、时、分、秒、星期,闰年自动调整
2.可手动调整上述各项的值
3.实时显示当前温度
4.可设定两个闹铃,每个有独立开关,并可以设置只响闹一次还是每天都响闹
5.闹钟共有两首音乐可供选择
6.可闹铃音乐放完可自动止闹,也可中途按键手动止闹
7.贪睡功能,有开关,并可设置贪睡时间
8.背光控制,有开关,并可设置多少秒后自动关闭背光,也可以按键开背光,然后按照设置的时间后自动关闭
9.秒表功能
10.掉电模式,同时液晶关背光,节省能源
源代码第一部分:
#include
4756005972010.6.14再次修改
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
#defineLCD1602_DATAP0//1602液晶数据口
sbitLCD1602_RS=P1^0;
sbitLCD1602_RW=P1^1;
sbitLCD1602_EN=P1^2;//1602液晶使能控制
sbitDS1302_CLK=P3^0;//实时时钟时钟线引脚
sbitDS1302_IO=P3^1;//实时时钟数据线引脚
sbitDS1302_RST=P3^2;//实时时钟复位线引脚
sbitDQ=P2^3;//18B20接口
sbitBeepIO=P2^7;//蜂鸣器
sbitesc=P1^7;//取消播放音乐
sbitmode=P1^4;//模式键
sbitinc=P1^5;//增加键
sbitdec=P1^6;//减少键
sbitok=P1^7;//OK键
sbitlight=P2^0;//背光控制
sbitACC0=ACC^0;//累加器位定义
sbitACC7=ACC^7;
bitfirst_flag=1,//一级主界面显示标志
second_flag,//二级菜单显示标志
third_flag,//三级菜单显示标志
playmusic,//播放音乐的标志
light_flag1=1,//背光第一次计时标志
light_flag=1;//二三级界面开背光标志
ucharcount1,sec1,min1,hour1;//定时器2使用的变量停表用
ucharcount,sec,min;//定时器1使用的变量贪睡用
uchartemp;//温度暂存
//////以下为播放音乐的设置
#defineSYSTEM_OSC12000000
#defineSOUND_SPACE4/5
uintcodeFreTab[12]={262,277,294,311,330,349,369,392,415,440,466,494};//原始频率表
ucharcodeSignTab[7]={0,2,4,5,7,9,11};//1~7在频率表中的位置
ucharcodeLengthTab[7]={1,2,4,8,16,32,64};
ucharSound_Temp_TH0,Sound_Temp_TL0;//音符定时器初值暂存
ucharSound_Temp_TH1,Sound_Temp_TL1;//音长定时器初值暂存
bitstop;
charmenu_num;//菜单号
charnum;//按键加减调整暂存数
charposition1,position2,position3,position4,position5,position6,position7;//菜单1-7的光标位置标志
charcodemenu[][16]={"1.TimeSetting","2.AlarmSetting","3.AlarmMusic","4.Snooze",
"5.BackLight","6.StopWatch","7.LowPowerMode","8.Exit"};
charcodeon_off_flag[][4]={"OFF","ON"};
charcodealarm_times[][7]={"Once","Repeat"};
charcodeweek[][4]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
ucharcodeself_table[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//年0
0x1f,0x11,0x1f,0x11,0x1f,0x11,0x15,0x17,//月1
0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,//日2
0x01,0x0c,0x17,0x14,0x17,0x0c,0x01,0x00,//闹钟标志3
0x10,0x18,0x1c,0x1e,0x1f,0x1c,0x18,0x10,//三角形符号,第五个自定义字符4
0x1f,0x15,0x0a,0x04,0x0a,0x15,0x1f,0x00};//贪睡标志5
/***********************延时函数(单位ms)**************************/
voiddelay(uintz)
{
uintx;
uchary;
for(x=z;x>0;x--)
for(y=112;y>0;y--);
}
/***********************************************************
******************LCD1602驱动程序******************
************************************************************/
/***********************************************************
忙检测
************************************************************/
voidLCD1602_check_busy()
{
LCD1602_DATA=0xff;
LCD1602_RS=0;
LCD1602_RW=1;
LCD1602_EN=1;
while(LCD1602_DATA&0x80);
LCD1602_EN=0;
}
/**********************************************************
写指令
************************************************************/
voidLCD1602_write_cmd(ucharcmd)
{
LCD1602_check_busy();
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_DATA=cmd;
LCD1602_EN=1;
_nop_();
LCD1602_EN=0;
}
/***********************************************************
写数据
*************************************************************/
voidLCD1602_write_data(uchardat)
{
LCD1602_check_busy();
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_DATA=dat;
LCD1602_EN=1;
_nop_();
LCD1602_EN=0;
}
/***********************************************************
1602初始化
************************************************************/
voidLCD1602_init()
{
/****************写入自定义字符***************************/
uchari;
LCD1602_write_cmd(0x40);//CGRAM起始地址
for(i=0;i<48;i++)
LCD1602_write_data(self_table[i]);//写入6个自定义字符
/*********************************************************/
LCD1602_write_cmd(0x38);//8位数据,双列显示,5*7字形
LCD1602_write_cmd(0x0c);//开显示,关光标,光标不闪烁
LCD1602_write_cmd(0x01);//清屏
}
/************************************************************
设置显示坐标
************************************************************/
voidLCD1602_set_postion(ucharx,uchary)
{
if(!
y)
LCD1602_write_cmd(0x80+x);
elseif(y)
LCD1602_write_cmd(0xc0+x);
}
/************************************************************
指定位置写字符
*************************************************************/
voidLCD1602_write_char(ucharx,uchary,ucharchardata)
{
LCD1602_set_postion(x,y);
LCD1602_write_data(chardata);
}
/************************************************************
指定位置写字符串
*************************************************************/
voidLCD1602_write_string(ucharx,uchary,uchar*string)
{
LCD1602_set_postion(x,y);
while((*string)!
='\0')
{
LCD1602_write_data(*string);
string++;
}
}
/***********************************************************
******************DS1302驱动程序******************
************************************************************/
voidDS1302InputByte(unsignedchard)//实时时钟写入一字节(内部函数)
{
unsignedchari;
ACC=d;
for(i=8;i>0;i--)
{
DS1302_IO=ACC0;//相当于汇编中的RRC
DS1302_CLK=1;
DS1302_CLK=0;
ACC=ACC>>1;
}
}
unsignedcharDS1302OutputByte(void)//实时时钟读取一字节(内部函数)
{
unsignedchari;
for(i=8;i>0;i--)
{
ACC=ACC>>1;//相当于汇编中的RRC
ACC7=DS1302_IO;
DS1302_CLK=1;
DS1302_CLK=0;
}
return(ACC);
}
voidWrite1302(unsignedcharucAddr,unsignedcharucDa)//ucAddr:
DS1302地址,ucData:
要写的数据
{
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr);//地址,命令
DS1302InputByte(ucDa);//写1Byte数据
DS1302_CLK=1;
DS1302_RST=0;
}
unsignedcharRead1302(unsignedcharucAddr)//读取DS1302某地址的数据
{
unsignedcharucData;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr|0x01);//地址,命令
ucData=DS1302OutputByte();//读1Byte数据
DS1302_CLK=1;
DS1302_RST=0;
return(ucData);
}
voidDS1302_init()
{
if(Read1302(0xc1)!
=0xf0)
{
Write1302(0x8e,0x00);//允许写操作
Write1302(0xc0,0xf0);//写入初始化标志,系统上电后检测此标志,即此子函数只会在第一次初始化一次。
/******时间初始值******/
Write1302(0x8c,0x10);//年
Write1302(0x8a,0x03);//星期
Write1302(0x88,0x05);//月
Write1302(0x86,0x26);//日
Write1302(0x84,0x22);//时
Write1302(0x82,0x59);//分
Write1302(0x80,0x55);//秒
///////////////////
Write1302(0xd2,0);//歌曲选择初始
Write1302(0xd4,5);//贪睡初始延时时间5分钟
Write1302(0xd6,0);//贪睡初始值关闭
/******闹钟初始值******/
Write1302(0xc2,0);//十时
Write1302(0xc4,0);//时
Write1302(0xc6,0);//闹钟标志
Write1302(0xc8,0);//闹钟次数标志
////第二个闹钟
Write1302(0xca,0);//十时
Write1302(0xcc,0);//时
Write1302(0xce,0);//闹钟标志
Write1302(0xd0,0);//闹钟次数标志
////////////
Write1302(0xd8,0);//背光控制开关
Write1302(0xda,0x10);//背光延时时间
Write1302(0x90,0xa4);//涓流充电
//////////////////
Write1302(0x8e,0x80);//禁止写操作
}
}
/***********************************************************
******************DS18B20驱动程序******************
************************************************************/
voiddelay_18b20(unsignedinti)//延时函数
{
while(i--);
}
/***************************************************************************************/
//18b20初始化函数
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
delay_18b20(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay_18b20(80);//精确延时大于480us
DQ=1;//拉高总线
delay_18b20(10);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay_18b20(5);
}
//读一个字节
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18b20(5);
}
return(dat);
}
//写一个字节
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18b20(5);
DQ=1;
dat>>=1;
}
delay_18b20(5);
}
//读取温度
unsignedcharReadTemperature(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedchart=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay_18b20(200);
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
b<<=4;
b+=(a&0xf0)>>4;
t=b;
return(t);
}
/********************************************************************
************一级主界面显示函数***************
********************************************************************/
voidfirst_interface()
{
LCD1602_write_string(0,0,"20");
LCD1602_write_data(Read1302(0x8d)/16+0x30);//十年
LCD1602_write_data(Read1302(0x8d)%16+0x30);//年
LCD1602_write_data(0);//显示自定义字符“年”
LCD1602_write_data(Read1302(0x89)/16+0x30);//十月
LCD1602_write_data(Read1302(0x89)%16+0x30);//月
LCD1602_write_data
(1);//显示自定义字符“月”
LCD1602_write_data(Read1302(0x87)/16+0x30);//十日
LCD1602_write_data(Read1302(0x87)%16+0x30);//日
LCD1602_write_data
(2);//显示自定义字符“日”
if(Read1302(0xd7))
LCD1602_write_char(9,1,5);//显示自定义字符贪睡标志
elseLCD1602_write_char(9,1,'');
LCD1602_write_string(12,0,week[Read1302(0x8b)-1]);//显示星期
if(Read1302(0xc7)||Read1302(0xcf))
LCD1602_write_char(10,1,3);//显示自定义字符闹钟标志
elseLCD1602_write_char(10,1,'');
LCD1602_write_char(0,1,Read1302(0x85)/16+0x30);//十时
LCD1602_write_data(Read1302(0x85)%16+0x30);//时
LCD1602_write_data(':
');
LCD1602_write_char(3,1,Read1302(0x83)/16+0x30);//十分
LCD1602_write_data(Read1302(0x83)%16+0x30);//分
LCD1602_write_data(':
');
LCD1602_write_char(6,1,Read1302(0x81)/16+0x30);//十秒
LCD1602_write_data(Read1302(0x81)%16+0x30);//秒
temp=ReadTemperature();
LCD1602_write_char(12,1,temp/10+0x30);//温度显示
LCD1602_write_data(temp%10+0x30);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息与通信AT89S52 DS1302 DS18B20多功能数字电子钟 信息 通信 AT89S52 DS18B20 多功能 数字 电子钟