单片机课程设计报告数字万历.docx
《单片机课程设计报告数字万历.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告数字万历.docx(51页珍藏版)》请在冰豆网上搜索。
![单片机课程设计报告数字万历.docx](https://file1.bdocx.com/fileroot1/2022-12/7/8631d24c-c520-4226-8bd1-d546c2f198cb/8631d24c-c520-4226-8bd1-d546c2f198cb1.gif)
单片机课程设计报告数字万历
单片机课程设计报告
数
字
万
年
历
学院:
电气与控制工程学院
班级:
自动化1005班
姓名:
摘要
单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。
单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。
将它嵌入到形形色色的应用系统中,就构成了众多产品、设备的智能化核心。
本设计就是应用单片机强大的控制功能制作而成的电子万年历,该电子万年历包括四大功能:
实时显示年、月、日、时、分、秒;实时监测环境温度;可根据需要启动高温报警;电子闹钟。
本设计采用的是STC89C52RC单片机,该单片机采用的MCU51内核,因此具有很好的兼容性,内部带有8KB的ROM,能够存储大量的程序,最突出特点是具有ISP在系统烧写功能,使得烧写程序更加方便。
计时芯片采用DALLAS公司的涓细充电时钟芯片DS1302,该芯片通过简单的串行通信与单片机进行通信,时钟/日历电路能够实时提供年、月、日、时分、秒信息,采用双电源供电,当外部电源掉电时能够利用后备电池准确计时。
温度检测采用DALLAS公司的数字化温度传感器,该芯片采用的是独特的“一线总线”的方式与单片机进行通信,一线总线独特而且经济的特点,是用户可以轻松的组建传感器网络,为测量系统的构建引入全新的概念。
实时温度采用一线总线的方式传输大大的提高了信号的抗干扰性,分辨率可通过软件设置,其小巧的体积为各种环境下测量温度提供了方便。
显示器件采用通用型1602液晶,可显示32个字符,如果使用数码管来做显示器件需消耗大量的系统资源,因此采用低功耗的1602液晶,该液晶显示方便,功能强大,完全能满足数字万年历的显示要求。
通过此次课程设计,我们的单片机的应用技术得到了加强,同时增强了我们的动手能力、硬件设计能力以及软件设计能力。
关键词:
单片机万年历温度计高温报警闹钟
一.作品简介
本作品以AT89S52单片机为控制核心,通过与DS1302和DS18B20通信获取实时时间和实时环境温度,并将得到的数据通过1602液晶显示,兼具高温报警和闹钟功能,同时通过四个按键来调整相应的数值。
二.器件选用
主器件:
STC89C52RC单片机、时钟芯片DS1302、温度传感器DS18B20、1602液晶。
系统介绍:
本系统以STC89C52RC单片机为控制核心,通过与DS1302和DS18B20通信获取实时时间和实时环境温度,并将得到的数据通过1602液晶显示出来,同时通过相应的按键调整相应的值。
因此本设计可分为一下模块:
显示模块、实时时间计算模块、实时环境温度采集模块、报警模块、设置模块(时间设置模块、最高温度设置模块、闹钟设置模块)。
STC89C52RC单片机,该单片机采用的MCU51内核,因此具有很好的兼容性,内部带有8KB的ROM,能够存储大量的程序,最突出特点是具有ISP在系统烧写功能,使得烧写程序更加方便。
时钟芯片DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。
实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。
DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需三根I/O线:
复位(RST)、I/O数据线、串行时钟(SCLK)。
时钟/RAM的读/写数据以一字节或多达31字节的字符组方式通信。
DS1302工作时功耗很低,保持数据和时钟信息时,功耗小于1mW。
温度传感器DS18B20该产品采用美国DALLAS公司生产的DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如“A”。
三.模块设计
⒈液晶显示模块
1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔,每行之间也有也有间隔,起到了字符间距和行间距的作用。
1602的驱动电路带有11条指令,可以很方便的控制液晶的现实效果如:
清屏、左移右移、光标显示。
而且1602显示的字符在下一条指令为到来之前不会改变,也就是能够维持显示的字符,1602液晶占用的系统资源也少。
因此采用1602可以达到很好的效果。
⒉实时时间计算模块
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。
利用单片机强大的控制功能就可实现实时计时的功能,而且消耗的系统资源少,程序简单。
虽然STC89C52单片机内部带有定时/计数功能,但是单片机通过对外部晶振的脉冲进行计数,他的单一的功能无法满足万年历的功能所以放弃单片机自带的定时计数功能,而采用DS1302进行时间的计数。
⒊实时环境温度采集模块
DS18B20是美国DALLAS公司生产的数字温度传感器,采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
测量温度范围宽,测量精度高,在使用中不需要任何外围元件,支持多点组网功能多个DS18B20可以并联在惟一的单线上,实现多点测温,供电方式灵活DS18B20可以通过内部寄生电路从数据线上获取电源。
因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。
因此非常适合本系统使用。
尽管热敏电阻也可以采用,但是作为万年历的高精度测量,热敏电阻的精度是无法达到的。
所以最终还是采用DS18B20来实现温度的感应。
⒋报警模块
此模块采用蜂鸣器来实现高温报警,闹铃。
总体模块设计
四.系统软件设计
判断是否有按键按下
时间、日期、上限温度、闹钟设置模块
没有按键按下
五.电路图设计
六.制作过程
万年历的制作总的来说是由两部分组成的一部分是硬件系统,一部分是软件系统。
硬件部分无外乎器件的选择,焊接,调试等,软件部分就是电路图的绘制,程序的编写,仿真的实现等。
在确定了题目之后,我们都积极寻找资料,经过充分的探讨,我们决定采用一个液晶显示器显示年、月、日、时、分、秒和温度,在一个显示中集成显示,并将各个不同的功能采用不同的器件来实现,比如说采用DS18B20来实现温度的采取和传输,采用DS1302来实现年、月、日、时、分、秒和温度的控制。
在确定好方案后,开始着手绘制电路图。
绘制电路图采用了protues这集绘图与仿真于一体的工具,很快就初步绘制出电路图。
另一方面,我们通过硬件电路着手程序编制的编制。
在编程过程中,我们查阅了大量的资料及网站,并对硬件电路进行修改,以利于编程。
在这些工作做完之后,我们进行了仿真的工作,显示一切正常。
由此,电路和程序都确定下来了。
接下来就是统计并采购元件、焊接电路并调试的工作。
通过一系列的改进,我们最终完成了我们的设计。
七.仿真实现
⒈欢迎界面
2.显示时间
⒊显示当前温度
⒌温度控制报警设置
6、闹钟响铃:
7:
秒变显示
八、设计及制作心得
设计心得体会
史冲
为期两周的单片机课程设计眼看着就要结束了,我们组做的是万年历,在整个过程中我学到了很多东西,也遇到了很多意想不到的问题。
在设计中,我深深地体会到了团队协作的重要性。
我负责的是元器件的统计、报告的撰写、协助程序编写以及布局焊接。
在这期间,由于我涉及的东西比较多,所以我和我的队友不止一次不止一次为了某些问题而争论不休,我想真论是必须的,否则,我们怎么会进步?
我们又如何拿出我们的作品?
这次的课程设计,让我提高了实践动手能力,提高了我发现问题,解决问题的能力,也加深了我对单片工作原理及一些相应器件功能和原理的理解。
这次实习让我受益匪浅,无论从知识上还是其他的各个方面。
上课的时候的学习从来没有见过真正的单片机,只是从理论的角度去理解枯燥乏味。
但在实习中见过甚至使用了单片机及其系统,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。
在这次课程设计中又让我体会到了合作与团结的力量,当遇到不会或是设计不出来的地方,我们就会在QQ群里讨论或者是同学之间相互帮助。
团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有更多的理念、更多的思维、更多的情感。
设计心得体会
廖翔
首先,在这次结伴而组织的比赛中让我切实明白了团结的力量。
从刚开始的什么都没有信心,没有想法,没有目的到最后成功完成作品,这期间少不了我们团队之间的商量、探讨和协作,从开始的想法层不出穷,到后来的切实落实,这期间层有过激烈的探讨,但最终拿定主意后,才能明白原来的想法和现实之间总还隔着一条沟壑。
诸如时间能力之类的东西。
后期的合作还算愉快,布置电路、焊板子时大家那专注的眼神,默契的配合都是成功拿出作品的必要条件。
其次,明白了详细的计划与策划的重要性。
我负责的是焊接的工作。
在组长把布局图设计好之后,我就负责把它焊好。
不过,人总是在摸索中前进的,通过这次的实践训练让我意识到人的潜力是巨大的,只要不断的挖掘总会有的。
另外,我还学会了新的焊接技巧,学会了一些布局规律。
最重要的是,我深刻地体会到了严谨思维与计划的重要性。
当然,这只是我的一点心得,相信在未来的学习和摸索中还有着更多的知识宝藏等着我去发掘。
最后,像杨老师说的,学校给我们提供了很多的机会去学习和实践,我们必须把握机会,不要等到毕业时候抱怨没有学到东西,说学校不行之类的话。
学校已经给我们提供了这样良好的条件,如果我们不珍惜的话,只能是自己的损失。
设计心得体会
罗军峰
通过本次课程设计,使我加深了对单片机的认识,并且熟悉了单片机系统的设计流程,收获丰硕。
功能上基本达标:
时钟的显示,调时功能,闹钟功能,温度显示,高温报警功能,精确度完全可以满足日常生活显示时间的需要;调时功能,方便快捷。
硬件设施基本合乎要求,软件设计可以配合硬件实现其功能。
感谢学院给我们提供了一个自己动手的平台,给我们一次难得煅炼的机会,使得我们的动手能力和专业技能都有了很大的提高。
在做作品的日子里我们团结协作共同研究,认真查资料,遇到问题,请教老师同学,同学也很耐心,在此向他们致以诚挚的谢意。
感谢提供相关技术帮助的老师和同学,在完成作品的过程中我们收获很多,充分锻炼了自己的动手能力,和团队协作能力。
技术在不断进步,电子时代已经到来。
做为新时代的我们,更应该提高自身能力,适应新时代的发展。
知识来自实践,多从生活中探寻所需要的。
互联网成了我们生活中不可或缺的一部分,网络在本次设计中起到了很大作用,很多芯片资料,传统的纸质图书里是没有的。
网络只是一个平台,正是由于大家的无私奉献,才使得它丰富多彩。
从这次的课程设计中,我真正的体会到,知识的重要性,特别是要理论联系实际,把我们所学的理论知识运用到实际生活当中,要学会用知识改变我们实际的生产生活。
九、附录
1、原件清单
名称
数量
属性
DS1302
1
CRYSTAL/晶振
32768HZ
SPEAKER/蜂鸣器
1
DS18B20
1
LM016L/显示器
1
RESPACK-8
1
1K
排线
5*8=40
排针
5*8=40
电阻
4*3=12
2K,100欧姆,10K,1K
红色发光二级管
2~4
NPN三极管(8050)
1
自锁开关
1
PCB版
容纳三节五号电池的电池夹
1
BUTTON(复位开关)
4
2、程序代码:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcdrs=P2^0;
sbitlcden=P2^1;
sbitDATA=P2^6;//时钟数据接口
sbitRST=P2^7;
sbitSCLK=P2^5;
sbitDQ=P2^2;//ds18b20与单片机连接口
sbitgneng=P1^4;
sbitmenu=P1^5;//菜单
sbitadd=P1^6;//加一
sbitdec=P1^7;
sbitbeep=P2^3;//减一
uchardatadisdata[5];
uchardataalarmdata[2];
uchardatatempdata[5];
uchardataaflag[1];
ucharcodedisplaywelcome[]={"Welcome!
^_^"};//欢迎界面
ucharcodedisplaywish[]={"HappyEveryDay"};
ucharcodetable2[]="THUFRISATSUNMONTUEWES";
ucharcodetable[]={"20--"};
ucharcodetable1[]={":
:
."};
ucharcodealarm[]="ALARMTIME:
";
ucharcodealarm1[]="00:
00";
ucharcodemiaobiao[]="MIAOBIAO";
ucharcodemiaobiao1[]="00:
00:
00";
ucharsecond,minute,hour,day,month,year,week,count=0;
ucharReadValue,num,time;
uinttvalue;//温度值
uchartflag,mflag=1;
ucharmiao,shi,fen;
ucharmfen,mmiao,pmiao;
chartbai,tshi,tge,txiao,ashi,afen;
voiddelay(uintx)
{
uinti,j;
for(i=x;i>0;i--)
for(j=125;j>0;j--);
}
voiddelay1(uintz)
{
for(;z>0;z--);
}
//蜂鸣器子程序
voiddi()
{
beep=0;
//delay(10);
//beep=1;
}
//1602写指令
voidwrite_com(ucharcom)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//1602写数据
voidwrite_data(uchardate)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//1602初始化
voidinit()
{
ucharnum;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
delay(5);
write_com(0x80+3);
for(num=0;num<12;num++)
{
write_data(displaywelcome[num]);
delay(5);
}
write_com(0x80+0x41);
for(num=0;num<15;num++)
{
write_data(displaywish[num]);
delay(5);
}
}
//1602指定地址写数据
voidwrite_com_data(ucharx,uchary)
{
write_com(x);
write_data(y);
delay(5);
}
voidmiaobiaojishi()
{
if(mflag==0)
{
//delay
(1);
pmiao++;
if(pmiao==100)
{
pmiao=0;
mmiao++;
if(mmiao==60)
{mmiao=0;
mfen++;
if(mfen==100)
mfen=0;
}
}
}
}
voidmkeyscan()
{
if(menu==0)
{
delay(3);
if(menu==0)
{while(!
menu);
mfen=0;
mmiao=0;
pmiao=0;
}
}
if(add==0)
{
delay(3);
if(add==0)
{while(!
add);
mflag=1;
}
}
if(dec==0)
{
delay(3);
if(dec==0)
{while(!
dec);
mflag=0;
}
}
}
//闹钟初始化
voidainit()
{
ucharnum;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
delay(5);
write_com(0x80+2);
for(num=0;num<11;num++)
{
write_data(alarm[num]);
delay(5);
}
write_com(0x80+0x42);
for(num=0;num<7;num++)
{
write_data(alarm1[num]);
delay(5);
}
//write_com(0x01);//清屏指令
}
voidDisplayON()
{
write_com(0x80+0x4c);
write_data('O');
write_data('N');
write_data('');
}
voidDisplayOFF()
{
write_com(0x80+0x4c);
write_data('O');
write_data('F');
write_data('F');
}
//1302写字节
voidWrite1302(uchardat)
{
uchari;
SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备
delay1
(2);//稍微等待,使硬件做好准备
for(i=0;i<8;i++)//连续写8个二进制位数据
{
DATA=dat&0x01;//取出dat的第0位数据写入1302
delay
(2);//稍微等待,使硬件做好准备
SCLK=1;//上升沿写入数据
delay1
(2);//稍微等待,使硬件做好准备
SCLK=0;//重新拉低SCLK,形成脉冲
dat>>=1;//将dat的各数据位右移1位,准备写入下一个数据位
}
}
//1302向指定地址写数据
voidWriteSet1302(ucharCmd,uchardat)
{
RST=0;//禁止数据传递
SCLK=0;//确保写数居前SCLK被拉低
RST=1;//启动数据传输
delay1
(2);//稍微等待,使硬件做好准备
Write1302(Cmd);//写入命令字
Write1302(dat);//写数据
SCLK=1;//将时钟电平置于已知状态
RST=0;//禁止数据传递
}
//1302读字节
ucharRead1302(void)
{
uchari,dat;
delay
(2);//稍微等待,使硬件做好准备
for(i=0;i<8;i++)//连续读8个二进制位数据
{
dat>>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1)//如果读出的数据是1
dat|=0x80;//将1取出,写在dat的最高位
SCLK=1;//将SCLK置于高电平,为下降沿读出
delay1
(2);//稍微等待
SCLK=0;//拉低SCLK,形成脉冲下降沿
delay1
(2);//稍微等待
}
returndat;//将读出的数据返回
}
//1302从指定地址读数据
ucharReadSet1302(ucharCmd)
{
uchardat;
RST=0;//拉低RST
SCLK=0;//确保写数居前SCLK被拉低
RST=1;//启动数据传输
Write1302(Cmd);//写入命令字
dat=Read1302();//读出数据
SCLK=1;//将时钟电平置于已知状态
RST=0;//禁止数据传递
returndat;//将读出的数据返回
}
//1302初始化
voidInit_DS1302(void)
{
WriteSet1302(0x8E,0x00);//根据写状态寄存器命令字,写入不保护指令
WriteSet1302(0x80,((0/10)<<4|(0%10)));//根据写秒寄存器命令字,写入秒的初始值
WriteSet1302(0x82,((45/10)<<4|(45%10)));//根据写分寄存器命令字,写入分的初始值
WriteSet1302(0x84,((15/10)<<4|(15%10)));//根据写小时寄存器命令字,写入小时的初始值
WriteSet1302(0x86,((29/10)<<4|(29%10)));//根据写日寄存器命令字,写入日的初