ygf单片机课程设计.docx
- 文档编号:9482162
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:24
- 大小:292.14KB
ygf单片机课程设计.docx
《ygf单片机课程设计.docx》由会员分享,可在线阅读,更多相关《ygf单片机课程设计.docx(24页珍藏版)》请在冰豆网上搜索。
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程序设计》
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ygf 单片机 课程设计