基于89c51单片机课程设计.docx
《基于89c51单片机课程设计.docx》由会员分享,可在线阅读,更多相关《基于89c51单片机课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
基于89c51单片机课程设计
摘要:
随着时代的进步,越来越多的电子厂品趋向于低成本,高性能,耐用性好的方向发展。
特别是趋向于自动化控制的方向走。
89c51作为控制芯片是最好不过的选择啦。
它具有强大的功能,并且简单易于操作,安全性与稳定性较高,价格便宜,适合中小型电子厂品开发中的控制器。
就像我们的课程设计,基于89c51单片机的电子时钟的课程设计。
这款课程设计用到的主要材料有89c51单片机,1602液晶显示屏,矩阵键盘,以及一些电容电阻元件等等。
使用89c51作为电子时钟的控制器很简单,就是由于其经济型与稳定性和易操作性。
显示电路上,就在使用7段数码管和1602液晶显示屏上纠结了一阵子。
7段数码管的好处在于他更适用于室外环境,但由于其操作复杂等等其他外在原因,最终还是选择了使用1602做显示电路。
1602不仅操作上臂数码管简单许多,而且使用1602能在很大程度上是电路图尽量简化,便于操作与错误的检修。
并且1602价格也比较便宜。
基于89c51电子时钟的设计,利用了单片机内部的一个自带定时/计数器来实现定时功能,并通过内部程序,实现对时分秒,年月日这几个输出数值的自增,并且通过编写程序,实现通过键盘控制时分秒,年月日大小的调整,这是必要的功能。
最后通过1602液晶显示电路将时间显示在其上。
这样的电子时钟比较精准,其主要误差来源与晶振的误差,即使是这样,他的误差也只是微妙级别,对于日常生活中的时间计数是足够的啦。
关键词:
89c51单片机1602液晶显示屏矩阵键盘keil软件
目录
1、课程设计任务书与评阅表……………………………………3
2、前言……………………………………………………………6
2、概述……………………………………………………………6
2.1基于89C51电子时钟设计目的………………………7
2.2课程设计的组成部分…………………………………
3、电子时钟设计的内容…………………………………………9
3.1液晶1602显示电路设计………………………………93.2单片机晶振电路与复位电路设计……………………
3.3键盘调试电路的设计…………………………………
3.4总体电路设计…………………………………………1
3.5单片机程序的编写……………………………………1
4、总结……………………………………………………………23
4.1遇到的问题与解决办法……………………………
4.2体会与收获……………………………………………
5、附录:
参考资料
1、前言
单片机是什么?
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
单片机作为应用最广泛的控制系统之一,具有体积小,易于控制,价格便宜,安全可靠等等优良的性能而被广泛的关注。
无论是小到儿童玩具,到工业控制系统,大到航天航空系统的设计与操作之中,随处可见单片机的踪影。
大学电子专业,电气专业,通信等专业开设单片机课程,对人才的培养无疑是有着重大的意义的。
单片机的学习,主要是注重于对单片机内部存储结构,引脚的结构与功能,以及各引脚之间的区别,用法上面的不同。
同样,单片机是一门技术,需要大量的动手实践才能真正的掌握其基本原理,才能真正的控制单片机并设计其程序,使其运行在指定的程序之下。
课程设计是在校学生素质教育的重要环节,是理论与实践相结合的桥梁和纽带。
单片机课程设计,要求学生更多的完成软硬结合的动手实践方案,解决目前学生课程设计过程中普遍存在的缺乏动手能力的现象.《单片机课程设计》是继《电子技术》、和《单片机原理及在电气测控学科中的应用》课程之后开出的实践环节课程,其目的和任务是训练学生综合运用已学课程“电子技术基础”、“单片机原理及在电气测控学科中的应用”的基本知识,独立进行单片机应用技术和开发工作,掌握单片机程序设计、调试和应用电路设计、分析及调试检测。
要求学生在实验室做出产品或仿真调试。
所以,个高校开设单片机课程设计课程,不仅是对同学们动手能力的培养,同时也是在培养同学们的一种学习方法,坚持时间与理论相结合。
2、概述
单片机对于学电子或是通信等专业的学生来说并不陌生,同样,它的重要性也无需多介绍。
当前的工业控制等等控制类系统正在逐步像自动化方向,以实现自动控制,自动应答紧急情况,自动辨别多重相应并作出相应的答复为目标。
当前的许多控制系统也是实现了某一些功能。
像常用的控制芯片有ATMEL公司的89系列单片机,还有更复杂一些的DSP数字处理芯片,因特尔公司的电脑CPU芯片等等。
单片机课程设计主要是将理论与实践相结合的一次过程,通过自己设计单片机外围电路,并且编写相应的控制程序来实现预定的功能。
这是一次很好的实践机会。
2.1、基于89C51电子时钟设计目的
学习单片机最重要的方法就是实现理论与实践相结合的学习方法。
有些工程师说过,能利用单片机设计并实现电子时钟,技能基本上掌握单片机的使用。
所以设计电子时钟的真正目的不在于设计出成品而投入使用,而是在于熟悉单片机的基本功能与编程来实现单片机的控制。
作为大学生,以后出去就业或是继续学业,都要有一定的动手能力和实践能力,而这,便是电子时钟设计的另一个目的。
2.2、课程设计的组成部分
1、程序框图的设计
2、设计功能框图
提供外部时钟震荡
电压数据从单片机
提供5v至1602显示
通过键盘扫描
来实现对时间
的调节
分析:
第一部分:
通过USB的物理特性,再通过芯片MAX232实现在线提供单片机5v电压。
第二部分:
单片机控制模块,有编写程序控制单片机引脚点位的变化来时时控制1602的显示。
第三部分:
键盘控制模块,为三个独立键盘,通过键盘的通断来控制I/O管脚电位的高低,实现人机通信。
第四部分:
显示模块,为1602液晶显示。
3、电子时钟设计的内容
3.1液晶1602显示电路的设计
1602电路连接图:
操作指令与数据代码设定:
操作时序图:
由1602液晶显示屏的各引脚功能以及时序图容易知道,在使用1602时
1号引脚接地GND。
2号引脚接到电源正极(5v)。
3号引脚为一电位器,可使用滑动变阻器来实现其功能。
4.、5、6号引脚为液晶的控制信号,EA=1,打开液晶显示;RS为数据/指令写入端,RS=1,写入数据,RS=0则写入指令。
7-14脚为数据或指令入口,与单片机的一个I/O口相连。
3.2晶振与复位电路设计
单片机的工作需要外部固定提供的频率,才能使单片机正常的工作,复位电路是为了方便单片机调试的时候便于恢复。
复位电路由刚开始上电时,电容冲满电,并断开,当开关按下,电容放电,给RST一个脉冲,并且时间超过两个机器周期,失心符为功能。
3.3键盘电路的设计
键盘为4*4的矩阵键盘模式,键盘的八只引脚接在单片机的P3口上,通过对键盘的逐次扫描来确定是否有键被摁下,来返回值达到控制的目的。
3.4总体电路的设计
原件清单:
该电路的原件比较简单,能够实现电子时钟的设计。
通过按键盘能够实现对年月日,时分秒的控制。
使用usb供电。
3.5单片机程序设计
#include
sbitrs=P3^5;
sbitlcden=P3^4;
sbitwr=P3^6;
sbitwela=P2^6;
sbitdula=P2^7;
sbits9=P3^0;
sbits13=P3^1;
sbits17=P3^2;
sbitrd=P3^7;
ucharshi,fen,miao,nian,yue,ri;
uchartable0[]="2020-12-21";//chushihua
uchartable1[]="00:
00:
00";//chushihua
uchartable[]="0123456789";
uchartemp,shi,fen,miao,nian,yue,ri,num;
voiddelay(ucharz)//延时子程序
{
uinti,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
voidwrrt_com(uchara)//指令函数wrtt_com
{
rs=1;
rs=0;
wr=1;
wr=0;
lcden=1;
P0=a;
lcden=0;
delay(5);
}
voidwrrt_date(ucharb)//数据函数wrtt——date
{
rs=0;
rs=1;
wr=1;
wr=0;
lcden=1;
P0=b;
lcden=0;
delay(5);
}
voiddisplay1(ucharadd,uchardat)//显示shifenmiao函数
{
ucharshi,ge;
shi=dat/10;
ge=dat%10;
wrrt_com(0x80+0x40+add);
wrrt_date(table[shi]);
wrrt_date(table[ge]);
}
voiddisplay2(ucharadd,uchardat)//显示yueri函数
{
ucharshi,ge;
shi=dat/10;
ge=dat%10;
wrrt_com(0x80+add);
wrrt_date(table[shi]);
wrrt_date(table[ge]);
}
voiddisplay3(ucharadd,uchardat)//显示nian函数
{
ucharqian,bai,shi,ge;
bai=dat/1000;
qian=dat/100%10;
shi=dat/10%10;
ge=dat%10;
wrrt_com(0x80+add);
wrrt_date(table[qian]);
wrrt_date(table[bai]);
wrrt_date(table[shi]);
wrrt_date(table[ge]);
}
voidinit()//初始化时钟显示
{
uinti,j;
wela=0;
dula=0;
nian=2012;
yue=12;
ri=21;
shi=0;
fen=0;
miao=0;
temp=0;
num=0;
rd=0;
wrrt_com(0x01);
wrrt_com(0x38);
wrrt_com(0x0c);
wrrt_com(0x06);
wrrt_com(0x80);
for(i=0;i<12;i++)
{
wrrt_date(table0[i]);//初始化日期写在1602上
delay
(1);
}
wrrt_com(0x80+0x40);//初始化shifenmiao
for(j=0;j<11;j++)
{
wrrt_date(table1[j]);
delay
(1);
}
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
}
voidclock()//时间变化扫描显示
{
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
ri++;
}
display1(3,shi);
}
display1(6,fen);
}
display1(9,miao);
if(ri==30)
{
ri=0;
yue++;
if(yue==30);
{
yue=0;
nian++;
display3(2,nian);
}
display2(7,yue);
}
display2(10,ri);
}
voidkeyscan()
{
rd=0;
if(s9==0)
{
delay(5);
if(s9==0)
{
while(!
s9);
num++;
if(num==1)
{
TR0=0;
wrrt_com(0x80+0x40+10);
wrrt_com(0x0f);
}
if(num==2)
{
wrrt_com(0x80+0x40+7);
wrrt_com(0x0f);
}
if(num==3)
{
wrrt_com(0x80+0x40+4);
wrrt_com(0x0f);
}
if(num==4)
{
wrrt_com(0x80+11);
wrrt_com(0x0f);
}
if(num==5)
{
wrrt_com(0x80+8);
wrrt_com(0x0f);
}
if(num==6)
{
wrrt_com(0x80+5);
wrrt_com(0x0f);
}
if(num==7)
{
TR0=1;
wrrt_com(0x0c);
num=0;
}
}
}
if(num!
=0)
{
if(s13==0)
{
delay(5);
if(s13==0)
{
while(!
s13);
if(num==1)
{
miao++;
wrrt_com(0x06);
display1(9,miao);
wrrt_com(0x80+0x40+10);
wrrt_com(0x0f);
if(miao==60)
{
miao=0;
}
}
if(num==2)
{
fen++;
wrrt_com(0x06);
display1(6,fen);
wrrt_com(0x80+0x40+7);
wrrt_com(0x0f);
if(fen==60)
{
fen=0;
}
}
if(num==3)
{
shi++;
wrrt_com(0x06);
display1(3,shi);
wrrt_com(0x80+0x40+4);
wrrt_com(0x0f);
if(shi==24)
{
shi=0;
}
}
if(num==4)
{
ri++;
wrrt_com(0x06);
display2(10,ri);
wrrt_com(0x80+11);
wrrt_com(0x0f);
if(ri==30)
{
ri=0;
}
}
if(num==5)
{
yue++;
wrrt_com(0x06);
display2(7,yue);
wrrt_com(0x80+8);
wrrt_com(0x0f);
if(yue==12)
{
yue=0;
}
}
if(num==6)
{
nian++;
wrrt_com(0x06);
display3(2,nian);
wrrt_com(0x80+5);
delay
(1);
}
}
}
}
if(num!
=0)
{
if(s17==0)
{
delay(5);
if(s17==0)
{
while(!
s17);
if(num==1)
{
miao--;
wrrt_com(0x06);
display1(9,miao);
wrrt_com(0x80+0x40+10);
wrrt_com(0x0f);
if(miao==60)
{
miao=0;
}
}
if(num==2)
{
fen--;
wrrt_com(0x06);
display1(6,fen);
wrrt_com(0x80+0x40+7);
wrrt_com(0x0f);
if(fen==60)
{
fen=0;
}
}
if(num==3)
{
shi--;
wrrt_com(0x06);
display1(3,shi);
wrrt_com(0x80+0x40+4);
wrrt_com(0x0f);
if(shi==24)
{
shi=0;
}
}
if(num==4)
{
ri--;
wrrt_com(0x06);
display2(10,ri);
wrrt_com(0x80+11);
wrrt_com(0x0f);
if(ri==30)
{
ri=0;
}
}
if(num==5)
{
yue--;
wrrt_com(0x06);
display2(7,yue);
wrrt_com(0x80+8);
wrrt_com(0x0f);
if(yue==12)
{
yue=0;
}
}
if(num==6)
{
nian--;
wrrt_com(0x06);
display3(2,nian);
wrrt_com(0x80+5);
delay
(1);
}
}
}
}
}
voidmain()
{
init();
while
(1)
{
if(TR0==1)
{
clock();
}
keyscan();
}
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
temp++;
if(temp==20)
{
temp=0;
miao++;
}
}
4、总结
4、1遇到的问题与解决办法:
这次的单片机课程设计出现的最主要的问题就是如何实现通过键盘对时间的调整,难度在于如何从过c语言编写程序来实现,并且要与前面的显示电路,以及控制电路的协调工作。
遇到而第二个难题就是如何实现键盘的扫描程序。
键盘扫描这个问题主要是通过网络来解决的。
通过观看网络上面的视屏教程,学会了如何通过扫描,返回函数值来确定是否有键按下。
通过键盘来实现对时间的调整这个难题是通过相互讨论来完成的。
我们先确定要用的按键有那几个,初步确定为三个,一个功能键,一个时间加,一个时间减。
再通过中断以及1602显示程