基于c语言单片机智能电子日历课程设计Word下载.docx
《基于c语言单片机智能电子日历课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于c语言单片机智能电子日历课程设计Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
![基于c语言单片机智能电子日历课程设计Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/25/89e026cb-bb39-4104-9116-4e1cb52ca3d9/89e026cb-bb39-4104-9116-4e1cb52ca3d91.gif)
验收答辩
课程设计成果
1.与设计内容对应的软件程序
2.课程设计总结报告
摘要
本设计是根据我们所学的单片机课程,按照大纲要求对我们进行的一次课程检验,是进行单片机课程训练的必要任务,也对我们掌握单片机应用有很大的帮助。
单片机技术作为电子专业的基础课程之一,对我们将来的工作以及生活和学习都有很密切的联系;
近年来随着电子技术和微机计算机的迅速发展,单片机的性能不断更新和提高,应用领域也不断扩大,已经在工业控制、尖端科技、智能仪器、汽车电子系统、办公自动化系统、通信产品等等领域有广泛的应用,成为现代电子系统中最重要的智能化核心器件。
关键词:
单片机,电子技术,智能化
目录
一、概述…………………………………………………………………………5
二、方案设计与论证………………………………………………………………5
1.单片机芯片选择……………………………………………………………5
2.时间计算模块……………………………………………………………5
3.显示模块………………………………………………………………………6
三、单元电路设计……………………………………………………………………6
1.单片机最小系统电路…………………………………………………………7
2.数码管电路………………………………………………………………8
3.按键电路………………………………………………………………9
四、程序设计………………………………………………………………………10
1.程序总体思路和分析………………………………………………………10
2.程序清单……………………………………………………………………11
五、结论与心得………………………………………………………………………19
六、参考文献……………………………………………………………………20
一、概述
本系统以STC89C52单片机为控制核心,通过单片机计时器模拟时间输出,并将时间通过数码管实时显示出来,通过相应的按键调整相应的数值和功能。
所以本设计可以分为以下几个模块:
显示模块、按键模块、定日输出模块。
下面对各个模块进行逐一分析。
二、方案设计与论证
时间计算模块有两种方式,一种利用现成的时间计时芯片实时读取时间,然后显示;
第二种是利用STC89C52单片机内部的定时/计数功能,实现时间的计算。
1.单片机芯片选择
方案一:
采用89C52作为硬件核心
采用FlashROM,内部具有4KBROM存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在先编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。
方案二:
采用AT89S52作为硬件核心
片内ROM全部采用FlashROM;
能以3V的超低压工作,同时也与MCS-51系列单片机完全该芯片内部存储器为8KBROM存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成一定的损坏。
所以选择采用AT89S52作为主控制系统。
2.时间计算模块
方案一:
DS1302芯片
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,才用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月、年,一个月小于31天时可以自动调整,且具有闰年补偿功能。
工作电压宽带2.5~5.5V。
采用双电源供电,可以设置备用电源充电方式,提供了对后备电源进行涓流充电的能力。
利用单片机的控制功能就可以实现实时计时的功能,而且消耗的系统资源少,程序简单。
单片机内部定时器/计数器
STC89C52单片机内部带有定时器/计数功能,此定时功能时通过对外部晶振的脉冲进行计数,从而达到计时功能,只要使用11.0592MHz的晶振就能实现零误差的计时,因此可以利用此功能实现计时。
从任务要求来看,CPU的系统消耗很少,有足够的内部资源利用定时器实现计时功能和处理其他算法。
任务要求不需要有掉电保护功能,这样可以减少工作量和系统成本。
3.显示模块
使用液晶显示屏显示时间数字
液晶显示屏(LCD)具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影响稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强的特点。
但由于液晶是以点阵的模式显示各种符号,需要利用控制芯片创建字符库,编程工作量大,控制器的资源占用较多,其成本也偏高。
在使用时,不能有静电干扰,否则易烧坏液晶的显示芯片,不易维护。
使用传统的LED数码管显示
数码管具有:
低能耗、低损耗、低压、寿命长、耐老化、防晒、防潮、防火、防高(低)温,对外界环境要求低,易于维护,同时其精度比较高,称重轻,精度可靠,操作简单。
数码管采用BCD编码显示数字,程序编译容易,资源占用较少。
根据以上的论述,采用方案二。
我们采用八段四位一体数码管动态显示,由于显示位数较多,故应使用显示驱动,在本设计中采用三极管来作为驱动。
4.按键模块
使用独立式键盘
独立式键盘是指直接用I/O口线构成的单个按键电路。
独立式按键电路配置灵活,软件结构简单。
使用矩阵式键盘
矩阵式键盘是由行线和列线组成,按键位于行、列交叉点上,行线、列线分别连接到按键开关的两端。
其特点是简单且不增加成本,这种键盘适合按键数目较多的场合。
根据以上的论述,所以采用方案二。
三、单元电路设计
1.单片机系统介绍
AT89S52是一种低功耗高性能CHMOS8位单片机,管脚如图所示。
片内含4KbytesISP的可反复擦写1000次Flash只读程序存储器,128bytes的随机存取数据存储器(RAM)。
其特点如下:
-兼容MCS-51指令系统;
-最大的工作频率为33MHz;
-具有双工UART串行通道;
-内部集成看门狗计时器,不需要再外接看门狗计时器单元电路;
-双数据指示器;
-支持ISP(在线更新程序)功能,其优势在于改写单片机存储器内的程序不需要把芯从工作环境中剥离;
-电源关闭标识;
-全新的加密算法,使程序的保密性大大加强;
-电压范围宽达4-5.5V,而89C52在低于4.8V或高于5.3V则无法工作;
-烧写寿命长,其标称为1000次,实际至少是1000-10000次,这样有利于初学者反复烧写,减低学习成本;
AT89S52是一种低功耗、高性能的CMOS8位单片机。
它带有8KFlash可编程和擦除的只读存储器(EPROM),该器件采用ATMEL的高密度非易失性存储器技术制造,与工业上标准的80C51和82C52的指令系统及引脚兼容,片内Flash集成在一个芯片上,可用与解决复杂的问题,且成本较低。
AT89S52提供了8K字节Flash,256字节RAM,32线I/O口,3个16位定时器/计数器,6向量两极中断,一个双工串行口,片内根据振荡器和始终电路等标准功能。
此外,AT89S52设有静态逻辑,并支持软件选择的两种节电运行方式、空闲方式使CPU停止工作,而允许RAM、定时器/计数器、串行口和中断系统继续工作。
掉电方式下,片内振荡器停止工作,由于之中被冻结,一切能都停止,只有片内RAM的内容被保存,直到硬件复位才恢复正常工作。
AT89S52结构框图:
1.数码管电路介绍
由于七段数码显示器在显示字形代码时需要有足够的功率,单片机口线的驱动能力明显不够,所以需在显示器前加显示驱动器,以提高其输出功率,满足显示器的需求。
在本设计中,我采用三极管作为显示电路的8路正向驱动器。
LED显示器俗称数码管,在其内部是由8个发光二极管加限流电阻组成,其连接方式有共阴和共阳两种,在共阴极接法中,因公共端接地,只要给某一段加高电平,该段就会亮。
而在本设计中采用的是共阳极接法,公共端接+5V电源,在某一段上加低电平,该段就会亮。
在本次设计中,为了使硬件电路更简单化,我采用四位一体的LED数码管,显示原理与单个LED的显示原理完全相同。
但在它的内部把四个数码管的段控端对应的连在了一起与单个的数码管相比其外部电路连接更加简单,故它只有8个段控端和4个位控端,4个位控端分别对四个数码管进行控制。
3.按键模块
在单片机控制电路中,可把单片机使用的键盘分为独立式和矩阵式两种。
独立式实际上就是一组独立的按键,这些按键可直接与单片机的I/O口连接,即每个按键独占一条口线,这种接法简单。
矩阵式键盘也称行列式键盘,因为键的数目较多,所以键按行列组成矩阵。
本设计中键盘数目较少,且为安装方便,因此在本设计中采用独立式接法。
如图所示。
控制电路
按从一个键到键的功能被执行主要应包括两项工作:
一是键的识别,即在键盘中找出被按的是哪个键,另一项是键功能的实现。
第一项工作是使用接口电路实现的,而第二项工作则是通过执行中断服务程序来完成。
四、程序总体思路和分析
1.程序总体思路和分析
主函数的流程图:
2.程序清单
#include<
reg52.h>
intrins.h>
unsignedinttime=0;
unsignedcharnum=0;
unsignedcharkey=0;
unsignedchartime_key=0;
/*********************************/
unsignedintyear=1;
//年
unsignedcharyue=1;
//月
unsignedcharday=1;
//日
unsignedcharweek=1;
unsignedcharLED=0;
unsignedcharflag_led=0;
unsignedcharstrl_led[]={0,0,0,0,0,0,0,0};
unsignedcharday_add;
unsignedcharSURE;
unsignedcharcodestr[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff
};
unsignedcharsu[]={
10,10,10,10,10,10,10,10
voiddelay_SMG(unsignedchart)
{
unsignedchard;
for(;
t>
0;
t--)
for(d=0;
d<
50;
d++);
}
/*************DIS_LED*************/
voidDIS_play()
unsignedchark;
unsignedchardis;
dis=0x01;
for(k=0;
k<
8;
k++)
{
P0=dis;
P2|=0xc0;
P2&
=0x1f;
if(k==2||k==4||k==6)P0=str[su[k]]&
0x7f;
elseP0=str[su[k]];
P2|=0xe0;
dis=dis<
<
1;
delay_SMG(4);
P0=0xff;
}
voidinit_all()
P0=0x00;
P2=0xa0;
P2=0x00;
P0=0xff;
P2=0x80;
P2=0xc0;
voidDIS_led()
if(LED==1)
P0=0xfe;
P2=0x80;
P2=0x00;
elseif(LED==2)
P0=0xfd;
elseif(LED==3)
P0=0xfb;
elseif(LED==4)
P0=0xf7;
elseif(LED==5)
P0=0xef;
elseif(LED==0)
//*******************************
voidIN_key()
unsignedcharhang,lei;
unsignedcharzong;
P3=0x0f;
if(P3!
=0x0f)
time_key++;
if(time_key==50)
{
if(P3!
{
hang=P3&
0x0f;
P3=0xf0;
lei=P3&
0xf0;
zong=hang|lei;
switch(zong)
{
case0x7e:
key=1;
//模式选择按键
flag_led++;
if(flag_led>
6)flag_led=0;
break;
case0xbe:
key=2;
if(flag_led==0)SURE=3;
if(flag_led!
=0)
{
SURE++;
//确定按键
if(SURE>
1)SURE=0;
}
break;
case0xde:
key=3;
0)//按下模式选择键
day_add++;
if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
{
if(day_add>
31)day_add=31;
}
if(yue==4||yue==6||yue==9||yue==11)
30)day_add=30;
if(yue==2)
if((year%4==0&
&
year%100!
=0)||(year%400==0))
{
if(day_add>
28)day_add=28;
}
else
if(day_add>
29)day_add=29;
}
case0xee:
key=4;
{
0)
day_add--;
}
}
}
elseif(time_key>
50)time_key=100;
}
elsetime_key=0;
voidmain()
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
init_all();
while
(1)
DIS_play();
DIS_led();
voidtime_1()interrupt1
time++;
if(time==2000)
time=0;
week++;
if(week==8)week=1;
day++;
if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
if(day==32)
day=1;
yue++;
if(yue==2)
if((year%4==0&
if(day==30)
day=1;
yue++;
else
if(day==29)
if(yue==4||yue==6||yue==9||yue==11)
if(day==31)
if(yue==13)
yue=1;
year++;
IN_key();
if(SURE==1)//按下确认键确认日期
if(flag_led>
strl_led[flag_led]=day_add;
flag_led=0;
SURE=0;
day_add=0;
if(strl_led[1]==day)
{
if(SURE==3)LED=0;
//按下关断键
elseLED=1;
elseif(strl_led[2]==day)
elseLED=2;
elseif(strl_led[3]==day)
elseLED=3;
elseif(strl_led[4]==day)
elseLED=4;
elseif(strl_led[5]==day)
elseLED=5;
elseif(strl_led[6]==day)
elseLED=6;
else
LED=0;
SURE=0;
if(LED!
=6)
su[1]=year/10%10;
su[2]=year%10;
su[3]=yue/10;
su[4]=yue%10;
su[5]=day/10;
su[6]=day%10;
su[7]=week%10;
elseif(LED==6){su[0]=su[1]=su[2]=su[3]=su[4]=su[5]=su[6]=su[7]=10;
五、结论与心得
随着放假日子的到来,我的课程设计终于完成了,课程设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。
通过这次课程设计使我明白了自己原来知识还比较欠缺。
自己要学习的东西还太多,以前老是觉得自己什么东西都会,什么东西都懂,有点眼高手低。
通过这次毕业设计,我们才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。
感谢我的老师黄老师,让我系统学习了有关单片机知识。
他严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;
他循循善诱的教导和不拘一格的思路给予我无尽的启迪。
从项目的开始到完成,廖老师都始终给予我细心的指导和不懈的支持。
一年以来,廖老师不仅在学业上给我以精心指导,同时还在思想、生活上给我以无微不至的关怀。
在此真诚的感谢廖老师,并致以诚挚的谢意和崇高的敬意。
在这次课程设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。
六、参考文献
[1]李光飞.单片机课程设计实例指导[M].北京:
北京航空航天大学出版社,