万年历.docx
- 文档编号:7464178
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:12
- 大小:86.45KB
万年历.docx
《万年历.docx》由会员分享,可在线阅读,更多相关《万年历.docx(12页珍藏版)》请在冰豆网上搜索。
万年历
基于51单片机的电子万年历的课程设计
摘要
电子万年历是单片机系统的一个应用,由硬件和软件相配合使用。
硬件由主控器、时钟电路、温度检测电路、显示电路、键盘接口5个模块组成。
主控模块用AT89C51、时钟电路用时钟芯片DS1302、显示模块用LCD液晶显示器、温度检测采用DS18B20温度传感器、键盘接口电路用普通按键接上拉电阻完成。
软件利用C语言编程实现单片机程序控制。
单片机通过时钟芯片DS1302获取时间数据,DS18B20采集温度信号送该给单片机处理,单片机再把时间数据和温度数据送给74LS154译码,然后通过三极管C9015放大驱动LCD液晶显示器显示阳历年、月、日、时、秒、星期、温度。
关键词:
电子万年历、单片机、温度传感器、时钟、液晶显示
单片机课程设计说明
一、课程设计目的
1、单片机原理与应用课程设计为我们所学习的专业基础知识体系提供了一次综合实践及考察的机会。
希望通过这次课程设计,从看、听、做等多方面巩固我们课堂所学知识,提高动手能力,增强团队合作意识为以后的学习和工作积累经验。
2、通过应用单片机系统设计的基本理论,基本知识与基本技能,掌握单片机应用系统各主要环节的设计、调试方法,初步掌握并具备应用单片机进行设备技术改造和产品开发的能力,培养我们的创新意识,提高我们的动手能力和分析问题、解决问题的能力。
二、课程设计要求
(1)用数码管(或LCD)显示设备。
(2)万年历能显示阳历年、月、日、星期、小时、分、秒以及当前温度。
(3)可通过按键选择调整时间和温度。
1引言
电子万年历是一种应用非常广泛的日常计时工具,而且因为LCD液晶显示器的显示清晰直观、走时准确、可以进行夜视,并且还可以显示除了公历年、月日、时、分、秒、星期,除此之外还可以显示温度。
特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用。
为此我设计了一种功能全面、计时准确、成本低廉的基于51单片机的万年历。
2设计方案及原理
2.1控制部分的方案选择
主控芯片我选择时有三种方案:
(1)用ALTERA公司的FLEX10K系列PLD可编程逻辑器件,
(2)用凌阳16位单片机设计,(3)使用AT89C51单片机。
由于在成本以及显示上的差异,最重要的是我对51芯片相对比较熟悉,所以最终我选择了AT89C51芯片来实现控制部分的设计。
2.2测温部分的方案选择
测温部分由于传统的测温元件,热电偶和热电阻一般都是测电压,再转换成对应的温度,硬件电路复杂,软件调试也复杂,制作成本高。
所以我选择了美国DALLAS半导体公司推出的一种智能温度传感器DS18B20作为检测元件,它可以直接读出被测温度值,而且硬件电路相对简单,成本也低而且易使用。
2.3显示部分的方案选择
显示部分初次选择的是用8段数码管,但是它的操作比液晶显示略显繁琐,而且没有液晶显示器那么清晰直观,而且LCD还可以显示温度,所以我最后选择了LCD128*64液晶显示方案。
3系统硬件设计
电子万年历系统由主控制器AT89C51、时钟芯片DS1302、温度传感器DS18B20传感器、显示电路及键盘扫描电路组成(如图3.1)。
图3.1电子万年历系统构成框图
3.1主控器AT89C51
AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C51提供以下标准功能:
4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
3.2时钟电路DS1302
3.2.1.DS1302的性能特性
DS1302由Vcc1或Vcc2两者中的较大者供电,当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
I/O为串行数据输入输出端(双向),SCLK始终是输入端。
3.2.2DS1302的内部结构
DS1302由电源控制电路,实时时钟单元,振荡器与分频器单元,命令与控制逻辑单元,输入移位寄存器单元以及31*8个ARM单元构成(见图3.2)。
图3.2DS1302的内部结构图
3.3测温电路的设计
DS18B20的测温原理如图3.3所示。
图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1。
高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
减法计数器1对低温系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存的值将加1,减法计数器1的预置值将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值就是所测温度值。
图3.3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门未关闭就重复上述过程,直到温度寄存器值达到被测温度值。
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作必须按协议进行。
操作协议为:
初始化DS18B20(发复位脉冲)发ROM功能指令发存储器操作命令
处理数据。
图3.3DS18B20测温原理图
4系统软件的设计
4.1阳历程序设计
因为使用了时钟芯片DS1302,阳历程序只需从DS1302各寄存器中读出年、周、月、日、小时、分、秒等数据,再处理即可。
在首次对DS1302进行操作之前,
必须对它进行初始化,然后从DS1302中读出数据,再经过处理后,送给显示缓冲单元。
阳历程序流程图见图4.1所示。
图4.1阳历程序流程图
4.2温度程序设计
温度的主要功能是负责温度的实时显示,读出并处理DS18B20的测量温度值,温度测量每1s进行一次。
其程序流程图见图4.2。
图4.2DS18B20温度计主程序流程图
4.3源程序
具体源程序见附录1。
4.4仿真结果
具体仿真结果见附录2。
5总结
在设计的过程中我遇到了很多困难:
1.选题,因为所学的知识有限,根本不知道能用所学的知识做些什么,幸好董老师给我很大的帮助,是我将自己所学的知识有了更进一步的理解,最终决定用51单片机设计一个万年历。
2.对各种芯片的不了解,虽然选定了题目,可是所用到的芯片除了AT89C51外其他的都很陌生,后来在网上了解了他们的性能,作用以及各引脚功能,才对这次课程设计有了明确的认识,知道了自己所要实现什么功能,该如何实现。
3.电路图的绘制和硬件的连接可以说是困难重重,初次做万年历,而且是在对它的原理不是很了解的情况下,要做这么复杂的东西让我很迷茫,不过董老师很细心地指导我,使问题迎刃而解。
4.软件的编写以及调试和仿真是最难的,如此庞大的程序是我毫无头绪,问了好多学哥、学姐以及在网上查找很多资料了,然后在老师的指导下完成了这次课程设计。
总的来说这次设计制作比较成功,达到了预期的目的。
在这里我衷心地感谢董老师及学长的大力帮助。
由于这次设计时间紧张加之硬件设备缺乏,我的设计在很多方面还有缺陷,只愿以后有机会能完善。
6参考文献
[1]Proteus仿真社区..
[2]适用51系列单片机的一种万年历优化算法.维普资讯.
[3]李华.单片机原理及运用[M].兰州大学出版社.
[4]王秋爽.单片机开发基础与经典设计实例[M].机械工业出版社.
7附录
附录1源程序:
#include
#include
#include
#include
unsignedcharj[8];
sbitKEY1=P3^2;
sbitKEY2=P3^3;
sbitKEY3=P3^4;
sbitLED1=P3^5;
sbitLED2=P3^6;
sbitLED3=P3^7;
uchartime0_count;//time0计数器
voiddelay10(void)
{
unsignedchari,j;
for(i=0;i<255;i++)
for(j=0;j<200;j++);
}
unsignedcharconver(unsignedchara,unsignedcharb,unsignedcharc)
{
if((a&0x0f)==0x0a)a=a+6;
if(a==b)a=c;
returna;
}
main()
{
bitflag_2=1;
bitflag_3=1;
bitflag_4=1;
inti;
chara;
unsignedcharchoose=0x01;
InitLCD();//初始化LCD12864
for(i=0;i<9;i++)
{
ShowNumber(6,i*8+32,i+14);
}
Show32x32(0,0,0);
ShowChina(4,0,7);
ShowChina(4,16,8);
ShowChina(4,32,9);
ShowChina(4,48,10);
ShowNumber(4,64,10);//显示温度高位
read_serial(j);//读取DS1302的时间
ShowNumber(2,32,j[2]>>4&0x03);
ShowNumber(2,40,j[2]&0x0f);
ShowChina(2,48,3);
ShowNumber(2,64,j[1]>>4&0x07);
ShowNumber(2,72,j[1]&0x0f);
ShowChina(2,80,4);
ShowNumber(2,96,j[0]>>4&0x07);
ShowNumber(2,104,j[0]&0x0f);
ShowChina(2,112,5);
ShowNumber(0,32,j[6]>>4&0x0f);
ShowNumber(0,40,j[6]&0x0f);
ShowChina(0,48,0);
ShowNumber(0,64,j[4]>>4&0x01);
ShowNumber(0,72,j[4]&0x0f);
ShowChina(0,80,1);
ShowNumber(0,96,j[3]>>4&0x03);
ShowNumber(0,104,j[3]&0x0f);
ShowChina(0,112,2);
ShowChina(4,104,6);
ShowNumber(4,120,j[5]-1&0x07);
while
(1)
{
//send_char_com(0x31);
if(flag_2==1)
read_serial(j);//读取DS1302的时间
else
write_date_time(j);
a=Read_Temperature();//读取DS18B20的温度
if(a<0)//处理温度正负
{
a=(-1)*a;//取补
ShowNumber(4,72,11);//显示温度正负
}
else
{
ShowNumber(4,72,12);//显示温度正负
}
ShowNumber(4,80,a/100);//显示温度高位
ShowNumber(4,88,a/10%10);//显示温度中位
ShowNumber(4,96,a%10);//显示温度低位
LED3=1;LED2=0;LED1=1;
if(a>40){LED3=0;LED2=1;LED1=1;}
if(a<30){LED3=1;LED2=1;LED1=0;}
if(KEY1==0)//按键1--处理设定时间和返回
{
delay10();
if(KEY1==1)
{
delay10();
flag_2=~flag_2;
}
}
if(KEY2==0)//按键2--处理选择设定时间的项目
{
delay10();
if(KEY2==1)
{
delay10();
choose++;
if(choose==8)
choose=0x01;
}
}
if(KEY3==0)//按键3--处理设定时间和返回
{delay10();
if(KEY3==1)
{
delay10();
switch(choose)
{
case1:
j[6]++;j[6]=conver(j[6],0xa0,0x00);break;//年
case2:
j[5]++;j[5]=conver(j[5],0x07,0x00);break;//周
case3:
j[4]++;j[4]=conver(j[4],0x13,0x01);break;//月
case4:
j[3]++;j[3]=conver(j[3],0x32,0x01);break;//日
case5:
j[2]++;j[2]=conver(j[2],0x24,0x00);break;//时
case6:
j[1]++;j[1]=conver(j[1],0x60,0x00);break;//分
case7:
j[0]++;j[0]=conver(j[0],0x60,0x00);break;//秒
}
}
}
if(flag_2==1)
read_serial(j);//读取DS1302的时间
else
write_date_time(j);
ShowNumber(2,32,j[2]>>4&0x03);
ShowNumber(2,40,j[2]&0x0f);
ShowChina(2,48,3);
ShowNumber(2,64,j[1]>>4&0x07);
ShowNumber(2,72,j[1]&0x0f);
ShowChina(2,80,4);
ShowNumber(2,96,j[0]>>4&0x07);
ShowNumber(2,104,j[0]&0x0f);
ShowChina(2,112,5);
ShowNumber(0,32,j[6]>>4&0x0f);
ShowNumber(0,40,j[6]&0x0f);
ShowChina(0,48,0);
ShowNumber(0,64,j[4]>>4&0x01);
ShowNumber(0,72,j[4]&0x0f);
ShowChina(0,80,1);
ShowNumber(0,96,j[3]>>4&0x03);
ShowNumber(0,104,j[3]&0x0f);
ShowChina(0,112,2);
ShowChina(4,104,6);
ShowNumber(4,120,j[5]-1&0x07);
}
}
附录2仿真截图:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 万年历