点击链接获取Keil源码与Project Backups仿真图:
https://download.csdn.net/download/qq_64505944/87777668?spm=1001.2014.3001.5503
源码获取
主要内容:
本次设计所提出的一种基于单片机技术的万年历的方案,能更好的解决万年历显示的问题,随着数字生活的到来,单片机在生活中越来越重要,它能将大量的逻辑功能集成与一个集成电路中,使用起来十分方便。
基本要求:
1、万年历电路设计图;
2、万年历设计源程序;
3、keil运行源程序;
4、proteus中仿真;
5、运行结果分析。
主要参考资料:
[1] 谭浩强.C.程序设计.北京:清华大学出版社,2002
[2] 王为青,程国刚.单片机 Keil Cx51 应用技术开发,北京:人民邮电大学出版社,2007
[3] 马忠梅等.单片机的C语言应用程序设计.北京航空航天大学出版社,2003.
[4] 王晋凯.简简单单学通51单片机开发 [M].清华大学出版社,2014.
[5] 刘守义等.单片机技术基础[M].西安电子科技大学出版社,2007.
完 成 期 限:12 月 11 日 - 12 月 26 日
指导教师签名:
课程负责人签名:
摘 要
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新.在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。
万年历在人们的日常生活中是比较常见的电子产品之一.可是它还在发展之中,以后必将出现功能更多,显示更完全的万年历,基于这样的理念,本次设计是用AT89c51单片机、7SEG-MPX2-CC数码管显示器、控制按键为元件来设计的万年历。利用此设计熟悉单片机微控制器及汇编语言编程,对其片资源及各个I/0端口的功能和基本用途的了解。掌握应用程序开发环境,常用的7SEG-MPX2-CC数码管显示器的使用方法。
此设计是基于单片机技术的万年历的方案,本次设计所提出的一种基于单片机技术的简易计算器的方案,采用具有数据处理能力的中央处理器CPU,随机存储器ROM,多种I/0口和中断系统、定时器/计时器等功能集成到一块硅片上构成的一个小而完善的计算机系统-—单片机,配以汇编语言编写的执行程序,能更好的解决计算机计算的问题,随着数字生活的到来,单片机在生活中越来越重要,它能将大量的逻辑功能集成与一个集成电路中,使用起来十分方便。
关 键 词:AT89C51;单片机技术;万年历;7SEG-MPX2-CC数码管
目录
摘 要 1
目录 2
1 概述 3
1.1 设计思想 3
1.2 单片机概述 3
1.3 设计目的 4
1.4 设计要求 4
2系统总体方案 5
2.1 整体设计 5
2.2 温度模块设计 6
2.3 时钟程序设计 7
2.4 LCD显示程序 8
3 系统程序设计 9
3.1 系统电路图 9
3.2 程序源代码 9
4 系统仿真和调试 20
4.1 Keil uVision与Porteus仿真软件 20
4.1.1 Keil uVision 20
4.1.2 Porteus 20
4.2 测试结果图 21
4.3 测试结果分析 21
5 心得与体会 22
参考文献 23
1 概述
1.1 设计思想
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。
万年历在人们的日常生活中是比较常见的电子产品之一.可是它还在发展之中,以后必将出现功能更多,显示更完全的万年历,基于这样的理念,本次设计是用AT89c51单片机、7SEG-MPX2-CC数码管显示器、控制按键为元件来设计的万年历。利用此设计熟悉单片机微控制器及汇编语言编程,对其片资源及各个I/0端口的功能和基本用途的了解。掌握应用程序开发环境,常用的7SEG-MPX2-CC数码管显示器的使用方法。
此设计是基于单片机技术的万年历的方案,本次设计所提出的一种基于单片机技术的简易计算器的方案,采用具有数据处理能力的中央处理器CPU,随机存储器ROM,多种I/0口和中断系统、定时器/计时器等功能集成到一块硅片上构成的一个小而完善的计算机系统-—单片机,配以汇编语言编写的执行程序,能更好的解决计算机计算的问题,随着数字生活的到来,单片机在生活中越来越重要,它能将大量的逻辑功能集成与一个集成电路中,使用起来十分方便。
1.2 单片机概述
当今时代,是一个新技术层出不穷的时代。在电子领域,尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。过去习惯于传统电子领域的工程师、技术员正面临着全新的挑战,如不能在较短时间内学会单片机,势必会被时代所遗弃,只有勇敢地面对现实,挑战自我,加强学习,争取在较短的时间内将单片机技术融会贯通,才能跟上时代的步伐。
它所给人带来的方便也是不可否定的,它在一块芯片内集成了计算机的各种功能部件,构成一种单片式的微型计算机。20世纪80年代以来,国际上单片机的发展迅速,其产品之多令人目不暇接,单片机应用不断深入,新技术层出不穷。20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
1.3 设计目的
通过本次课程设计,运用《单片机微型计算机原理及应用》所学到的知识及查询相关资料,完成对万年历的设计,进一步提高单片机的系统设计和开发能力,达到理论知识与实践更好的结合,提高综合运用所学知识和设计能力的目的。
1.4 设计要求
本设计中由于要对时间、温度进行显示,所以选择液晶显示屏1602模块作为输出。1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。将L1602的RS端和P2.0,R/W端和P2.1, E 端和P2.2相连,当RS=0时,对LCD1602写入指令;当RS=1时,对LCD1602写入数据。当R/W端接高电平时芯片处于读数据状态,反之处于写数据状态,E端为使能信号端。当R/W为高电平,E端也为高电平,RS为低电平时,液晶显示屏显示需要显示的示数。
2系统总体方案
2.1 整体设计
根据功能和指标要求,本系统选用MCS-51系列单片机AT89C51为主控机。电子万年历设计题目的系统总流程图如图所示。流程图分析:首先系统初始化,系统开始运行,当有设置键按下时进入修改时间模式,无按键按下时读取时间、温度等数据送入液晶屏显示;在修改时间模式下设置时间完成后再送数据到液晶屏显示。
图2.1 总体方案流程图
2.2 温度模块设计
温度读取流程图如图8.2所示。流程图分析:开始进入初始化DS18B20,就是通过主机拉低单线产生复位脉冲然后释放该线,如果有应答脉冲,即发起ROM命令当成功的执行操作命令后,就使用Convert T命令即开始温度转换,当转换完后,又初始化DS18B20是否有应答脉冲,若有,就发起Read Scratchpad(读取暂存器和CRC字节)命令,同时读出第1,2个字节,即为温度的数据。
图2.2温度模块流程图
2.3 时钟程序设计
时钟流程图如图所示。流程图分析:DS1302开始计时时,首先进行初始化,当有中断信号时,读取时钟芯片的数据送入液晶屏显示。这时若有设置键按下时,进行时间修改,完成后将数据送入时钟芯片;若没有按键按下,则直接存入EPROM,送入液晶屏显示。
图2.3时钟模块流程图
2.4 LCD显示程序
显示程序流程图如图8.4。流程图分析:首先对1602显示屏进行初始化(初始化大约持续10ms左右),然后检查忙信号,若BF=0,则获得显示RAM的地址,写入相应的数据显示;若BF=1,则代表模块正在进行内部操作,不接受任何外部指令和数据,直到BF=0为止。
图2.4 LCD显示程序流程图
3 系统程序设计
3.1 系统电路图
图3.1 系统总电路图
3.2 程序源代码
#define uchar unsigned char
#define uint unsigned int
uchar mode=0; //屏幕状态变量
uchar temp=0; //是否调整时钟变量
uchar k=0; //键盘变量
uchar flag=0; //温度正负标志位
uint TU=350; //报警温度初始化25度
uint TD=150; //报警温度初始化15度
uchar WDTZ=0; //温度调整标志
uint T=0; //当前温度
//头函数
#include <reg51.h>
#include <intrins.h>
#include "Ds1302.h"//时钟函数调用
#include "key.h" //键盘函数调用
#include "Lcd.h" //屏幕函数调用
#include "DS18B20.h" //温度传感器函数调用
//蜂鸣器管脚定义
sbit Feng=P2^4;
sbit LEDG=P1^3;
sbit LEDR=P1^4;
/*------------------------------------------------
主函数
------------------------------------------------*/
void main()
{
rw=0;
Init_LCD(); //初始化显示
Ds1302_Init(); //时钟芯片初始化
{
mode++;
write_com(0x0d);//打开闪烁
write_com(0x80+0x40+7);//停留在秒闪烁
}
}
else if(k==2)//按下功能键或温度调整-
{
if(WDTZ==1)
{
//温度下限调整
if(TU==TD+10)
{
}
else
{
TU=TU-10;
}
Data_WD_TZ(TU);//显示报警温度
}
else if(WDTZ==2)
{
//温度下限调整
if(TD>10)
{
TD=TD-10;
}
else
{
TD=0;
}
Data_WD_TZ(TD);//显示报警温度
}
}
//进入时间调整循环
while(mode!=0)
{
temp=1; //调整时间
k=Key(); //是否有键按下
if(k==3) //功能键按下
{
mode++;
if(mode==7)
mode=0;
switch(mode)//光标闪烁
{
case 2:
{
write_com(0x80+0x40+4);//停留在秒闪烁
break;
}
case 3:
{
write_com(0x80+0x40+1);//停留在秒闪烁
break;
}
case 4:
{
write_com(0x80+0x03);//停留在秒闪烁
break;
}
case 5:
{
write_com(0x80+0x06);//停留在秒闪烁
break;
}
case 6:
{
write_com(0x80+0x09);//停留在秒闪烁
break;
}
}
k=0;
}
if(k==2) //时间++
{
switch(mode)
{
case 1://秒
{
time_buf1[6]++;
if(time_buf1[6]==60)
{
time_buf1[6]=0;
}
//显示
write_com(0x80+0x40+0x06);
write_date(0x30+time_buf1[6]/10);
write_date(0x30+time_buf1[6]%10);
write_com(0x80+0x40+0x07);//停留在秒闪烁
break;
}
case 2://分
{
time_buf1[5]++;
if(time_buf1[5]==60)
{
time_buf1[5]=0;
}
//显示
write_com(0x80+0x40+0x03);
write_date(0x30+time_buf1[5]/10);
write_date(0x30+time_buf1[5]%10);
write_com(0x80+0x40+0x04);//停留在秒闪烁
break;
}
case 3://时
{
time_buf1[4]++;
if(time_buf1[4]==24)
{
time_buf1[4]=0;
}
//显示
write_com(0x80+0x40+0x00);
write_date(0x30+time_buf1[4]/10);
write_date(0x30+time_buf1[4]%10);
write_com(0x80+0x40+0x01);//停留在秒闪烁
break;
}
case 4://年
{
time_buf1[1]++;
if(time_buf1[1]==100)
{
time_buf1[1]=0;
}
//显示
write_com(0x80+0x00);
write_date(0x30+time_buf1[0]/10);
write_date(0x30+time_buf1[0]%10);
write_date(0x30+time_buf1[1]/10);
write_date(0x30+time_buf1[1]%10);
//计算日期
time_buf1[7]=Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);
//显示日期
Data_XS(time_buf1[7]);
write_com(0x80+0x03);//停留在秒闪烁
break;
}
case 5://月
{
time_buf1[2]++;
if(time_buf1[2]==13)
{
time_buf1[2]=1;
}
//显示
write_com(0x80+0x05);
write_date(0x30+time_buf1[2]/10);
write_date(0x30+time_buf1[2]%10);
//计算日期
time_buf1[7]=Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);
//显示日期
Data_XS(time_buf1[7]);
write_com(0x80+0x06);//停留在秒闪烁
break;
}
case 6://日
{
time_buf1[3]++;
if(time_buf1[3]==32)
{
time_buf1[3]=1;
}
//显示
write_com(0x80+0x08);
write_date(0x30+time_buf1[3]/10);
write_date(0x30+time_buf1[3]%10);
//计算日期
time_buf1[7]=Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);
//显示日期
Data_XS(time_buf1[7]);
write_com(0x80+0x09);//停留在秒闪烁
break;
}
}
k=0;
}
if(k==1) //时间--
{
switch(mode)
{
case 1://秒
{
time_buf1[6]--;
if(time_buf1[6]==0xff)
{
time_buf1[6]=59;
}
//显示
write_com(0x80+0x40+0x06);
write_date(0x30+time_buf1[6]/10);
write_date(0x30+time_buf1[6]%10);
write_com(0x80+0x40+0x07);//停留在秒闪烁
break;
}
case 2://分
{
time_buf1[5]--;
if(time_buf1[5]==0xff)
{
time_buf1[5]=59;
}
//显示
write_com(0x80+0x40+0x03);
write_date(0x30+time_buf1[5]/10);
write_date(0x30+time_buf1[5]%10);
write_com(0x80+0x40+0x04);//停留在秒闪烁
break;
}
case 3://时
{
time_buf1[4]--;
if(time_buf1[4]==0xff)
{
time_buf1[4]=23;
}
//显示
write_com(0x80+0x40+0x00);
write_date(0x30+time_buf1[4]/10);
write_date(0x30+time_buf1[4]%10);
write_com(0x80+0x40+0x01);//停留在秒闪烁
break;
}
case 4://年
{
time_buf1[1]--;
if(time_buf1[1]==0xff)
{
time_buf1[1]=99;
}
//显示
write_com(0x80+0x00);
write_date(0x30+time_buf1[0]/10);
write_date(0x30+time_buf1[0]%10);
write_date(0x30+time_buf1[1]/10);
write_date(0x30+time_buf1[1]%10);
//计算日期
time_buf1[7]=Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);
//显示日期
Data_XS(time_buf1[7]);
write_com(0x80+0x03);//停留在秒闪烁
break;
}
case 5://月
{
time_buf1[2]--;
if(time_buf1[2]==0)
{
time_buf1[2]=12;
}
//显示
write_com(0x80+0x05);
write_date(0x30+time_buf1[2]/10);
write_date(0x30+time_buf1[2]%10);
//计算日期
time_buf1[7]=Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);
//显示日期
Data_XS(time_buf1[7]);
write_com(0x80+0x06);//停留在秒闪烁
break;
}
case 6://日
{
time_buf1[3]--;
if(time_buf1[3]==0)
{
time_buf1[3]=31;
}
//显示
write_com(0x80+0x08);
write_date(0x30+time_buf1[3]/10);
write_date(0x30+time_buf1[3]%10);
//计算日期
time_buf1[7]=Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);
//显示日期
Data_XS(time_buf1[7]);
write_com(0x80+0x09);//停留在秒闪烁
break;
}
}
k=0;
}
}
if(temp==1)//存入新时间
{
write_com(0x0c);//关闭闪烁
Ds1302_Write_Time();
temp=0;
}
}
}
4 系统仿真和调试
4.1 Keil uVision与Porteus仿真软件
4.1.1 Keil uVision
Keil uVision3是美国Keil Software 公司出品的51系列兼容单片机C语言软件开发系统,使用接近于传统c语言的语法来开发,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用﹐而且大大的提高了工作效率和项目开发周期,他还能嵌入汇编,您可以在关键的位置嵌入,使程序达到接近于汇编的工作效率。KEILC51标准℃编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效﹐快速的特点。C51编译器的功能不断增强,使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。
系统功能:
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全 Windows界面,使您能在很短的时间内就能学会使用keil c51来开发您的单片机应用程序。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到 KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
4.1.2 Porteus
Proteus 软件是英国Labcenter electronics 公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它 EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持 8051、HC11、PIC10/12/16/18/24/30/DsPIC33 、AVR、ARM、8086和MSP430“等,2010年即将增加Cortex 和 DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil 和MPLAB等多种编译器。
其功能特点:
(1)原理布图
(2)PCB自动或人工布线( 3)SPICE电路仿真
(2)pcb自动或人工布线(3)SPICE电路仿真
4.2 测试结果图
图4.1 程序运行图
4.3 测试结果分析
经过测试,本次设计的基于51单片机的万年历的功能基本实现成功,能够完成出时间、温度等功能的显示,但是,本次实验也有许多不足之处,还有很多地方需要改进,比如说,温度的显示有误差,可以对代码进行更精简的修整,从而使功能更加的强大,并且,可以运用于生活实际当中。
5 心得与体会
课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为电子信息工程专业的学生来说掌握单片机的开发技术是十分重要的。
我的题目是万年历,对于我们这些实践中的新手来说,这是一次考验。怎么才能找到课堂所学与实际应用的最佳结合点?怎样让自己的业余更接近专业?怎样让自己的计划更具有序性,而不会忙无一用?这都是我们所要考虑和努力的。经过查找资料,编写程序,加深了对单片机的了解与认识,通过本次试验,最大的收获就是仿真容易,而做实物却会遇到各种各样的困难。在电脑上仿真,只要程序写对,电器元件连接好就会得出结果。
本次实验,让我收获很多,感谢老师的答疑,也感谢同学的帮助,不仅加深了知识方面,更加锻炼了动手能力,相信以后遇到这方面问题不再会不知所措,让我把知识和实践结合到一起,通过这次实践,我了解自己的不足,C语言掌握的不够,方法的不足,使我更加了解以后该在哪个方面补充的自己的不足,总体来说本次课程设计是成功的,使我了解到更多课本上没有的知识,最后再次感谢所有帮助过我的老师和同学们。
参考文献
[1] 谭浩强.C.程序设计.北京:清华大学出版社,2002
[2] 王为青,程国刚.单片机 Keil Cx51 应用技术开发,北京:人民邮电大学出版社,2007
[3] 马忠梅等.单片机的C语言应用程序设计.北京航空航天大学出版社,2003.
[4] 王晋凯.简简单单学通51单片机开发 [M].清华大学出版社,2014.
[5] 刘守义等.单片机技术基础[M].西安电子科技大学出版社,2007.