【【51单片机直流电机调速】】

学会电机调速,掌握中国速度

PWM的生成方法

先用户设定一个比较值,然后计数器定时自增。

当计数器<比较值,输出0

当计数器>比较值,输出1

main.c

c 复制代码
#include <REGX52.H>
#include"delay.h"
#include"key.h"
#include"Nixie.h"
#include"Timer0.h"

unsigned char Counter,Compare;
unsigned char KeyNum,Speed;
sbit Motor=P1^0;


void main()
{
	Timer0_Init();
	
	while(1)
	{
		KeyNum=Key();
		if(KeyNum==1)
		{
			Speed++;
			Speed%=4;
			if(Speed==0){Compare=0;}
			if(Speed==1){Compare=50;}
			if(Speed==2){Compare=75;}
			if(Speed==3){Compare=100;}
			
		}
		Nixie(1,Speed);
		
		
		
		
		
		
	}	
	
}



void Timer0_Routine() interrupt 1
{
	
	TL0 = 0x9C;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	Counter++;
	Counter%=100;
	if(Counter<Compare)
	{
		Motor=1;
	}
	else
	{
		Motor=0;
	}
}

delay.c

c 复制代码
void Delay(unsigned int xms)		//@12.000MHz
{
	while(xms)
	{
	unsigned char i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	xms--;
}
}

delay.h

c 复制代码
#ifndef _DELAY_H__
#define _DELAY_H__
void Delay(unsigned int xms);
 
 #endif

key.c

c 复制代码
#include <REGX52.H>
#include "Delay.h"

/**
  * @brief  获取独立按键键码
  * @param  无
  * @retval 按下按键的键码,范围:0~4,无按键按下时返回值为0
  */
unsigned char Key()
{
	unsigned char KeyNumber=0;
	
	if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}
	if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}
	if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}
	if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}
	
	return KeyNumber;
}

key.h

c 复制代码
#ifndef __KEY_H__
#define __KEY_H__

unsigned char Key();

#endif

Nixie.c

c 复制代码
#include <REGX52.H>
#include "Delay.h"	//包含Delay头文件

//数码管段码表
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

//数码管显示子函数
void Nixie(unsigned char Location,Number)
{
	switch(Location)		//位码输出
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];	//段码输出
	//Delay(1);				//显示一段时间
	//P0=0x00;				//段码清0,消影
}

Nixie.h

c 复制代码
#ifndef __NIXIE_H__
#define __NIXIE_H__

void Nixie(unsigned char Location,Number);

#endif

Timer0.c

c 复制代码
#include <REGX52.H>

/**
  * @brief  定时器0初始化,100us@12.000MHz
  * @param  无
  * @retval 无
  */
void Timer0_Init(void)
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x9C;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

Timer0.h

c 复制代码
#ifndef __TIMER0_H__
#define __TIMER0_H__

void Timer0_Init(void);

#endif
相关推荐
LCMICRO-1331084774612 小时前
长芯微LD1871完全P2P替代AD1871,是一款立体声音频ADC
单片机·嵌入式硬件·fpga开发·音视频·硬件工程·dsp开发·音频adc
12.=0.12 小时前
【stm32_7】定时器的原理与应用、基本定时器、通用定时器、PWM、模拟脉冲信号的宽度、利用PWM控制外设、逻辑分析仪的使用
c语言·stm32·单片机·嵌入式硬件
Deitymoon13 小时前
STM32——振动传感器控制继电器
stm32·单片机·嵌入式硬件
天天爱吃肉821813 小时前
空间智能上车:新能源OEM决胜「第三空间」的底层技术革命|研发工程师深度解析
大数据·人工智能·嵌入式硬件·汽车
错落有致13 小时前
单片机-温湿度计制作
单片机·嵌入式硬件
Lugas Luo13 小时前
识别DDR故障的“数据总线测试算法”
linux·嵌入式硬件
时空自由民.13 小时前
ESP32 IDF HTTP OTA升级流程原理
linux·单片机
国产芯片设计13 小时前
DIY实战|0.8寸WiFi自动授时电子钟,国产数码管驱动芯片方案分享
stm32·单片机·mcu·51单片机·硬件工程
LCMICRO-1331084774613 小时前
长芯微LD73360完全P2P替代AD73360,是一款工业电能计量6通道模拟输入前端(AFE) 处理器
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模拟前端afe
summer__777713 小时前
作业3:基于单片机的智能生活系统设计与未来应用设想——让生活更便捷与智慧
单片机·嵌入式硬件·生活