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

📄 dianji.c

📁 常用经典小车程序常用经典小车程序常用经典小车程序
💻 C
字号:
///*************************************************************************************************************
///直流电机的pwm控制程序
///功能:直流电机的速度控制,速度测试,速度显示。
///作者:廖维斌,郭留涛
///*************************************************************************************************************


#include<reg51.h>				///包含头文件
#include<absacc.h>
#define gew DBYTE[0X40]			///定义显示缓冲区 个位
#define shiw DBYTE[0X41]			//////////////////十位
#define baiw DBYTE[0X42]			//////////////////百位
#define qianw DBYTE[0X43]			//////////////////千位
#define unint unsigned int		///自定义变量
#define uchar unsigned char
sbit in1=P3^0;					///控制位定义
sbit in2=P3^1;
sbit ena=P3^7;
uchar code zm[12]={0Xc0,0Xf9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0x73,0x71};///在程序存储区定义字型码表
uchar code wm[4]={0xfe,0xfd,0xfb,0xf7};///在程序存储区定义字位控制码表***选位
uchar a=8;						///占空比控制字
uchar n=1;						///速度增减量一
uchar m=2;						///速度增减量二
unint speedbuf=0;				///速度值
uchar zc=0;
unint ys=0;
key();							///子函数声明
display();
control();
delays();
speedcan();
///*************************************************************************************************************
///主函数
///*************************************************************************************************************
main()	
{
	gew=shiw=baiw=qianw=0;				///显示初始化
	P0=0xc0;					
	P2=0;
	in1=0;						///电机控制的初始化
	in2=0;
	ena=1;
	TMOD=0X15;					///定时器1为定时模式,使用方式2;定时器0为计数模式,使用方式2
	TH1=0Xfa;					///装定时器初值
	TL1=0X24;
	TH0=0;						///装计数器初值
	TL0=0;
	EA=1;						///开总中断
	ET0=1;						///允许定时器0中断
	ET1=1;						///允许定时器1中断
	TR0=1;						///开计数器
	TR1=1;						///开定时器
	while(1)					///无限循环
	{
		key();					///调用按键扫描程序
		control();				///调用电机控制程序
		display();				///调用显示程序
		speedcan();				///调用速度处理程序
	}
}
///*************************************************************************************************************
///中断处理程序,实现输出方波占空比控制
///*************************************************************************************************************
timer_1() interrupt 3 using 1	///定时器1中断,使用寄存器组1
{
	TR1=0;						///停止定时
	zc++;						///中断次数加1
	ys++;
	control();					
	speedcan();
	TH1=0Xfa;					///重装定时初值
	TL1=0X24;
	TR1=1;
}
///************************************************************************************************************
///脉宽控制程序,实现PWM的输出
///***********************************************************************************************************
control()
{
	if(zc==a)
	{
		ena=0;
	}
	if(zc==15)
	{
		zc=0;
		ena=1;
	}
}
///*****************************************************************************************************************
///显示子函数,显示当前电机的速度
///****************************************************************************************************************
display()
{
	uchar i;
	gew=speedbuf%10;					///求速度个位值送各位显示缓冲
	shiw=(speedbuf/10)%10;					///求速度十位值送十位显示缓冲
	baiw=(speedbuf/100)%10;				///求速度百位值送百位显示缓冲
	qianw=speedbuf/1000;				///求速度千位值送千位显示缓冲
	for(i=0;i<4;)					///循环选中数码管的每一位
	{
		P2=wm[i];
		if(i==0)					///显示个位
		{
			P0=zm[gew];
			delays();
		}
			else if(i==1)			///显示十位
			{
				P0=zm[shiw];
				delays();
			}
				else if(i==2)		///显示百位
				{ 
					P0=zm[baiw];
					delays();
				}
					else if(i==3)	///显示千位
					{
						P0=zm[qianw];
						delays();
					}		
		i++;
	}

}
///**********************************************************************************************************
///读速度值子函数,从计数器0中读计数值,经过计算,求出当前速度值
///*************************************************************************************************************
speedcan()
{
	if(ys==500)
	{
		TR0=0;						///停止计数
		speedbuf=((TH0*256+TL0)*8)/3;///读计数器
		ys=0;
		TH0=0;						///重装计数初值
		TL0=0;
		TR0=1;						///开计数器
	}
}
///*********************************************************************************************************
///延时子函数
///***********************************************************************************************************
delays()
{
	uchar i;
	for(i=80;i>0;i--);
}
///************************************************************************************************************
///键盘扫描子函数,实现电机的方向 速度的控制
///*********************************************************************************************************
key()
{
	uchar i;
	P1=0xff;						///拉高P1口的电平
	i=P1;							///读P1口
 	if(i==0xfe)						///第一个键按下
	{	delays();					///延时去抖动
		if(i==0xfe)					///再判断按键是否按下
		{
			in1=0;					///电机顺时针转动
			in2=1;	
		}
	}
	if(i==0xfd)						///第二个键是否按下
	{
		delays();					///延时去抖动
		if(i==0xfd)					///再判断按键是否按下	
		{
			in1=1; 					///电机逆时针转动
			in2=0;
		}
	}
	if(i==0xfb)						///第三个键是否按下
	{
		delays();
		if(i==0xfb)
		{
			a=a+n;					///速度加((慢速)
			if(a>=15) 				
				a=15;
		}
	}
	if(i==0xf7)						
	{
		delays();
		if(i==0xf7)
		{
			if(a>3)					///速度减(慢速)
				a=a-n;
			else 
				a=3;
		}
	}
	if(i==0xef)
	{
		delays();
		if(i==0xef)
		{
			a=a+m;					///速度加,(快速)
			if(a>=15)
				a=15;
		}
	}
	if(i==0xdf)
	{
		delays();
		if(i==0xdf)
			if(a>3)					///速度减,(快速)
				a=a-m;
			else
				a=3;
	}
	if(i==0xbf)
	{
		delays();
		if(i==0xbf)
		{
			in1=0;					///停止转动
			in2=0;
		}
	}
	if(i==0x7f)
	{
		delays();
		if(i==0x7f)
			a=5;					///回到中间速度
	}
	while(P1!=0xff);				///等待按键放下
}

⌨️ 快捷键说明

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