微机接口课设——设计一个模拟汽车控制系统
2016-01-07 15:44
811 查看
利用Proteus做了一个简单的汽车控制系统,有1~3档、倒档和刹车,主要是通过一个并行接口来控制,其中A口来作为档位的输入,B口用来作为输出控制电动机的转动,另外C口也作为输出控制数码管,用来显示当前的档位。用一个AD0809作为转换器模拟油门大小,用八个LED显示油门大小。在另外添加转向灯和后车灯,打开转向灯开关,转向灯开始闪烁,选择倒档,后车灯开始闪烁,闪烁的脉冲信号通过一个8253定时器来实现,输入100HZ脉冲,输出1HZ脉冲。
总体电路图:
细节图:
代码:
注意:总线要标号已确定是否为高8位或低8位。AD0809转换电路输出的数据可能会不符合要求需要进行一些技巧转换。
另附:PNP与NPN作为开关的使用方法点击打开链接
附件:点击打开链接
Proteus:点击打开链接
总体电路图:
细节图:
代码:
#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 0A000H unsigned 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, addr mov al, data out dx, al } } char inp(unsigned int addr) // Read a byte from the specified I/O port 从接口读出数据 { char result; __asm { mov dx, addr in al, dx mov 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:点击打开链接
相关文章推荐
- 面程序的功能是将一个4×4的数组进行逆时针旋转90度后输出,要求原始数组的数据随机输入,原新数组以4行4列的方式输出
- 配置域主DNS服务器
- 常用的JavaScript验证正则表达式归总
- Windows下搭建Git开发环境
- leetcode第17题 17. Letter Combinations of a Phone Number
- JVM底层又是如何实现synchronized的
- ORA-1157, ORA-1110的错误解决方法
- 文章标题
- Linq的学习
- JOSN数据解析
- 设计之路-设计工具(powerDesigner)
- 工作中需要做一个根据音频动态绘制能量柱的功能,(非原创-有改动-增加倒影效果)废话补多少,看效果-有美女-详细注释
- [转]Try Cloud Messaging for Android
- 使用Apache Benchmark给自己的网站进行测试
- mysql索引总结
- puppet 使用
- centos+openresty+mariaDB+php搭建web服务器
- Mapper XML文件
- 挂盐水
- SQL Server时间粒度系列----第2节日期、周时间粒度详解