微机接口课设——设计一个模拟汽车控制系统

编程入门 行业动态 更新时间:2024-10-06 01:42:10

<a href=https://www.elefans.com/category/jswz/34/1760491.html style=微机接口课设——设计一个模拟汽车控制系统"/>

微机接口课设——设计一个模拟汽车控制系统

利用Proteus做了一个简单的汽车控制系统,有1~3档、倒档和刹车,主要是通过一个并行接口来控制,其中A口来作为档位的输入,B口用来作为输出控制电动机的转动,另外C口也作为输出控制数码管,用来显示当前的档位。用一个AD0809作为转换器模拟油门大小,用八个LED显示油门大小。在另外添加转向灯和后车灯,打开转向灯开关,转向灯开始闪烁,选择倒档,后车灯开始闪烁,闪烁的脉冲信号通过一个8253定时器来实现,输入100HZ脉冲,输出1HZ脉冲。

总体电路图:


细节图:


代码:

#define IOCON	9006H//16位数据总线,高8位用来传送地址信号,低8位用来传输数据
#define IOA     9000H
#define IOB     9002H
#define IOC     9004H
#define AD0809	0E002H
#define OUT373  8000H
#define TCONTRO   0A006H
#define TCON0     0A000Hunsigned char table1[8]={0x22,0x26,0x24,0x2c,0x28,0x29,0x21,0x23};//两个数组元素高位不同跟控制后车灯有关
unsigned char table2[8]={0x03,0x01,0x09,0x08,0x0c,0x04,0x06,0x02};void outp(unsigned int addr, char data)
// Write a byte to the specified I/O port 向接口写入数据{ __asm{ mov dx, addrmov al, dataout dx, al}}char inp(unsigned int addr)
// Read a byte from the specified I/O port 从接口读出数据{ char result;__asm{ mov dx, addrin al, dxmov result, al}return result;}
void delay(int i)
{while(i--){};
}
void main(void)
{unsigned char i,tmp,in,v,temp;//初始化8253计数器工作命令outp(TCONTRO,0x16);//计数器0,只写计算值低8位,方式3,二进制计数outp(TCON0,100);//输入100HZ,输出1HZ//初始化并行接口工作命令outp(IOCON,0x90);//A口作为输入B、C口作为输出outp(IOB,0x20);//初始化PB4口为高电压,防止后车灯闪烁temp=0;//记录AD转换器输出的结果i=0;//记录从A口读入的数据while(1){i=inp(IOA);//从A口读入数据if(i==0xfe){//1档v=70;while(1){//初始化AD0809工作命令outp(AD0809,0);in=inp(AD0809);outp(OUT373,in);temp=~in;//取反temp=temp/0x14;//等比例缩小到一定范围防止大于V,产生负数for(tmp=0;tmp<8;tmp++){outp(IOB,table1[tmp]);//向B口写数据 控制步进电机outp(IOC,0xf9);//向C口写数据 控制数码管i=inp(IOA);//再次读A口数据,即监听是否按下其他档位if(i==0xfd||i==0xf7||i==0xfb||i==0xef)break;delay(v-temp);//延时}if(i==0xfd||i==0xf7||i==0xfb||i==0xef)break;}}if(i==0xfd){//2档v=50;while(1){outp(AD0809,0);in=inp(AD0809);outp(OUT373,in);temp=~in;temp=temp/0x14;for(tmp=0;tmp<8;tmp++){outp(IOB,table1[tmp]);outp(IOC,0xa4);i=inp(IOA);if(i==0xfe||i==0xf7||i==0xfb||i==0xef)break;delay(v-temp);}if(i==0xfe||i==0xf7||i==0xfb||i==0xef)break;}}if(i==0xfb){//3档v=30;while(1){outp(AD0809,0);in=inp(AD0809);outp(OUT373,in);temp=~in;temp=temp/0x14;for(tmp=0;tmp<8;tmp++){outp(IOB,table1[tmp]);outp(IOC,0xb0);i=inp(IOA);if(i==0xfe||i==0xf7||i==0xfd||i==0xef)break;delay(v-temp);}if(i==0xfe||i==0xf7||i==0xfd||i==0xef)break;}}if(i==0xf7)//倒车while(1){for(tmp=0;tmp<8;tmp++){outp(IOB,table2[tmp]);outp(IOC,0x08);i=inp(IOA);if(i==0xfe||i==0xfb||i==0xfd||i==0xef)break;delay(80);}if(i==0xfe||i==0xfb||i==0xfd||i==0xef)break;}if(i==0xef){//刹车outp(IOB,0x30);outp(IOC,0x92);}}
}

注意:总线要标号已确定是否为高8位或低8位。AD0809转换电路输出的数据可能会不符合要求需要进行一些技巧转换。

另附:PNP与NPN作为开关的使用方法点击打开链接

附件:点击打开链接

Proteus:点击打开链接

更多推荐

微机接口课设——设计一个模拟汽车控制系统

本文发布于:2024-02-28 10:10:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1769287.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:微机   控制系统   接口   汽车

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!