资源描述
7
微机接口实验报告
姓 名:李 晋 林
班 级:191102-13
学 号:20101002007
指导老师:墙 威
实习时间:2012-12-30
题目:模拟汽车控制系统
一、设计目标
设计一个模拟汽车控制系统,使用接口芯片: …实现用简单逻辑电平控制车的档位(前进 1,前进 2 ,前进 3,后退),用步进电机的转速模拟车的速度(若步进电机不能用,也可以用流水灯的刷新方向和速度,或数码管显示的数值来模拟车的速度),用 A/D 转换器模拟车的油门大小。
二、设计所用仪器和器件
步进电机,A/D转换器,逻辑开关,导线。
三、设计内容
1.设计步进电机的顺时针和逆时针旋转:
2.使用A/D转换器转换模拟信号为数字信号.
3.设计电平开关控制输入,并将输入结果显示出来.
四、设计过程
1. 设计方案:
a.电平开关控制档位
根据用户拨动的逻辑电平,用I/O端口读出数值,来判断并决定小车的动作,后退档用步进电机逆时针旋转来模拟,前进挡用步进电机的顺时针旋转模拟,档位的控制用限制Sleep的时间乘以一定速率来实现。即用简单逻辑电平控制车的档位(前进 1,前进 2 ,前进 3,后退)。
unsigned short a= 0x0c860;//读写数据均用此端口号
int i;
while(1)
{
i = _inp(a);//读端口数据
_outp(a, i);//显示数据
if(i==128)
back(); //汽车倒档
else if(i==64)
move(4); //一档,参数表示休眠的时间所乘以的倍率
else if(i==32)
move(2); //二档
else if(i==16)
move(1); //三档
else
stop();
}
b.步进电机的转速模拟车的速度
具体根据限制CUP的Sleep即休眠时间,达到控制速度的效果。Sleep的时间越短,速度越快,Sleep的时间越长,速度越慢
。
步进电机顺时针旋转相序表的加电代码顺序:
05H 15H 14H 54H 50H 51H 41H 45H
步进电机顺时针旋转相序表的加电代码顺序:
45H 41H 51H 50H 54H 14H 15H 05H
即刚好与顺时针的顺序相反。
c.A/D 转换器转换的数值模拟车的油门大小
数值越高,Sleep的时间越短,速度越快。
unsigned short b=0x0c880;//AD转换端口号
int t;
_outp(b,1);
t=_inp(b);
Sleep(t);
开始
逻辑框图
显示数值
拨动电平开关
停
止
三
档
二
档
一
档
后
退
结束
程序流程图
Main()
a= 0x0c860;
i = _inp(a);
i=128
后退
一档
i=64
二档
i=32
i=16
停车
三档
结束
三档
三档
i=其他
2. 所设计系统的硬件连接图
用四根导线分别将步进电机的四个接口线分别连上A0,A2,A4,A6。
五、分析与讨论
实验结果:
拨动电平开关左边起第一个,步进电机逆时针旋转;拨动第二,第三,第四个开关,步进电机顺时针旋转,并且速度依次递增.同时,旋转A/D转换的旋钮,步进电机的速度增大或者减小.
结果分析:
实验结果与预期效果相符合,达到步进电机模拟小车系统的档位,油门的效果.
问题及解决方案:
实验过程中发现没有达到效果,可能的原因如下:
1. 实验台和电脑没有连上线
2. 实验台子时坏的,由于实验室设备已经使用时间过长,加之步进电机本身不允许长时间通电,有时可能由于操作时间过长或者操作不当,步进电机已经烧坏了.
3. 步进电机的四根导线没有连接好.
4. 由于电平开关只用到前面四个,所以其他开关需要调到闭合状态,否则会影响实验结果.
六.实验心得:
这次的实验被安排在2012年的最后几天,总体来说完成得很顺利,没有想象中那样可怕,因为前面的几次的上机课已经做过每个模块,这次的小车系统无非是将前几次的实验综合一下,形成一个完善的系统。以致于做实验去的时候倒腾了一上午就完成并验收了。
微机接口是软件硬件相结合的一门课程,实验设备也只有机房才有,所以实践起来的机会不是很多,但是真的很有意思,也容易激起学习的兴趣,这次实验更加深了我对本学期所学课本上的基本知识的认识和理解,同时也明白,理论和实践不是可以等同的。只有掌握了基本知识,实践起来才有思路,而实践就没有基本知识那么复杂,但是只有真正实践才体会到知识的运用。在实验过程中也遇到一定的问题,我们几个同学就一起讨论,研究,相互合作,锻炼了我们各方面的能力。
通过这次实验,更加理解了微机接口这门课程,同时更加深了学习它的兴趣,特别以硬件的角度去理解各种电子设备的工作原理,我相信对于以后的学习和工作将有很大帮助。
七.程序源代码:
#include "conio.h"
#include "stdio.h"
#include "windows.h"
void back(); //步进电机逆转,模拟小车倒退
void move(int j);//步进电机正转,模拟小车前进
void stop(); //空函数,小车停止
void main()
{
unsigned short a= 0x0c860;//读写数据均用此端口号
int i;
while(1)
{
i = _inp(a);//读端口数据
_outp(a, i);//显示数据
if(i==128)
back(); //汽车倒档
else if(i==64)
move(4); //一档
else if(i==32)
move(2); //二档
else if(i==16)
move(1); //三档
else
stop();
}
}
void back() //步进电机逆转,模拟小车倒退
{
unsigned short a=0x0c800;//步进电机PA口地址
unsigned short b=0x0c880;//AD转换端口号
int t;//存储A/D转换来的数字信号
_outp(a,0x05);
_outp(b,1);
t=_inp(b);
Sleep(t);
_outp(a,0x15);
t=_outp(b,1);
Sleep(t);
_outp(a,0x14);
t=_outp(b,1);
Sleep(t);
_outp(a,0x54);
t=_outp(b,1);
Sleep(t);
_outp(a,0x50);
t=_outp(b,1);
Sleep(t);
_outp(a,0x51);
t=_outp(b,1);
Sleep(t);
_outp(a,0x41);
t=_outp(b,1);
Sleep(t);
_outp(a,0x45);
t=_outp(b,1);
Sleep(t);
}
void move(int j)
{
unsigned short a=0x0c800;//步进电机端口
unsigned short b=0x0c880;//AD转换端口号
int t; //存储A/D转换来的数字信号
_outp(a,0x45);
_outp(b,1);
t=_inp(b);
Sleep(t*j);
_outp(a,0x41);
t=_outp(b,1);
Sleep(t*j);
_outp(a,0x51);
t=_outp(b,1);
Sleep(t*j);
_outp(a,0x50);
t=_outp(b,1);
Sleep(t*j);
_outp(a,0x54);
t=_outp(b,1);
Sleep(t*j);
_outp(a,0x14);
t=_outp(b,1);
Sleep(t*j);
_outp(a,0x15);
t=_outp(b,1);
Sleep(t*j);
_outp(a,0x05);
t=_outp(b,1);
Sleep(t*j);
}
void stop()
{
}
7
展开阅读全文