实验八.docx
- 文档编号:24865290
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:11
- 大小:173.48KB
实验八.docx
《实验八.docx》由会员分享,可在线阅读,更多相关《实验八.docx(11页珍藏版)》请在冰豆网上搜索。
实验八
实验项目八基于AT89C51的简单电子万年历
1.实验目的
⑴了解电子万年历的基本工作原理与使用方法;
⑵掌握AT89C51设计电子万年历的基本方法。
2.实验内容
基本部分:
利用AT89C51和7段LED数码管设计一个简单的电子万年历,能显示时间、星期、年、月、日,并能进行设置;
提高部分:
将电子万年历增加一个闹钟功能;
当设定的闹钟时间到时,让单片机演奏一段音乐。
3.实验电路框图
4.实验任务分析
⑴硬件电路说明
DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信,实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息。
DS1302与单片机之间采用同步串行的方式进行通信仅需要用到三个口线
(1)RES(复位),
(2)I/O(数据线),(3)SCLK(串行时钟).
⑵软件设计说明
构建数组ucharsettime[7]={0x50,0x59,0x09,0x28,0x09,0x07,0x08}来设置秒、分、时、日、日期、月、年;设计函数DS1302_Get1302(gettime)
获得当前时间;设计函数Disp_time(gettime)显示当前时间。
实验流程框图
6.实验过程记录
⑴实验过程
⑵问题及解决方法
怎样将16进制转换成10进制?
用voidBCD_ASCII(ucharBCD,ucharptasc[])
{
intdec;
dec=(BCD&15)+((BCD>>4)*10);
ptasc[0]=dec/10;
ptasc[1]=dec%10;
}函数将BCD码转换成ascii码。
7.实验总结
⑴掌握了DS1302的原理与工作方法。
8.成绩评定
/**********预处理部分**********/
#include
#defineucharunsignedchar
#defineuintunsignedint
/**********变量定义部分**********/
sbitT_CLK=P2^1;//实时时钟时钟线引脚
sbitT_IO=P2^0;//实时时钟时钟数据线引脚
sbitT_RST=P2^5;//实时时钟时钟复位线引脚
unsignedtable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/**********子函数部分**********/
voiddelay(uinti)
{
for(;i<248;i++);
}
voidtime1()
{
unsignedchark,l;
unsignedintn;
for(k=0;k<10;k++)
for(l=0;l<10;l++)
for(n=0;n<2;n++);
}
voidDS1302_InputByte(ucharucDa)//往DS1302写入1Byte数据
{
uchari;
uchartemp;
temp=ucDa;
for(i=8;i>0;i--)
{
T_IO=temp&0x01;
T_CLK=1;
T_CLK=0;
temp=temp>>1;
}
}
ucharDS1302_OutputByte(void)//从DS1302读取1Byte数据
{
uchari;
uchartemp;
temp=0;
for(i=0;i<8;i++)
{
T_CLK=0;
if(T_IO!
=0)temp|=(1<
T_CLK=1;
}
return(temp);
}
voidDS1302_W1302(ucharucAddr,ucharucDa)//往DS1302写入数据
{
T_RST=0;
T_CLK=0;
T_RST=1;
DS1302_InputByte(ucAddr);
DS1302_InputByte(ucDa);
T_CLK=1;
T_RST=0;
}
ucharDS1302_R1302(ucharucAddr)//读取DS1302某地址的数据
{
ucharucDa;
T_RST=0;
T_CLK=0;
T_RST=1;
DS1302_InputByte(ucAddr);
ucDa=DS1302_OutputByte();
T_CLK=1;
T_RST=0;
return(ucDa);
}
voidDS1302_BurstW1302T(uchar*pSecDa)//往DS1302写入时钟数据
{
uchari;
DS1302_W1302(0x8e,0x00);
T_RST=0;
T_CLK=0;
T_RST=1;
DS1302_InputByte(0xbe);
for(i=8;i>0;i--)
{
DS1302_InputByte(*pSecDa);
pSecDa++;
}
T_CLK=1;
T_RST=0;
}
voidDS1302_BurstR1302T(uchar*pSecDa)//读取DS1302时钟数据
{
uchari;
T_RST=1;
T_CLK=0;
T_RST=1;
DS1302_InputByte(0xbf);
for(i=8;i>0;i--)
{
*pSecDa=DS1302_OutputByte();
pSecDa++;
}
T_CLK=1;
T_RST=0;
}
voidDS1302_Set1302(uchar*pSecDa)//设置初始时间
{
uchari;
ucharucAddr=0x80;
DS1302_W1302(0x8e,0x00);
for(i=7;i>0;i--)
{
DS1302_W1302(ucAddr,*pSecDa);
pSecDa++;
ucAddr+=2;
}
DS1302_W1302(0x8e,0x80);
}
voidDS1302_Get1302(ucharucCurtime[])////读取DS1302当前时间
{
uchari;
ucharucAddr=0x81;
for(i=0;i<7;i++)
{
ucCurtime[i]=DS1302_R1302(ucAddr);
ucAddr+=2;
}
}
voidBCD_ASCII(ucharBCD,ucharptasc[])//将压缩的BCD码转换成asscii码
{
intdec;
dec=(BCD&15)+((BCD>>4)*10);
ptasc[0]=dec/10;
ptasc[1]=dec%10;
}
voidDisp_time(uchartime[])//在LED上显示当前时间
{
uchari,asc[2];
BCD_ASCII(time[0],asc);//
P0=0XFF;P0=table[asc[0]];P3=0x40;time1();
P0=0XFF;P0=table[asc[1]];P3=0x80;time1();
BCD_ASCII(time[1],asc);
P0=0XFF;P0=table[asc[0]];P3=0x10;time1();
P0=0XFF;P0=table[asc[1]];P3=0x20;time1();
BCD_ASCII(time[2],asc);
P0=0XFF;P0=table[asc[0]];P3=0x04;time1();
P0=0XFF;P0=table[asc[1]];P3=0x08;time1();
BCD_ASCII(time[5],asc);
P0=0XFF;P0=table[asc[0]];P3=0x01;time1();
P0=0XFF;P0=table[asc[1]];P3=0x02;time1();P0=0XFF;
BCD_ASCII(time[3],asc);
P1=0XFF;P1=table[asc[0]];P3=0x40;time1();
P1=0XFF;P1=table[asc[1]];P3=0x80;time1();
BCD_ASCII(time[4],asc);
P1=0XFF;P1=table[asc[0]];P3=0x10;time1();
P1=0XFF;P1=table[asc[1]];P3=0x20;time1();
BCD_ASCII(time[6],asc);
P1=0XFF;P1=table[asc[0]];P3=0x04;time1();
P1=0XFF;P1=table[asc[1]];P3=0x08;time1();
P1=0XFF;P1=table[2];P3=0x01;time1();
P1=0XFF;P1=table[0];P3=0x02;time1();P1=0XFF;
}
/**********主函数部分**********/
voidmain(void)//1、在LED上显示当前时间2、可以设置时间
{
ucharsettime[7]={0x50,0x59,0x09,0x30,0x05,0x03,0x12};//设置的秒,分,时,日,月,星期,年
uchargettime[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//保存当前时间的数组
DS1302_W1302(0x80,0x00);//启动震荡器
DS1302_Set1302(settime);//设置初始时间
while
(1)//以下程序完成显示和设置时间
{
DS1302_Get1302(gettime);//获得当前时间
delay(100);
Disp_time(gettime);//显示当前时间
}
}
/**********中断函数部分**********/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验