微机控制系统实习报告文档格式.docx
《微机控制系统实习报告文档格式.docx》由会员分享,可在线阅读,更多相关《微机控制系统实习报告文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
直流稳压电源工作流程为降压、整流(把交流电变直流电),输入滤波、三端稳压器稳压、输出滤波五部分。
220V的交流电从直流稳压电源插头经保险管送到变压器的初级线圈,并从次级线圈感应出经约9V的交流电压送到4个二极管。
二极管在电路中的符号有短线的一端称为它的负极(或阴极),有三角前进标志的一端称为它的正极(或阳极)。
基本作用是只允许电流从它的正极流向它的负极(即只能按三角标示的方向流动),而不允许从负极流向正极。
交流电的特点是方向和电压大小一直随时间变化,用通俗的话说,它的正负极是不固定的。
但是不管从变压器中出来的两根线中哪根电压高,电流都能而且只能由D3或D4流入右边的电路,由D1或D2流回去。
这样,从右边的电路来看,正极永远都是D3和D4连接的那一端,负极永远是D1和D2连接的那一端。
这便是二极管整流的原理。
二极管把直流稳压电源交流电方向变化的问题解决了,但是它的电压大小还在变化。
而电容器有可以存储电能的特性,正好可以用来解决这个问题。
在电压较高时向电容器中充电,电压较低时便由电容器向电路供电。
这个过程叫作滤波。
图中的C1便是用来完成这个工作的。
经过C1滤波后的比较稳定的直流电送到三端稳压集成电路LM317T的Vin端(3脚)。
LM317T是一种这样的器件:
由Vin端给它提供工作电压以后,它便可以保持其+Vout端(2脚)比其ADJ端(1脚)的电压高1.25V。
因此,我们只需要用极小的电流来调整ADJ端的电压,便可在+Vout端得到比较大的电流输出,并且电压比ADJ端高出恒定的1.25V。
我们还可以通过调整PR1的抽头位置来改变输出电压-反正LM317T会保证接入ADJ端和+Vout端的那部分电阻上的电压为1.25V。
所以当抽头向上滑动时,直流稳压电源输出电压将会升高。
2.1.3控制模块
STC89C52有40引脚,双列直插(DIP)封装,所用引脚功能如下:
1.VCC——运行时加+4.5V
2.GND——接地
3.XTAL1——振荡器反相放大器及内部时钟发生器的输入端
4.XTAL2——振荡器反相放大器的输出端
5.RST——复位输入,高电平有效,在晶振工作时,在RST引脚上作用2个机器周期以上的高电平,将使单片机复位。
WDT溢出将使该引脚输出高电平,设置SFTAUXR的DISRTO位(地址8EH)可打开或关闭该功能。
DISRTO位缺省为RESET输出高电平打开状态。
6.EA/VPP——片外程序存储器访问允许信号。
欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地),如果EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。
7.
a.晶振电路
b.复位电路
以上三部分构成了单片机最小系统,其中P0和P2口的部分管脚接显示模块,P3口接控制模块。
2.1.4显示模块
1602LCD主要技术参数:
显示容量:
16×
2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
引脚功能说明:
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下表1所示:
表1:
引脚接口说明表
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
3
VL
液晶显示偏压
11
D4
4
RS
数据/命令选择
12
D5
5
R/W
读/写选择
13
D6
6
E
使能信号
14
D7
7
D0
15
BLA
背光源正极
8
D1
16
BLK
背光源负极
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
硬件连接原理图如下:
2.1.5按键电路
“功能”按键(按此键,选择要设置的变量);
“增”按键(设置中对所选择变量加一);
“减”按键(设置中对所选择变量减一)。
2.1.6报时部分模块
整点时,发光二极管亮,喇叭响。
2.2软件设计
2.2.1基本资源的使用
本次实验采用了STC89C52型单片机,1602LCD液晶显示屏,蜂鸣器、发光二极管。
为了实现时分秒显示,报时,时分秒设置功能,用到了单片机的外部中断,计时器中断,及I/O端口。
2.2.2程序设计的基本思路
主程序循环显示当前的时间并扫描“功能”按键对应P3.1是否有按下;
“加”按键对应INT0中断用来设置日期和时间,每按下一次可分别对年、月、日、时、分、秒进行加1设置,“减”按键对应INT1中断用来设置日期和时间,每按下一次可分别对年、月、日、时、分、秒进行减1设置。
3仿真与调试结果
本实验采用Keil4和Protues7联合仿真调试:
显示时间:
设置日期:
仿真结果:
经过多次的反复测试与分析,掌握了硬件的设计与分析的能力,对所学的知识得到很大的提高与巩固。
最终实现功能:
(1)能显示阳历年、月、日、星期、小时、分、秒
(2)显示模块采用LCD液晶显示,要求能用按键调整日期、时间。
(3)能进行声光整点报时。
4心得体会
我们在这一次电子时钟的设计过程中,很是受益匪浅。
通过对在大学三年多里所学的知识的回顾,特别是对所学知识——单片机的应用,并充分发挥对所学知识的理解及书面表达能力,最终完成了。
这为今后进一步深化学习,积累了一定宝贵的经验。
撰写报告的过程也是专业知识的学习过程,它使我们运用已有的专业基础知识,对其进行设计,分析和解决一个理论问题或实际问题,把知识转化为能力的实际训练。
培养了我运用所学知识解决实际问题的能力。
通过这次实习的设计我们发现,只有理论水平提高了;
才能够将课本知识与实践相整合,理论知识服务于教学实践,以增强自己的动手能力。
这个实习十分有意义我们获得很深刻的经验。
通过这次实习,我们知道了理论和实际的距离,也知道了理论和实际相结合的重要性,也从中得知了很多书本上无法得知的知识。
我们的学习不但要立足于书本,以解决理论和实际教学中的实际问题为目的,还要以实践相结合,理论问题即实践课题,解决问题即课程研究,学生自己就是一个专家,通过自己的手来解决问题比用脑子解决问题更加深刻。
学习就应该采取理论与实践结合的方式,理论的问题,也就是实践性的课题。
这种做法既有助于完成理论知识的巩固,又有助于带动实践,解决实际问题,加强我们的动手能力和解决问题的能力。
通过我们小组成员的通力合作,各展己长,分工合作,最终顺利完成了本次实习的任务,并且达到了任务要求。
附录
附录1原件清单
附录2硬件电路原理图
电源部分
时钟部分
附录3仿真电路图
附录4作品实物图
附录5程序清单
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
Ucharcodetable[]="
2010-12-31FRI"
;
ucharcodetable1[]="
06:
59:
55"
//要显示的字符
ucharcodetable2[]={'
M'
'
O'
N'
T'
U'
E'
W'
D'
H'
F'
R'
I'
S'
A'
};
voidkeyscan();
bitbell=0;
charbnum=0;
sbitRS=P0^5;
sbitRW=P0^6;
sbitE=P0^7;
sbitcm=P3^0;
sbitk1=P3^1;
sbitk2=P3^2;
sbitk3=P3^3;
sbitk4=P3^4;
sbitDQ=P3^7;
//speaker
chari=0,t=12,knum=0,p,q;
charsec=55,min=59,hour=6,day=31,days=31,mon=12,year=10;
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voidwrite_com(ucharcom)//写命令函数
RS=0;
RW=0;
P2=com;
E=1;
//高脉冲
delay(5);
E=0;
voidwrite_dat(uchardat)//写数据函数
RS=1;
P2=dat;
voiddisplay(uchar*p)//1602显示
while(*p!
='
\0'
)
{
write_dat(*p);
p++;
delay(5);
}
voidinit()//1602初始化
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x01);
//赋初值
display(table);
write_com(0x80+0x40+0x03);
display(table1);
voiddisdate(ucharadr,ucharb)
ucharc,d;
write_com(0x80+adr);
c=b/10+0x30;
d=b%10+0x30;
write_dat(c);
write_dat(d);
/*********************************主函数*********************************/
voidmain()
DQ=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
init();
while
(1)
{
keyscan();
voidtimer0()interrupt1
i++;
if(i==20)
i=0;
sec++;
if(bell==1)
{
if(bnum==hour*2)
{
bell=0;
bnum=0;
DQ=0;
}
else
DQ=~DQ;
bnum++;
}
if(sec==60)
sec=0;
min++;
if(min==60)
min=0;
hour++;
if((hour>
=7)&
&
(hour<
=23))bell=1;
if(hour==24)
{
hour=0;
day++;
p=(2000+year)%4;
q=(2000+year)%400;
switch(mon)
{
case(4||6||9||11):
days=31;
break;
case2:
if((p=0)&
(q!
=0))days=30;
elsedays=29;
default:
days=32;
}
if(day==days)
day=1;
mon++;
if(mon==13)
{
mon=1;
year++;
disdate(0x03,year);
}
disdate(0x06,mon);
disdate(0x09,day);
t+=3;
if(t==21)t=0;
write_com(0x80+0x0d);
write_dat(table2[t]);
write_dat(table2[t+1]);
write_dat(table2[t+2]);
}
disdate(0x43,hour);
disdate(0x46,min);
disdate(0x49,sec);
}
/********************************按键检测*********************************/
voidkeyscan()
cm=0;
if(k1==0)
if(k1==0)
{
knum++;
while(!
k1);
switch(knum)
case1:
TR0=0;
write_com(0x80+0x04);
write_com(0x0f);
case2:
write_com(0x80+0x07);
case3:
write_com(0x80+0x0a);
case4:
write_com(0x80+0x40+0x04);
case5:
write_com(0x80+0x40+0x07);
case6:
write_com(0x80+0x40+0x0a);
case7:
write_com(0x80+0x0f);
default:
knum=0;
write_com(0x0c);
TR0=1;
if(knum!
=0)
if(k2==0)
delay(5);
if(k2==0)
while(!
k2);
if(knum==1)
year++;
if(year==99)year=0;
disdate(0x03,year);
write_com(0x80+0x04);
if(knum==2)
if(mon==13)mon=1;
write_com(0x80+0x07);
if(knum==3)
day++;
if(day==32)day=1;
disdate(0x09,day);
write_com(0x80+0x0a);
if(knum==4)
hour++;
if(hour==24)hour=0;
disdate(0x43,hour);
write_com(0x80+0x40+0x04);
if(knum==5)
min++;
if(min==60)min=0;
disdate(0x46,min);
write_com(0x80+0x40+0x07);
if(knum==6)
sec++;
if(sec==60)sec=0;
disdate(0x49,sec);
write_com(0x80+0x40+0x0a);
if(knum==7)
t+=3;
write_com(0x80+0x0d);
write_dat(table2[t]);
write_dat(table2[t+1]);
write_dat(table2[t+2]);
write_com(0x80+0x40f);
if(k3==0)
delay(5);
if(k3==0)
while(!
k3);
if(knum==1)
year--;
if(year==-1)year=99;
disdate(0x03,year);
write_com(0x80+0x04);
if(knum==2)
mon--;
if(mon==0)mon=12;
disdate(0x06,mon);
write_com(0x80+0x07);
if(knum==3)
day--;
if(day==0)day=31;
write_com(0x80+0x0a);
if(knum==4)
hour--;
if(hour==-1)hour=23;
disdate(0x43,hour);
write_com(0x80+0x40+0x04);
if(knum==5)
min--;
if(min==-1)min=59;
disdate(0x46,min);
write_com(0x80+0x40+0x07);
if(knum==6)
sec--;
if(sec==-1)sec=59;
disdate(0x49,sec);
write_com(0x80+0x40+0x0a);
if(knum==7)
t-=3;
if(t==-3)t=18;
write_com(0x80+0x40f);
}