机电一体化报告36最终修正版Word下载.docx
《机电一体化报告36最终修正版Word下载.docx》由会员分享,可在线阅读,更多相关《机电一体化报告36最终修正版Word下载.docx(25页珍藏版)》请在冰点文库上搜索。
AT89C52为8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
3.2、驱动IC(M54544AL)
该M54544AL是驱动一个smallsize双向电机IC在正向和反向旋转.当两个输入1和2被设置为低电平,输出1和2设置为“关”.当输入1设置为高级别和输入2设置为低水平,输出1设置为高级别和输出2设置为低级别(向前旋转状态).当输入1设置为低级别和输入2设置为高级别,输出1设置为低级别的设置和输出2高层(反向旋转).当两个输入1和2设置为高层次,两个输出1和2设置为低级(制动状态).电源(VCC)控制电路和电源(VCC输出'
)是独立提供.旋转速度因此,该电机可以改变使用VCC和VCC'
作为不同的电源和靠发出VCCorVCC'
变量.
3.3、电路图:
图3.1
3.4、工作原理:
当处于调整状态时,调整的项会闪现,以便识别。
为此,设置三个调整按键,一个为“状态键”,一个为“加法键”,一个为“减法键”。
AT89C52P0口是一组8位漏极开路型双向1/O口,也即地址/数据总线复用口。
作为输出口用时.每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用,在FLASH由编程时,P0口接收指令字节,所以将三个调整按键分别接在P0.0、P0.1、P0.2,P2口是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑电路。
对端口P2写“l"
,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流,因此将8位LED灯接在P2口上,但输入一个低电平时LED灯亮。
RST:
复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位,所以在RST接口上接一个复位电路,确保整个电路稳定可靠的工作。
(如下图3.2)
图3.2
AT89C52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或陶瓷诺振器一起构成自激振荡器(电路如图3.3)
图3.3
M54544AL是具有H桥集成功能的IC,IN1和IN2分别接P3.7(外部数据存储器读选通)和P3.6(外部数据存储器写选通)口,out1和out2接电机,驱动电机正反转。
(电路如图3.4)
图3.4
四、控制系统
4.1、控制方法
(基于单片机的控制)
4.2、摇棒的启动
为了使摇棒从静止状态过度到正常运行状态,在正式显示前加一启动程序。
其实质就是逐渐加快驱动的频率,一直到摇棒正常摆动为止。
通过下面的代码实现
do{
mm++;
Delay(120+mm);
put1=~put1;
put2=~put2;
}while(mm<
60);
Delay(20);
//根据实际情况确定延时值
4.3、秒闪现的实现
数字或字符的闪现是通过变量Ms和数组w[]实现的,如需要八位字符中的间的第4位闪现,则w[3]=1。
这是通过全局变量Ms在voidtimer0(void)函数中每隔一秒改变一次状态(0或1),打开或关闭显示。
if(Ms*w[ii-3]==1)P2=0xff;
elseP2=~ASCIIDOC[v[ii]*6+jj];
//正向显示
if(Ms*w[10-ii]==1)P2=0xff;
elseP2=~ASCIIDOC[v[13-ii]*6+5-jj];
//反向显示
4.4、矫正不均匀显示
考虑到显示屏上的字符并不是一样宽的,仔细分析是由于摇棒在运动中,一直受力,而且所受的力是随时变化的。
为方便精确调整显示,特别作了一个显示中断表Tr[],改变显示LED的时间段,协调显示效果。
4.5、按键去抖程序
按键的去抖采用软件编程实现,其方法是当检测到按键的接口出现低电平后,隔一段时间再检测,如还是低电平,则确认为有效,否则无效。
具体的程序是通过函数unsignedcharChKey(bitKey)完成的。
4.6、显示同步
因没有位置传感器,显示同步完全靠时钟中断来确定。
这样就有一个问题,音圈电机的驱动信号在什么时刻改变,显示才能保持在中间,并能保证正反显示能很好地重合。
经过查资料,音圈电机的驱动信号在显示中部,要根据具体情况细调。
由程序中的变量Ta调试确定。
4.7、流程图(如图4.2)
4.8、程序流程图(如图4.3)
4.9、程序清单
POV摇摆显示LED钟程序:
#include<
reg52.h>
/*硬件端口定义*/
sbitset0=P0^1;
sbitset1=P0^0;
sbitset2=P0^2;
sbitput1=P3^6;
sbitput2=P3^7;
/*时钟用数组*/
unsignedcharBUFFER[]={0,0,0,0};
unsignedcharmaxnum[]={59,23};
/*显示数组*/
unsignedintv[14];
unsignedintw[8];
/*显示中断表*/
intcodeTr[]={
2000,2000,2000,2000,2000,2000,
2550,2500,2450,2400,2350,2300,
2250,2200,2150,2100,2050,2000,
1950,1900,1850,1800,1750,1700,
1650,1600,1550,1500,1450,1400,
1400,1450,1500,1550,1600,1650,
1700,1750,1800,1850,1900,1950,
2000,2050,2100,2150,2200,2250,
2300,2350,2400,2450,2500,2550,
};
/*字符字模*/
unsignedcharcodeASCIIDOC[]=//ASCII
{
0x7C,0x8A,0x92,0xA2,0x7C,0x00,//-0-00
0x00,0x42,0xFE,0x02,0x00,0x00,//-1-01
0x46,0x8A,0x92,0x92,0x62,0x00,//-2-02
0x84,0x82,0x92,0xB2,0xCC,0x00,//-3-03
0x18,0x28,0x48,0xFE,0x08,0x00,//-4-04
0xE4,0xA2,0xA2,0xA2,0x9C,0x00,//-5-05
0x3C,0x52,0x92,0x92,0x8C,0x00,//-6-06
0x80,0x8E,0x90,0xA0,0xC0,0x00,//-7-07
0x6C,0x92,0x92,0x92,0x6C,0x00,//-8-08
0x62,0x92,0x92,0x94,0x78,0x00,//-9-09
0x00,0x00,0x00,0x00,0x00,0x00,//--10
0x00,0x00,0xFA,0x00,0x00,0x00,//-!
-11
0x04,0x08,0x10,0x20,0x40,0x00,//-/-12
0x00,0x6C,0x6C,0x00,0x00,0x00,//-:
-13
0x3E,0x48,0x88,0x48,0x3E,0x00,//-A-14
0xFE,0x92,0x92,0x92,0x6C,0x00,//-B-15
0x7C,0x82,0x82,0x82,0x44,0x00,//-C-16
0xFE,0x82,0x82,0x82,0x7C,0x00,//-D-17
0xFE,0x92,0x92,0x92,0x82,0x00,//-E-18
0xFE,0x90,0x90,0x90,0x80,0x00,//-F-19
0x7C,0x82,0x8A,0x8A,0x4E,0x00,//-G-20
0xFE,0x10,0x10,0x10,0xFE,0x00,//-H-21
0x00,0x82,0xFE,0x82,0x00,0x00,//-I-22
0x04,0x02,0x82,0xFC,0x80,0x00,//-J-23
0xFE,0x10,0x28,0x44,0x82,0x00,//-K-24
0xFE,0x02,0x02,0x02,0x02,0x00,//-L-25
0xFE,0x40,0x30,0x40,0xFE,0x00,//-M-26
0xFE,0x20,0x10,0x08,0xFE,0x00,//-N-27
0x7C,0x82,0x82,0x82,0x7C,0x00,//-O-28
0xFE,0x90,0x90,0x90,0x60,0x00,//-P-29
0x7C,0x82,0x8A,0x84,0x7A,0x00,//-Q-30
0xFE,0x90,0x98,0x94,0x62,0x00,//-R-31
0x64,0x92,0x92,0x92,0x4C,0x00,//-S-32
0x80,0x80,0xFE,0x80,0x80,0x00,//-T-33
0xFC,0x02,0x02,0x02,0xFC,0x00,//-U-34
0xF8,0x04,0x02,0x04,0xF8,0x00,//-V-35
0xFE,0x04,0x18,0x04,0xFE,0x00,//-W-36
0xC6,0x28,0x10,0x28,0xC6,0x00,//-X-37
0xC0,0x20,0x1E,0x20,0xC0,0x00,//-Y-38
0x86,0x8A,0x92,0xA2,0xC2,0x00,//-Z-39
0x24,0x2A,0x2A,0x1C,0x02,0x00,//-a-40
0xFE,0x14,0x22,0x22,0x1C,0x00,//-b-41
0x1C,0x22,0x22,0x22,0x10,0x00,//-c-42
0x1C,0x22,0x22,0x14,0xFE,0x00,//-d-43
0x1C,0x2A,0x2A,0x2A,0x10,0x00,//-e-44
0x10,0x7E,0x90,0x90,0x40,0x00,//-f-45
0x19,0x25,0x25,0x25,0x1E,0x00,//-g-46
0xFE,0x10,0x20,0x20,0x1E,0x00,//-h-47
0x00,0x00,0x9E,0x00,0x00,0x00,//-i-48
0x00,0x01,0x11,0x9E,0x00,0x00,//-j-49
0xFE,0x08,0x14,0x22,0x02,0x00,//-k-50
0x00,0x82,0xFE,0x02,0x00,0x00,//-l-51
0x1E,0x20,0x1E,0x20,0x1E,0x00,//-m-52
0x20,0x1E,0x20,0x20,0x1E,0x00,//-n-53
0x1C,0x22,0x22,0x22,0x1C,0x00,//-o-54
0x3F,0x24,0x24,0x24,0x18,0x00,//-p-55
0x18,0x24,0x24,0x24,0x3F,0x00,//-q-56
0x20,0x1E,0x20,0x20,0x10,0x00,//-r-57
0x12,0x2A,0x2A,0x2A,0x24,0x00,//-s-58
0x20,0xFC,0x22,0x22,0x24,0x00,//-t-59
0x3C,0x02,0x02,0x3C,0x02,0x00,//-u-60
0x38,0x04,0x02,0x04,0x38,0x00,//-v-61
0x3C,0x02,0x3C,0x02,0x3C,0x00,//-w-62
0x22,0x14,0x08,0x14,0x22,0x00,//-x-63
0x39,0x05,0x05,0x09,0x3E,0x00,//-y-64
0x22,0x26,0x2A,0x32,0x22,0x00,//-z-65
unsignedintTi;
unsignedcharii,jj,mm,ff,TZ,Ms,Ta;
/*延时程序*/
voidDelay(unsignedintmsec)
unsignedintx,y;
for(x=0;
x<
=msec;
x++)
for(y=0;
y<
=110;
y++);
}
/*键盘去抖处理函数*/
unsignedcharChKey(bitKey)
if(Key==0){
Delay(100);
if(Key==0)return
(1);
/*定时中断1处理(时钟)函数*/
voidtimer0(void)interrupt1using1
TH0=-(50000/256);
TL0=-(50000%256);
TR0=1;
BUFFER[0]=BUFFER[0]+1;
/*定时中断2处理(LED驱动和音圈驱动)函数*/
voidtimer1(void)interrupt3using1
TH1=Ti/256;
TL1=Ti%256;
if((ii*6+jj)==Ta)
put2=~put2;
//音圈电机驱动输出
if(ff==1)
else
P2=~ASCIIDOC[v[ii]*6+jj];
else{
jj++;
if(jj>
5){ii++;
jj=0;
if(ii>
13){ii=0;
ff=!
ff;
Ti=-Tr[ii*6+jj];
//读显示中断表
/*主程序*/
voidmain(void)
//变量初始化
Ms=0;
ff=0;
Ta=46;
//正反显一致性调整,取值范围在42~50之间,根据实际确定
put1=0;
put2=1;
//中断初始化
TMOD=0x11;
TH0=-5000/256;
TL0=-5000%256;
ET0=1;
TH1=-2000/256;
TL1=-2000%256;
TR1=1;
ET1=1;
//十四个字符中前三个和后三个不显(不用)
v[0]=10;
v[1]=10;
v[2]=10;
v[11]=10;
v[12]=10;
v[13]=10;
/*摇摆棒初始启动*/
Do
{
while(mm<
/*启动显示*/
ii=0;
jj=0;
EA=1;
/*正式运行*/
for(;
;
)
v[3]=36;
v[4]=44;
v[5]=51;
v[6]=42;
v[7]=54;
v[8]=52;
v[9]=44;
v[10]=11;
//显示欢迎
Delay(6000);
v[3]=10;
v[4]=10;
v[5]=10;
v[6]=10;
v[7]=10;
v[8]=10;
v[9]=10;
v[10]=10;
//关闭显示
Delay(600);
v[3]=0;
v[4]=0;
v[5]=13;
v[6]=0;
v[7]=0;
v[8]=13;
v[9]=0;
v[10]=0;
//显示时钟初始状态
/*进入时钟状态*/
while
(1)
//时钟处理
if(BUFFER[0]>
21)//进位到秒
{
BUFFER[0]=0;
BUFFER[1]=BUFFER[1]+1;
Ms=!
Ms;
if(BUFFER[1]==60)//进位到分
BUFFER[1]=0;
BUFFER[2]=BUFFER[2]+1;
if(BUFFER[2]==60)
BUFFER[2]=0;
BUFFER[3]=BUFFER[3]+1;
//进位到时
if(BUFFER[3]==24)
BUFFER[3]=0;
//将显示内容送显示缓冲区
v[9]=BUFFER[1]/10;
v[10]=BUFFER[1]-v[9]*10;
v[6]=BUFFER[2]/10;
v[7]=BUFFER[2]-v[6]*10;
v[3]=BUFFER[3]/10;
v[4]=BUFFER[3]-v[3]*10;
//键盘处理
if(ChKey(set0)==1)//模式键
Ms=1;
//秒闪开
if(TZ<
2)TZ++;
TZ=0;
//三种状态循环转换
switch(TZ)
case0:
w[0]=0;
w[1]=0;
w[2]=0;
w[3]=0;
w[4]=0;
w[5]=0;
w[6]=0;
w[7]=0;
break;
case1:
w[3]=1;
w[4]=1;
case2:
w[0]=1;
w[1]=1;
//秒闪关
Delay(80);
if(ChKey(set1)==1)
if(BUFFER[TZ+1]<
maxnum[TZ-1])
BUFFER[TZ+1]++;
BUFFER[TZ+1]=0;
Delay(300);
//键盘"
+"
if(ChKey(set2)==1)
if(BUFFER[TZ+1]>
0)BUFFER[TZ+1]--;
BUFFER[TZ+1]=maxnum[TZ-1];
-"
五、结语
通过这次课程设计懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来。
很多东西靠理论是行不通,实践起来才知道没那么简单。
由于对proteus,proe,单片机的了解不太深,所以对操作起来有点吃力,特别对于编程,有很多东西都不懂。
作为刚入门的单片机学者,所以弄得比较简单点!
建议这个摇摆LED时钟还可以加入位置传感器,让显示更加稳定。
还有可以加入遥控功能实现更好的控制。