ygf单片机课程设计.docx

上传人:b****7 文档编号:9482162 上传时间:2023-02-04 格式:DOCX 页数:24 大小:292.14KB
下载 相关 举报
ygf单片机课程设计.docx_第1页
第1页 / 共24页
ygf单片机课程设计.docx_第2页
第2页 / 共24页
ygf单片机课程设计.docx_第3页
第3页 / 共24页
ygf单片机课程设计.docx_第4页
第4页 / 共24页
ygf单片机课程设计.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

ygf单片机课程设计.docx

《ygf单片机课程设计.docx》由会员分享,可在线阅读,更多相关《ygf单片机课程设计.docx(24页珍藏版)》请在冰豆网上搜索。

ygf单片机课程设计.docx

ygf单片机课程设计

 

《单片机原理及应用课程设计》报告

——定时闹钟设计

专业:

电子信息工程

班级:

电子1112

姓名:

虞阁飞

学号:

1120106221

指导教师:

 

2014年6月6日

 

1.课程设计目的

1.1巩固和加深对单片机原理和接口技术知识的理解;

1.2培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;

1.3学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;

1.4掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;

1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。

2.课程设计要求

使用AT89C51单片机结合字符型LCD显示器设计一个简易的定时闹钟LCD时钟,若LCD选择有背光显示的模块,在夜晚或黑暗的场合中也可使用。

定时闹钟的基本功能如下:

显示格式为“时时:

分分”。

由LED闪动来做秒计数表示。

一旦时间到则发出声响,同时继电器启动,可以扩充控制家电开启和关闭。

程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:

00”,按下操作键K1~K4动作如下:

(1)K1—设置现在的时间。

(2)K2—显示闹钟设置的时间。

(3)K3—设置闹铃的时间。

(4)K4—闹铃ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一声。

设置当前时间或闹铃时间如下。

(1)K1—时调整。

(2)K2—分调整。

(3)K3—设置完成。

(4)K4—闹铃时间到时,发出一阵声响,按下本键可以停止声响。

本项目的难点在于4个按键每个都具有两个功能,以最终实现菜单化的输入功能。

3.硬件设计

3.1设计思想

硬件设计的任务是根据总体设计要求,在选择的机型的基础上,具体确定系统中所要使用的元器件,设计出系统的原理框图、电路原理图。

3.2主要元器件介绍

1.单片机:

AT89C52

2.LCD一个(LM016L)

3.PNP型三极管1个

4.普通电容2个(20uF),电解电容1个(10uF)

5.晶振1个(1MHZ)

6.开关4个(button)

7.电阻1个(2k)

8.电源3个(5V)

3.3功能电路介绍

主电路

主电路主要就是芯片的运行,加载程序后,在外部时钟的作用下,将按照程序运行,从而可以实现设计的要求,进行时钟时间和定时时间的调整,并且能够在到达定时时间后控制蜂鸣器发出声响。

蜂鸣器及按键控制

按键可以对时间进行调整,蜂鸣器可以在到达定时的时间时提醒我们。

内部时钟电路

单片机内部有一个用于构成振荡器的高增益反向放大器,它的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。

这两个引脚跨接石英晶体和微调电容,构成一个稳定的自激振荡器。

时钟频率可以影响单片机的速度。

单片机的各功能部件的运行都以时钟控制信号为基准

总体电路图

LCD显示屏:

1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。

液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点。

晶模块内部的控制器共有11条控制指令,如表所示:

表3-1:

控制命令表

序号

指令

RS

R/W

D7

D6

D5

D4

D3

D2

D1

D0

1

清显示

0

0

0

0

0

0

0

0

0

1

2

光标返回

0

0

0

0

0

0

0

0

1

*

3

置输入模式

0

0

0

0

0

0

0

1

I/D

S

4

显示开/关控制

0

0

0

0

0

0

1

D

C

B

5

光标或字符移位

0

0

0

0

0

1

S/C

R/L

*

*

6

置功能

0

0

0

0

1

DL

N

F

*

*

7

置字符发生存贮器地址

0

0

0

1

字符发生存贮器地址

8

置数据存贮器地址

0

0

1

显示数据存贮器地址

9

读忙标志或地址

0

1

BF

计数器地址

10

写数到CGRAM或DDRAM)

1

0

要写的数据内容

11

从CGRAM或DDRAM读数

1

1

读出的数据内容

指令3:

光标和显示模式设置I/D:

光标移动方向,高电平右移,低电平左移S:

屏幕上所有文字是否左移或者右移。

高电平表示有效,低电平则无效。

指令4:

显示开关控制。

D:

控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:

控制光标的开与关,高电平表示有光标,低电平表示无光标B:

控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:

光标或显示移位S/C:

高电平时移动显示的文字,低电平时移动光标。

指令6:

功能设置命令DL:

高电平时为4位总线,低电平时为8位总线N:

低电平时为单行显示F:

低电平时显示5×7的点阵字符。

指令9:

读忙信号和光标地址BF:

为忙标志位,高电平表示忙,此时模块不能

接收命令或者数据,如果为低电平表示不忙。

4.软件设计

4.1软件流程图

4.2源程序(程序用C编写,LCD驱动程序网上查找)

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetable1[]="00:

00:

00";

sbitlcden=P2^6;//位定义

sbitlcdrw=P2^5;

sbitlcdrs=P2^4;

sbits1=P3^0;

sbits2=P3^1;

sbits3=P3^2;

sbitbeep=P3^7;//定义蜂鸣器

ucharnum,count,s1num;//显示的位数;响应中断数;按键次数;

uinti;

charshi,fen,miao,shi1,fen1,miao1;

voiddelay(uintz)//延时程序

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voidwrite_com(ucharcom)//控制指令

{

lcdrs=0;//低电平时选择指令寄存器

lcdrw=0;//低电平时进行写操作

delay(5);

lcden=1;//E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令

P0=com;

delay(5);

lcden=0;

}

voidwrite_data(uchardate)//数据指令

{

lcdrs=1;

lcden=1;//均为高时是读出数据的内容

delay(5);

P0=date;

delay(5);

lcden=0;

}

voidinit()//初始化

{

lcdrw=0;

lcden=0;

delay(15);

write_com(0x38);//设置为4位总线,单行显示

delay(5);

write_com(0x38);

delay(5);

write_com(0x38);

write_com(0x38);//重复多次以确定可以正确设置

write_com(0x08);//无光标正常显示

write_com(0x01);//清显示

write_com(0x06);//光标和显示模式设置d1I/D:

光标移动方向,高电平右移d0S:

屏幕上所有文字是否左移或者右移。

低电平表示光标闪烁

write_com(0x0c);//显示开关控制。

d2D:

控制整体显示的开与关,高电平表示开显示d1C:

控制光标的开与关,低电平表示无光标B:

控制光标是否闪烁,低电平不闪烁

write_com(0x80+1);//d7为高时,显示数据存储地址

TMOD=0x11;//工作方式3

TH0=(65536-50000)/256;//定时时间为50ms

TL0=(65536-50000)%256;

EA=1;//开总中断

ET0=1;//打开定时器

TR0=1;//启动定时器

write_com(0x80+4);//秒的设定

for(num=0;num<8;num++)

{

write_data(table1[num]);

delay(20);

}

write_com(0x80+0x40+4);

for(num=0;num<8;num++)

{

write_data(table1[num]);

delay(20);

}

}

voidwrite_sfm(ucharadd,uchardate)//调整时间

{

ucharshi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+0x40+add);//控制指令,0x40:

字符发生器RAM地址设置进行加

write_data(0x30+shi);//数据指令,功能设置命令d4DL:

高电平时为4位总线d3N:

低电平时单行显示d2F:

低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。

write_data(0x30+ge);

}

voidwrite_shedingsfm(ucharadd1,uchardate1)//设定定时时间

{

ucharshi1,ge1;

shi1=date1/10;

ge1=date1%10;

write_com(0x80+add1);//控制指令

write_data(0x30+shi1);

write_data(0x30+ge1);

}

voidkeyscan()

{

if(s1==0)

{

delay(5);

if(s1==0)

{

s1num++;

while(!

s1);//s1按下

}

}

if(s1num==1)//按下次数

{

TR0=0;//停止定时器工作

write_com(0x80+0x40+11);//调整时间设置,控制秒设定

write_com(0x0f);//d3显示开关控制。

d2D:

控制整体显示的开与关,高电平表示开显示d1C:

控制光标的开与关,高电平表示有光标d0B:

控制光标是否闪烁,高电平闪烁

}

if(s1num==2)

{

write_com(0x80+0x40+8);//控制分钟设定

write_com(0x0f);//控制光标闪烁

}

if(s1num==3)

{

write_com(0x80+0x40+5);//控制时设定

write_com(0x0f);

}

if(s1num==4)

{TR0=1;//启动定时器,定时时间的设定

write_com(0x80+11);//控制秒的设定

write_com(0x0f);//光标显示

}

if(s1num==5)

{

write_com(0x80+8);//定时分钟的设定

write_com(0x0f);

}

if(s1num==6)

{

write_com(0x80+5);//定时时的显示

write_com(0x0f);

}

if(s1num==7)

{

s1num=0;//按键次数清零

write_com(0x0c);//显示此时为无光标状态

}

if(s1num!

=0)//有按键时

{

if(s2==0)

{

delay(5);

if(s2==0)

{

while(!

s2);

if(s1num==1)

{

miao++;

if(miao==60)

{

miao=0;

}

write_sfm(10,miao);//第10位进行秒的设定

write_com(0x80+0x40+11);//控制秒的设定

}

if(s1num==2)

{

fen++;

if(fen==60)

{

fen=0;

}

write_sfm(7,fen);

write_com(0x80+0x40+8);

}

if(s1num==3)

{

shi++;

if(shi==24)

{

shi=0;

}

write_sfm(4,shi);

write_com(0x80+0x40+5);

}

if(s1num==4)

{

TR0=1;//定时器启动

miao1++;

if(miao1==60)

{

miao1=0;

}

write_shedingsfm(10,miao1);

write_com(0x80+11);

}

if(s1num==5)

{

fen1++;

if(fen1==60)

{

fen1=0;

}

write_shedingsfm(7,fen1);

write_com(0x80+8);

}

if(s1num==6)

{

shi1++;

if(shi1==24)

{

shi1=0;

}

write_shedingsfm(4,shi1);

write_com(0x80+5);

}

}

}

}

if(s3==0)

{

delay(5);

if(s3==0)

{

while(!

s3);

if(s1num==1)

{

miao--;

if(miao==-1)

{

miao=59;

}

write_sfm(10,miao);

write_com(0x80+0x40+11);

}

if(s1num==2)

{

fen--;

if(fen==-1)

{

fen=59;

}

write_sfm(7,fen);

write_com(0x80+0x40+8);

}

if(s1num==3)

{

shi--;

if(shi==-1)

{

shi=23;

}

write_sfm(4,shi);

write_com(0x80+0x40+5);

}

if(s1num==4)

{

TR0=1;

miao1--;

if(miao1==-1)

{

miao1=59;

}

write_shedingsfm(10,miao1);

write_com(0x80+11);

}

if(s1num==5)

{

fen1--;

if(fen1==-1)

{

fen1=59;

}

write_shedingsfm(7,fen1);

write_com(0x80+8);

}

if(s1num==6)

{

shi1--;

if(shi1==-1)

{

shi1=23;

}

write_shedingsfm(4,shi1);

write_com(0x80+5);

}

}

}

}

voidmain()//主函数

{

init();//初始化函数

while

(1)

{

keyscan();//键盘扫描

if(count==20)//响应中断20次,时间1s

{

count=0;//清零

miao++;//秒加1

if(miao==60)//60秒时分加1

{

miao=0;

fen++;

if(fen==60)//60分时时加1

{

fen=0;

shi++;

if(shi==24)//24时时时全为0,从00:

00:

00开始计时

{

shi=0;

}

write_sfm(4,shi);//修改时

}

write_sfm(7,fen);//修改分

}

write_sfm(10,miao);//修改秒

if((shi==shi1)&&(fen==fen1)&&(miao==miao1))//蜂鸣器电路的运行

{

for(i=0;i<10;i++)

{

beep=0;//蜂鸣器响

delay(50);

beep=1;

delay(50);

}

}

}

}

}

voidtimer0()interrupt1//中断函数

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

count++;

}

5.调试运行

5.1

注:

LCD屏比较大,在proteus中必须放大屏幕才能更加清楚看清上面的数字。

6.设计心得体会

通过本次课程设计,进一不熟悉单片机以及proteus的使用,虽然没学过LCD,也不会写LCD的驱动程序,但通过上网查找资料,了解了LCD的各个引脚的功能以及使用,在网上找到一份LCD驱动程序,完成了LCD这个难点,C代码编程也是另一个难点,中断的设置,延时程序的编写,蜂鸣器赋值1响,这些比较好编写,但整个程序的排列以及由于长时间没熟悉C语言对代码的编写还存在写问题。

最终通过和同学的讨论以及上网查找写资料都一一解决。

本次课程设计把我们所学的专业基础课理论知识运用到实践中去。

本次课程设计然我们明白要做好一个课程设计,就必须做到:

在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便。

参考书目:

[1]阎石,《数字电子技术基础》,北京,高等教育出版社,2004年

[2]肖金球,《单片机原理与接口技术》

[3]倪继峰,《单片机C语言程序设计实训100例-基于8051+Proteus仿真》

[4]谭浩强,《C程序设计》

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1