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

📄 51

📁 51单片机应用系统典型模块开发大全
💻
字号:
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint  unsigned int
#define Count0 XBYTE[0x1fff]					//8254计数器0
#define Count1 XBYTE[0x3fff]					//8254计数器1
#define Con_word XBYTE[0x7fff]					//8254控制字
#define Con_M P3 								//电动机方向控制端口
#define Pos_M1 0x02								//电动机1正转
#define Re_M1 0x01								//电动机1反转
#define Sto_M1 0x03								//电动机1反转
#define Pos_M2 0x08								//电动机2正转
#define Re_M2 0x04								//电动机2反转
#define Sto_M2 0x0c								//电动机2反转
uint time1=10000,time2=10000;					//8254计数器0、计数器1初值
uchar M1_flag=0,M2_flag=0;						//电机运行标志位
/************************函数声明***********************/
void delay(uint n);								//延时函数
void init_T0(void);								//定时器T0初始化
uchar M_turn(uchar n);							//读正反转设置函数
uchar key_scan(void);							//键盘扫描函数
void motor_star(uchar num);						//电机启动函数
void motor_stop(uchar num);						//电机制动函数
void motor_inc(uchar num);						//电机加速函数
void motor_dec(uchar num);						//电机减速函数
void key_manage(uchar num);						//键值处理函数
/************************主程序*************************/
main()
{
	uchar keynum;
	init_T0();									//定时器T0初始化程序
	while(1)
	{
		keynum=key_scan();						//按键监视程序
		key_manage(keynum);						//键盘处理程序
	}
}
/************************延时函数*************************/
void delay(uint n)
{
    uchar i,j;
    for (i=0;i<n;i++)
        for (j=19;j>0;j--);
}
/**********************定时器T0初始化*********************/
void init_T0(void)
{
    TMOD=0x01;									//工作方式1
    TH0=0x4c;									//定时50ms
    TL0=0x00;
    ET0=1;										//允许定时器T0中断
    EA=1;										//开总中断
    TR0=1;										//启动定时器T0
}
/********************定时器TO中断服务程序****************/
void timer0(void) interrupt 1
{
    TR0=0;
    TH0=0x4c;									//重载定时器T0初值
    TL0=0x00;
    Con_word=0x30;								//写8254计数器0初值
    Count0=(uchar)(time1/256);
    Count0=(uchar)(time1%256);
    Con_word=0x70;								//写8254计数器1初值
    Count0=(uchar)(time2/256);
    Count0=(uchar)(time2%256);
    TR0=1;
}
/**********************读正反转设置函数********************/
uchar M_turn(uchar n)
{
	uchar temp,turn;
	temp=(P3&0x30)>>4;
	if(n==1)
	{
		temp&=0x01;
		switch(temp)
		{
			case 0x00:							//电机1反转
				turn=Re_M1;
				break;
			case 0x01:							//电机1正转
				turn=Pos_M1;
				break;
		}
	}
	else
	{
		temp=(temp&0x02)>>1;
		switch (temp)
		{
			case 0x00:							//电机2反转
				turn=Re_M2;
				break;
			case 0x01:							//电机2正转
				turn=Pos_M2;
				break;
		}
	}
	return(turn);
}
/**********************电机启动函数***********************/
void motor_star(uchar num)
{
    uchar temp1,temp2;
	temp1=Con_M;								//读电机控制状态
    if ((num==1)&(M1_flag!=1))					//电动机1未启动
	{
		M1_flag=1;								//电机1启动标志位
		temp2=M_turn(1);						//读电机1设置
		Con_M=(temp1&0xfc)|temp2;				//送电机1控制
		time1=10000;							//设定启动速度
	}
	else if((num==2)&(M2_flag!=1))				//若电动机2未启动
	{
		M2_flag=1;								//电机2启动标志位
		temp2=M_turn(2);						//读电机2设置
		Con_M=(temp1&0xfc)|temp2;				//送电机1控制
		time2=10000;							//设定启动速度
	}
}
/**********************电机制动函数***********************/
void motor_stop(uchar num)
{
	uchar temp1,temp2;
	temp1=Con_M;								//读电机控制状态
    if ((num==1)&(M1_flag==1))					//电动机1启动
	{
		M1_flag=0;								//清零电机1启动标志位
		temp2=Sto_M1;							//读电机1设置
		Con_M=(temp1&0xfc)|temp2;				//送电机1控制
	}
	else if((num==2)&(M2_flag==1))				//若电动机2启动
	{
		M2_flag=0;								//清零电机2启动标志位
		temp2=Sto_M2;							//读电机2设置
		Con_M=(temp1&0xfc)|temp2;				//送电机1控制
	}
}
/***********************电机加速函数**********************/
void motor_inc(uchar num)
{
	if ((num==1)&(M1_flag==1))					//电动机1启动
	{
		if(time1>0)
			time1=time1-2000;
	}
	else if((num==2)&(M2_flag==1))				//若电动机2启动
	{
		if(time2>0)
			time2=time2-2000;
	}
}
/**********************电机减速函数***********************/
void motor_dec(uchar num)
{
	if ((num==1)&(M1_flag==1))					//电动机1启动
	{
		if(time1<20000)
			time1=time1+2000;
	}
	else if((num==2)&(M2_flag==1))				//若电动机2启动
	{
		if(time2<20000)
			time2=time2+2000;
	}
}
/**********************键值处理函数*************************/
void key_manage(uchar num)
{
	switch(num)
	{
		case 0:									//电机2启动
			while(P1!=0xff);
			motor_star(2);
			break;
		case 1:									//电机2制动
			while(P1!=0xff);
			motor_stop(2);
			break;
		case 2:									//电机2加速
			while(P1!=0xff);
			motor_inc(2);
			break;
		case 3:									//电机2减速
			while(P1!=0xff);
			motor_dec(2);
			break;
		case 4:									//电机1启动
			while(P1!=0xff);
			motor_star(1);
			break;
		case 5:									//电机1制动
			while(P1!=0xff);
			motor_stop(1);
			break;
		case 6:									//电机1加速
			while(P1!=0xff);
			motor_inc(1);
			break;
		case 7:									//电机1减速
			while(P1!=0xff);
			motor_dec(1);
			break;
		default:break;	
	}
}
/**********************键盘扫描函数************************/
uchar key_scan(void)
{
    uchar i,temp;
    temp=P1;
    if (temp!=0xff)								//判断有无按键按下
    {
        delay(200);								//延时去抖动
        if (temp!=0xff)							//判断是否是误动作
        {
            for (i=0;i<8;i++)					//确定被按键
            {
                if ((temp&0x80)==0x80)
				{
					temp<<=1;
				}
                else
				{
					return(i);					//返回按键键值
				}
            }
        }
    }
    return(0x0e);
}

⌨️ 快捷键说明

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