⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 汽车模拟.cpp

📁 微型计算机接口技术及应用和C++的结合。内容是汽车的微程序控制。
💻 CPP
字号:
#include<iostream>
#include <windows.h>
using namespace std;

#define PORT_8255_A 0Xc800
#define PORT_8255_B 0Xc801
#define PORT_8255_C 0Xc802
#define PORT_8255_CONSOLE 0Xc803
#define PORT_ADC0809 0Xc880
#define PORT_LED 0Xc860
#define TRUE 1
#define FALSE 0
#define ERROR -1
#define NONE_SW 0

typedef int BOOL;


void DelayTime(int n)
{
	int i,j;
	for(i=0;i<n;++i)
		for(j=0;j<n;++j);
}

//得到旋钮的值
char GetKnobValue(void)
{
	unsigned char value;
	_asm
	{
		mov dx,PORT_ADC0809
		mov ax,0X80
		out dx,ax
		in al,dx
		mov value,al
	}
	return value;
}

//初始化8255
void Init8255(unsigned char value)
{
	_asm
	{
		mov dx,PORT_8255_CONSOLE
		mov al,value
		out dx,al
	}
}

//改变步进电机的相位,需要初始化8255
void ControlMoto(int pos)
{
	_asm mov dx,PORT_8255_A
	switch(pos)
	{
	case 0://A口
		_asm mov al,0001B
		break;
	case 1://AB口
		_asm mov al,0011B
		break;
	case 2://B口
		_asm mov al,0010B
		break;
	case 3://BC口
		_asm mov al,0110B
		break;
	case 4://C口
		_asm mov al,0100B
		break;
	case 5://CD口
		_asm mov al,1100B
		break;
	case 6://D口
		_asm mov al,1000B
		break;
	case 7://DA口
		_asm mov al,1001B
		break;
	default:
		break;
	}
	_asm out dx,al
}

//判断旋钮是否转动,还需要初始化8255
BOOL IsKnobCanRead()
{
	unsigned char n;
	_asm
	{
		mov dx,PORT_8255_B
		in al,dx
		and al,10000000B
		mov n,al
	}
	if(n==128)return TRUE;
	else return FALSE;
}

//读取档位的数据,处理多个档位在上的情况
int ReadSWNum(void)
{
	unsigned char value;
	_asm
	{
		mov dx,PORT_LED
		in al,dx
		mov value,al
	}
	switch(value)
	{
	case 0:return NONE_SW;
	case 1:return 1;
	case 2:return 2;
	case 4:return 3;
	case 8:return 4;
	case 16:return 5;
	case 32:return 6;
	case 64:return 7;
	case 128:return 8;
	default:return ERROR;
	}
}

//电灯
void SetLight(unsigned char value)
{
	_asm
	{
		mov dx,PORT_LED
		mov al,value
		out dx,al
	}
}

//调节速度,返还延时
int SetRate(int SW_val,unsigned char knob_val)
{
	while(IsKnobCanRead()==FALSE);
	//int knob_val=static_cast<int>(GetKnobValue());
	//int SW_val=ReadSWNum();

	//计算延时,还可以再修改
	int dely_time;
	switch(SW_val)
	{
	case 0:dely_time=2500;break;
	case 1:dely_time=1800;break;
	case 2:dely_time=1200;break;
	case 3:dely_time=800;break;
	}
	dely_time = static_cast<int>(dely_time*(1+(255-knob_val)/255.0));
	return dely_time;
}

int main()
{
	cout<<"开始汽车模拟\n";

	int dely_time=0;
	int tag_time=0;

	Init8255(130);//初始化8255
	unsigned char light_backward=240;
	unsigned char light_highspeed=0;
	while(true)
	{
		int SW_val = ReadSWNum();//档位的值
		unsigned char knob_val = GetKnobValue();//旋钮的值
		if(SW_val!=5)
		{    
			system("cls");
			printf("\n现在是第%d档位",SW_val);
			//正常的档位
			if(SW_val==NONE_SW || SW_val==1 || SW_val==2 || SW_val==3)
			{
			    /*system("cls");
				/*printf("现在是第%d档位,SW_val\n");*/
				dely_time=SetRate(SW_val,knob_val);
				for(int i=0;i<8;++i)
				{
					DelayTime(dely_time);
					ControlMoto(i);
				}
			}
			//倒车,全亮全暗
			else if(SW_val==4)
			{   
				system("cls");
				printf("倒车\n");
				dely_time=SetRate(0,knob_val);
				for(int i=7;i>=0;--i)
				{
					DelayTime(dely_time);
					ControlMoto(i);
				}
				SetLight(light_backward);
				light_backward=~light_backward;
			}
			else if(SW_val==ERROR)
			{
				for(int i=0;i<8;++i)
				{
					DelayTime(dely_time);
					ControlMoto(i);
				}
			}
			//是否超速,4亮4暗
			if(dely_time<1080)
			{
				if(tag_time==0)
				{
					system("cls");
					printf("现在超速,请减速\n");
					SetLight(light_highspeed);
					light_highspeed=~light_highspeed;
				}
			}
			++tag_time;
			if(tag_time==1)tag_time=0;
			
		}
		
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -