计算机控制课设报告.docx
《计算机控制课设报告.docx》由会员分享,可在线阅读,更多相关《计算机控制课设报告.docx(35页珍藏版)》请在冰豆网上搜索。
计算机控制课设报告
《微型计算机控制技术》
课程设计报告
学号
姓名
指导老师
所在学院物联网工程学院
完成日期2016年6月22日
目录
1课程设计目的…………………………………………………………3
2主要设计任务和内容…………………………………………………3
2.1液晶时钟显示……………………………………………………………………………3
2.1.1基本设计要求……………………………………………………………………3
2.1.2方案介绍…………………………………………………………………………3
2.2密码锁…………………………………………………………………………………7
2.2.1基本设计方案…………………………………………………………………7
2.2.2方案介绍………………………………………………………………………7
3现场调试和修改……………………………………………………8
3.1液晶时钟显示…………………………………………………………………………8
3.2密码锁…………………………………………………………………………………8
4课程设计小结………………………………………………………9
附录……………………………………………………………………10
液晶时钟显示程序源代码……………………………………………………………………10
密码锁程序源代码……………………………………………………………………………16
一、课程设计的目的
计算机控制技术课程是集微机原理、计算机技术、控制理论、电子电路、自动控制系统、工业控制过程等课程基础知识一体的应用性课程,具有很强的实践性,通过这次课程设计进一步加深对计算机控制技术课程的理解,掌握计算机控制系统硬件和软件的设计思路,以及对相关课程理论知识的理解和融会贯通,提高运用已有的专业理论知识分析实际应用问题的能力和解决实际问题的技能,培养独立自主、综合分析与创新性应用的能力。
二、主要设计任务和内容
2.1液晶时钟显示
利用STC89C51单片机、LCD1602电子显示屏和DS1302时钟芯片实现电子时钟。
2.1.1基本设计要求
1、实现液晶显示时钟;
2、实现按键调节和校准时间。
2.1.2方案介绍
1、设计思路
电路整体上由AT89C51CPU控制模块、LCD显示模块、DS1302时钟采集模块、按键处理模块四大模块组成,以AT89C51为核心电路,控制LCD显示,具体的显示内容和方式由软件来完成;由于有时钟和日期的调节功能需要校准电路,按键有移位键,加1键、减1键三个按键组成,计时功能由DS1302完成,显示功能则由LCD1602液晶完成。
A.电子时钟的设计框图
B.DS1302时钟模块
DS1302是DALLAS公司推出的涓流充电时钟芯片。
内含6有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日星期月年的信息每月的天数和闰年的天数可自动调整时钟操作。
a)管脚描述:
X1X232.768KHz晶振管脚
GND地
RST复位脚
I/O数据输入/输出引脚
SCLK串行时钟
Vcc1,Vcc2电源供电管脚。
b)DS1302内部寄存器
CH:
时钟停止位寄存器2的第7位12/24小时标志
CH=0振荡器工作允许 bit7=1,12小时模式
CH=1振荡器停止 bit7=0,24小时模式
WP:
写保护位 寄存器2的第5位:
AM/PM定义
WP=0寄存器数据能够写入 AP=1下午模式
WP=1寄存器数据不能写入 AP=0上午模式
TCS:
涓流充电选择 DS:
二极管选择位
TCS=1010使能涓流充电 DS=01选择一个二极管
TCS=其它禁止涓流充电 DS=10选择两个二极管
DS=00或11,即使TCS=1010,充电功能也被禁止
RS位
电阻
典型位
00
没有
没有
01
R1
2KΩ
10
R2
4KΩ
11
R3
8KΩ
c)时钟
小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。
当为高时,选择12小时模式。
在12小时模式时,位5是10小时位,当为1时,表示PM。
在24小时模式时,位5是第二个10小时位。
秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。
当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。
控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。
在任何的对时钟和RAM的写操作之前,WP位必须为0。
当WP位为1时,写保护位防止对任一寄存器的写操作。
d)控制字(即地址及命令字节)
76543210
1
RAM
A4
A3
A2
A1
A0
RD
控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6:
如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;
位5至位1(A4~A0):
指示操作单元的地址; 位0(最低有效位):
如为0,表示要进行写操作,为1表示进行读操作。
控制字总是从最低位开始输出。
在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。
同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。
C.按键处理模块
首先,给P1赋值0xf0,这时P1^4,P1^5,P1^6,P1^7为高电平,P1^0,P1^1,P1^2,P1^3为低电平。
如果这时候有按键按下那么P1^4,P1^5,P1^6,P1^7就有一个会变成低电平。
因此P1的值就不等于0xf0,这是就可以判断有按键按下。
然后延时一段时间去抖动,然后给P1赋值0xfe,也就是P1^0为低电平,其他为高电平,这时如果有在P1^0线上的P1^4,P1^5,P1^6,P1^7有按键按下,那么就会出现低电平,从而判断哪个按键按下;如果没有那么就给P1赋值0xfd,也就是P1^1为低电平,其他为高电平.,相同方法判断是否有按键按下;如果没有那么就给P1赋值0xfb·····如此类推,一共四次检测。
D.LCD显示模块
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。
a)管脚描述
第1脚:
VSS为电源地
第2脚:
VCC接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6脚:
E(或EN)端为使能(enable)端,高电平
(1)时读取信息,负跳变时执行指令。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
b)控制命令表
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:
1为高电平、0为低电平)
指令1:
清显示,指令码01H,光标复位到地址00H位置
指令2:
光标复位,光标返回到地址00H。
指令3:
光标和显示模式设置 I/D:
光标移动方向,高电平右移,低电平左移 S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:
控制光标的开与关,高电平表示有光标,低电平表示无光标 B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:
光标或显示移位 S/C:
高电平时移动显示的文字,低电平时移动光标。
指令6:
功能设置命令 DL:
高电平时为4位总线,低电平时为8位总线 N:
低电平时为单行显示,高电平时双行显示 F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:
字符发生器RAM地址设置。
指令8:
DDRAM地址设置。
指令9:
读忙信号和光标地址 BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据。
指令11:
读数据。
E.主程序流程图
F.实验设备与材料
单片机开发板、计算机、KeiluVision4
G.步骤
1、将所设计的程序通过keil编译并产生hex文件
2、用usb连接开发板与计算机
3、在开发板上调试观察实验现象并记录
4、调试完毕,切断开发板电源,整理好实验仪器。
H.程序
代码另附纸
2.2密码锁
电子密码校验设计,由输入密码、设定密码、寄存电路、比较电路、显示电路、修改密码组成。
本电子密码锁利用数字逻辑电路,实现对锁的电子控制,突破了传统的机械锁的单一性、保密性低、易撬性的缺点,数字电子密码锁具有保密性高、使用灵活性好、安全系数高的优点。
2.2.1基本设计要求
1、具有解锁指示;
2、具有密码修改功能;
3、显示修改密码。
2.2.2方案介绍
1、设计思路
其基本电路由七个部分组成,其中开锁输入电路和密码输入电路组成输入电路;由锁存移位寄存,译码器组成显示电路;将输入的十进制数由输入电路转换为8421BCD码;密码送入寄存器进行寄存,利用541744S350寄存器的移位功能把输入密码进行移位,每输入一个新密码将之前输入的密码向左移位,最后是密码的十进制在显示器显示。
A.密码锁的设计框图
B.数码管显示模块
数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、3位、4位、5位、6位、7位等数码管;按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮,本次课设采用的是8位共阴极数码管。
C.流水灯模块
当密码正确,密码锁打开时流水灯亮起,提示已开锁;只有在开锁状态下才可以进行密码修改。
D.主程序流程图
I.实验设备与材料
单片机开发板、计算机、KeiluVision4
J.步骤
1、将所设计的程序通过keil编译并产生hex文件
2、用usb连接开发板与计算机
3、在开发板上调试观察实验现象并记录
4、调试完毕,切断开发板电源,整理好实验仪器。
K.程序
代码另附纸
三、现场调试和修改
A.液晶时钟调试
a)现场调试
1、将hex文件写入开发板;
2、校准时间日期,将时间调为当时所在北京时间。
b)现场修改
要求:
将时间中的时分秒显示变为秒分时显示
1、修改LCD1602显示模块,原代码的显示按照显示顺序分别由首地址加偏移地址,修改显示模块分别所在的偏移地址,则显示时顺序变化;
2、修改按键扫描模块,原代码扫描到功能键按下则光标从秒位开始闪烁变化调节,修改代码后光标从时位开始闪烁光标修改时间。
B.密码锁
a)现场调试
1、将hex文件写入开发板;
2、输入初始密码000000;
3、修改密码为任意想要值,关闭密码;
4、再次开锁需输入修改后的密码;
5、如果输入过程中出现错误可以按下retry键进行重新输入。
b)现场修改
要求:
密码输错两次后锁定
1、修改retry键模块,加入一个新的变量为cishu,每当retry键按下则cishu++;
2、修改ok模块,在原本密码正确条件下增加一条为cishi《2,则当密码输错三次,密码锁自动锁定,即使输入正确密码也无法打开。
四、课程设计小结
回想起此次课设的过程,从选题到编程,从理论到实践,在两周的日子里,我花了很多的心血,当然这一切都在最后得到了回报。
可以说得是苦多于甜,但是从中却学习到很多很多的东西,不但巩固了以前所学的知识,而且对单片机原理课外知识也得到了扩展。
另外,在编程过程中,往往一个简单的误操作就让程序运行出错。
同时,对已编译的hex文件下载到试验箱也是需要关注的地方。
下载前需要关闭单片机电源,并打开波特率按钮,确定设置后点击“下载”按钮,之后快速打开单片机电源。
若操作不当或者界限接触不好很容易造成软件下载失败。
当然,出现这种情况并不是严重的,只要重新按步骤再次下载就可以了。
在最关键的程序设计过程中,我体会到坚持不懈的恒心。
为了让程序达到自己的要求,必须对一段代码数次的更改,每次更改后还要在仿真软件里实现,重复这样的操作的确是无味的,但是确是必要的,只有一次次的修改代码才会让程序运行的更有效率,更人性化,更易理解,这也是我所追求的。
在此次计算机控制课设之后,我不仅加深了对单片机的理解,将理论很好的应用到实际当中去,而且我们还学会了如何去培养创新精神和严谨的科学作风,从而不断的战胜自己,超越自己,更重要的是,我在这一次设计过程中,学会了坚持不懈,不轻言放弃。
当然该电子时钟还有很多不足之处,这警示我们在今后的学习中要继续努力,锻炼自己。
附录
1、液晶时钟程序源代码
#include
#defineuintunsignedint
#defineucharunsignedchar
uchara,miao,shi,fen,ri,yue,nian,week,flag,temp,key1n;
#defineyh0x80//第一行的初始位置
#defineer0x80+0x40//第二行初始位置
sbitdula=P2^6;
sbitwela=P2^7;
sbitwr=P3^6;
sbitrs=P3^5;
sbiten=P3^4;
sbitSCLK=P1^0;
sbitIO=P1^1;
sbitRST=P1^2;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
sbitkey=P3^7;
sbitkey1=P3^0;
sbitkey2=P3^1;
sbitkey3=P3^2;
ucharcodetab1[]={"2014--THU"};
ucharcodetab2[]={":
:
"};
voiddelay(uintxms)//延时函数
{
uintx,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/******************液晶写入************************/
write_1602com(ucharcom)//液晶写入指令函数
{
rs=0;//置为写入命令
P0=com;//送入数据
delay
(1);
en=1;//拉高使能端
delay
(1);
en=0;//完成高脉冲
}
write_1602dat(uchardat)
{
rs=1;//置为写入数据
P0=dat;//送入数据
delay
(1);
en=1;
delay
(1);
en=0;
}
/*********************over***********************/
/********************ds1302****************************/
voidwrite_byte(uchardat)
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
ucharread_byte()
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return(ACC);
}
voidwrite_1302(ucharadd,uchardat)
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
ucharread_1302(ucharadd)
{
uchartemp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
ucharBCD_Decimal(ucharbcd)//BCD十进制编码
{
ucharDecimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
voidds1302_init()//ds1302初始化
{
RST=0;
SCLK=0;
write_1302(0x80,miao|0x00);//允许写
}
voidwrite_sfm(ucharadd,uchardat)//写时分秒
{
uchargw,sw;
gw=dat%10;
sw=dat/10;
write_1602com(er+add);
write_1602dat(0x30+sw);
write_1602dat(0x30+gw);
}
voidwrite_nyr(ucharadd,uchardat)//写年月日
{
uchargw,sw;
gw=dat%10;
sw=dat/10;
write_1602com(yh+add);
write_1602dat(0x30+sw);
write_1602dat(0x30+gw);
}
voidwrite_week(ucharweek)//写星期函数
{
write_1602com(yh+0x0d);
switch(week)
{
case1:
write_1602dat('M');//delay(5);
write_1602dat('O');//delay(5);
write_1602dat('N');
break;
case2:
write_1602dat('T');//delay(5);
write_1602dat('U');//delay(5);
write_1602dat('E');
break;
case3:
write_1602dat('W');//delay(5);
write_1602dat('E');//delay(5);
write_1602dat('D');
break;
case4:
write_1602dat('T');//delay(5);
write_1602dat('H');//delay(5);
write_1602dat('U');
break;
case5:
write_1602dat('F');//delay(5);
write_1602dat('R');//delay(5);
write_1602dat('I');
break;
case6:
write_1602dat('S');//delay(5);
write_1602dat('T');//delay(5);
write_1602dat('A');
break;
case7:
write_1602dat('S');//delay(5);
write_1602dat('U');//delay(5);
write_1602dat('N');
break;
}
}
lcd_init()//液晶初始化函数
{wr=0;
write_1602com(0x38);//设置液晶工作模式
write_1602com(0x0c);//开显示不显示光标
write_1602com(0x06);//整屏不移动,指针加一
write_1602com(0x01);
write_1602com(yh+2);//字符写入的位置
for(a=0;a<14;a++)
{
write_1602dat(tab1[a]);
//delay(3);
}
write_1602com(er+4);
for(a=0;a<8;a++)
{
write_1602dat(tab2[a]);
//delay(3);
}
}
voidkeyscan()//按键扫描
{
key=0;
if(key1==0)//key1为功能键
{
delay(5);
if(key1==0)
{
while(!
key1);
key1n++;
if(key1n==9)
key1n=1;
switch(key1n)
{
case1:
TR0=0;//关闭定时器
//TR1=0;
write_1602com(er+0x0b);//写入光标位置
write_1602com(0x0f);//设置光标为闪烁
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);
break;
case2:
write_1602com(er+8);//fen
//write_1602com(0x0f);
break;
case3:
write_1602com(er+5);//shi
//write_1602com(0x0f);
break;
case4:
write_1602com(yh+0x0f);//week
//write_1602