课程设计docWord格式文档下载.docx
《课程设计docWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《课程设计docWord格式文档下载.docx(16页珍藏版)》请在冰点文库上搜索。
![课程设计docWord格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/e5936828-6c41-4d69-a222-31ee495852a3/e5936828-6c41-4d69-a222-31ee495852a31.gif)
3.2.各部分功能实现
3.2.1.控制部分(AT89C51)
AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
单片机最小系统
单片机最小系统主要由复位电路,晶振电路,电源等几部分组成。
图二:
最小系统电路
3.2.2键盘控制系统设计
按键需要4个,分别实现为时间调整、小时的加、分钟的减、退出四个功能。
用单片机的4个I/O口接收控制信号,其电路如图。
图三:
键盘控制图
3.2.3.显示电路。
图四:
显示电路图
1602液晶概述
工业字符型液晶,1602是指显示的内容为16*2,能同时显示两行,每行16个字符。
常见的1602字符液晶有两种,一种显示绿色背光黑色字体,另一种显示蓝色背光白色字体,目前市面上绝大多数基于HD44780液晶芯片控制,原理是完全相同的。
本课题所用1602液晶模块,显示屏是蓝色背光白色字体。
图五:
1602图
1602引脚介绍
编号
符号
引脚说明
1
GND
电源地
2
VCC
电源正极
3
VO
液晶显示对比度调节端
4
RS
数据/命令选择端
5
R/W
读写选择
6
E
使能信号
7
D0
数据口
8
D1
9
D2
10
D3
11
D4
12
D5
13
D6
14
D7
15
BLA
背光电源正
16
BLK
背光电源负
1602字符液晶引脚说明
各个引脚具体功能说明:
第1脚:
GND为地电源。
第2脚:
VCC接5V正电源。
第3脚:
VO为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生重影,使用一个1K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
DB0~DB7为8位双向数据线。
第15~16脚:
背光灯电源。
1602字符液晶使用方法
操作
输入
输出
读状态
RS=L,RW=H,E=H
D0~D7=状态字
写指令
RS=L,RW=L,D0~D7=指令码,E=高脉冲
无
读数据
RS=H,RW=H,E=H
D0~D7=数据
写数据
RS=H,RW=L,D0~D7=数据,E=高脉冲
4.软件设计
4.1软件主要要完成的功能
(1)显示时间程序
用软件调节时间,通过程序的调节,最后用LCD现实时钟
(2)调节时间程序
按键调节时间,能实现时、分的调节
4.2软件设计的主要流程
(1)系统总的流程
主要功能是负责时间的显示,通过写地址和写数据来实现时间的调节和控制,最后通过调用显示子程序显示出来
(2)时间控制程序
时间控制程序,用中断准确的控制时间,采用60进制,60秒为一分钟,60分钟为一个小时,全天设置为24小时。
程序流程图如图:
.
图六:
程序流程图
程序用C语言编写,代码见附录,编程时采用KEILC,而仿真用PROTUES,仿真时仿真图如图。
图七:
PROTUES仿真图
图八:
实物图
5小结
众所周知,单片机是电子信息工程专业的一们重要的课程,也是当今电子行业的重要分支之一,应用范围之广,普遍程度之高大家有目共睹,所以学好单片机对于电子信息工程专业的学生来说至关重要,甚至直接关系到日后的就业。
正因为这重要性才需要我们去实践,去锻炼。
在此次课程设计中,在最初的写程序及设计时遇到了一些困难。
因为一开始课堂上接触的是汇编语句,但汇编语句不易读懂,所以难以下手。
后来经过上网了解知道有郭天翔老师的“十天学会单片机”,下载来认真看了后大有所得,也因为之前的C基础,比较容易上手,所以最后程序是用C程序编写。
这样来不仅进一步增强了自己对单片机的兴趣,也让自己对单片机的认识又有新的提高。
在经过后面的查阅,知道单片机深入我们生活的方方面又让我“一定要学好单片机”的念头更深了。
虽然此次的选题难度并不大,但是就是这样一个简单的题目却让我明白“纸上得来终觉浅”的深刻意义。
经过一次次的修改程序和软件调试,使我了解了KEILC和PROTUES软件的使用,为日后自己主动地去设计一些东西打下了基础。
在设计硬件部分时,动手能力的确得加强,很感谢同学的无私帮忙和耐心协助才得以电路板一次成功,让我明白合作总比一个人无谓的单干要好的多。
当然在此期间也出现了不少问题,如:
1.在写程序的时候,中断的灵活使用掌握不是很好;
2.焊电路板时一开始没有焊接液晶1602的调背光电阻,使得显示效果不是很好。
但这些问题最后都迎刃而解,让我知道查阅资料的重要性。
通过此次课程设计,我们懂得不管做什么事都要有恒心,只要坚持一切都会会实现的。
让我了解了1602的基本知识和使用方法,激发了强烈的兴趣,也重新让我温习了下WORD的使用。
感谢老师的教导,感谢同学的帮助。
参考文献
[1]陈权昌,李兴富.单片机原理及应用.广州:
华南理工大学出版社,2007.8
[2]李庆亮.C语言程序设计实用教程.北京:
机械工业出版社,2005.3
[3]王艳春现代通信综合实验教程哈尔滨工业大学出版社2011.7
[4]刘宁.单片机多功能时钟的设计.浙江:
浙江海洋学院,2009.
[5]汪文,陈林.单片机原理及应用.湖北:
华中科技大学出版社,2007.
[6]康华光.电子技术基础数字部分.北京:
高等教育出版社,2008.
[7]杨欣.电子设计从零开始.北京:
清华大学出版社,2005.
[8]唐勇.基于单片机的电子钟的设计.湖南:
湖南工学院,2007.
附录
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineKEY_IOP3
//#defineLCD_IOP0
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
sbitSPK=P1^2;
sbitLED=P2^4;
bitnew_s,modify=0;
chart0,sec=50,min=59,hour=23;
charcodeLCD_line1[]="
DesignedbyZELD"
;
charcodeLCD_line2[]="
Timer:
00:
00:
00"
charTimer_buf[]="
23:
59:
50"
//---------------------------------------------------
voiddelay(uintz)
{
intx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
/*voidW_LCD_Com(ucharcom)//写指令
{
LCD_RS=0;
P0=com;
//LCD_RS和R/W都为低电平时,写入指令LCD_EN=1;
delay(5);
LCD_EN=0;
//用EN输入一个高脉冲
}//************************/
voidW_LCD_Com(ucharcom)
LCD_RS=0;
P0=com;
//P1
LCD_EN=1;
LCD_EN=0;
}
/*voidW_LCD_Dat(uchardat)//写数据
LCD_RS=1;
P0=daLCD_ENt;
//LCD_RS为高、R/W为低时,写入数据LCD_EN=1;
}*/
voidW_LCD_Dat(uchardat)
LCD_RS=1;
P0=dat;
voidW_LCD_STR(uchar*s)//写字符串
while(*s)W_LCD_Dat(*s++);
}//---------------------------------------------------
voidW_BUFF(void)//填写显示缓冲区
Timer_buf[7]=sec%10+48;
Timer_buf[6]=sec/10+48;
Timer_buf[4]=min%10+48;
Timer_buf[3]=min/10+48;
Timer_buf[1]=hour%10+48;
Timer_buf[0]=hour/10+48;
W_LCD_Com(0xc0+7);
W_LCD_STR(Timer_buf);
}
ucharread_key(void)
ucharx1,x2;
KEY_IO=255;
x1=KEY_IO;
if(x1!
=255){
delay(100);
x2=KEY_IO;
=x2)return255;
while(x2!
=255)x2=KEY_IO;
if(x1==0x7f)return0;
elseif(x1==0xbf)return1;
elseif(x1==0xdf)return2;
elseif(x1==0xef)return3;
elseif(x1==0xf7)return4;
return255;
voidInit()
LCD_RW=0;
W_LCD_Com(0x38);
delay(50);
W_LCD_Com(0x0c);
W_LCD_Com(0x06);
W_LCD_Com(0x01);
W_LCD_Com(0x80);
W_LCD_STR(LCD_line1);
W_LCD_Com(0xC0);
W_LCD_STR(LCD_line2);
TMOD=0x01;
//T0定时方式1
TH0=0x4c;
TR0=1;
//启动T0
PT0=1;
//高优先级,以保证定时精度
ET0=1;
EA=1;
voidmain()
uinti,j;
ucharKey;
Init();
while
(1){
//-------------------------------
if(new_s){//如果出现了新的一秒,修改时间
new_s=0;
sec++;
sec%=60;
if(!
sec){min++;
min%=60;
min){hour++;
hour%=24;
W_BUFF();
//写显示
if(!
sec&
&
!
min){//整点报时
for(i=0;
i<
200;
i++){
SPK=0;
for(j=0;
j<
100;
j++);
SPK=1;
}}
Key=read_key();
//读出按键
switch(Key){//分别处理四个按键
case0:
modify=1;
break;
case1:
if(modify){min++;
W_BUFF();
}
case2:
if(modify){hour++;
}case3:
modify=0;
voidtimer0(void)interrupt1//T0中断函数,50ms执行一次
{
t0++;
t0%=20;
//20,一秒钟
if(t0==0){new_s=1;
LED=~LED;
if(modify)LED=0;