单片机课程设计-基于单片机直流电机控制器设计

本科单片机课程设计,附Proteus仿真效果图

要求:

思路很简单,使用定时器0控制单片机IO口输出不同占空比的触发脉冲即可控制转速

代码参考:

#include <reg52.h>

#define uchar unsigned char

sbit key1=P1^0;      //¿ª¹Ø
sbit out1=P1^1;      //Êä³öÕýת
sbit out2=P1^2;     //Êä³ö·´×ª
sbit key2=P1^3;     //Õýת
sbit key3=P1^4;     //·´×ª

sbit key4=P1^5;      //Õ¼¿Õ±È+1
sbit key5=P1^6;      //Õ¼¿Õ±È-1

sbit led1=P2^2;      //ָʾÕýת
sbit led2=P2^1;      //ָʾ·´×ª+
sbit led3=P2^0;      //ָʾ¿ªÊ¼/ÔÝÍ£

void Key_Scan();
void Delayms(int ms);
void Timer0Init(void)	;

uchar  start=0;
uchar intr;
uchar zheng=1;
uchar fan=0;
uchar m=3;
unsigned int tt,time;

void main()
{
	Timer0Init();
	while(1)
	{
		if(m==3)time=100;
		else if(m==7)time=200;
		else if(m==11)time=400;
		else if(m==15)time=800;
		else if(m==19)time=1200;
						
		Key_Scan();
	}
}
/************************°´¼üɨÃè***************************/
void Key_Scan()    //°´¼üɨÃè
{
	  if(key1==0)
		{
			Delayms(5);
			if(key1==0){start=!start;}
			while(!key1);
		}
		if(key2==0)
		{
			Delayms(5);
			if(key2==0){zheng=1;fan=0;}
			while(!key2);
		}
		if(key3==0)
		{
			Delayms(5);
			if(key3==0){zheng=0;fan=1;}
			while(!key3);
		}
		if(key4==0)
		{
			Delayms(5);
			if(key4==0){if(m<=15){m=m+4;}}
			while(!key4);
		}
		if(key5==0)
		{
			Delayms(5);
			if(key5==0){if(m>=7){m=m-4;}}
			while(!key5);
		}
}
/******************Èí¼þÑÓʱ 5ms*****************/
void Delayms(int ms)  //ÑÓʱº¯Êý
{
	int x,y;
	for(x=0;x<ms;x++)
		for(y=0;y<110;y++);
}
/******************¶¨Ê±Æ÷0²úÉú1msÑÓʱ*******************/
void Timer0Init()
{
	TMOD|=0X01;
	TH0=0XFC;	
	TL0=0X18;	
	ET0=1;
	EA=1;
	TR0=1;	
}
/*******************¶¨Ê±Æ÷0ÖÐ¶Ï ²úÉúPWM¡¢¿ØÖÆLED*****************************************/
void Timer0() interrupt 1
{
	TH0=0XFC;	
	TL0=0X18;	
	
	if(start==1)
	{
		intr++;
			if(zheng==1)
			{
				if(intr==1) {out1=1;out2=0;}
				else if(intr==m){out1=0;out2=0;}
				else if(intr==20){intr=0;}
			}
			else if(fan==1)
			{
				if(intr==1) {out1=0;out2=1;}
				else if(intr==m){out1=0;out2=0;}
				else if(intr==20){intr=0;}
			}
	}
	
	if(start==1)
	{
		if(zheng==1){led1=0;led2=1;}
		if(fan==1){led1=1;led2=0;}
		
		tt++;
		if(tt<=time){led3=0;}
		else if(tt==time*2){tt=0;led3=1;}
	}
	else if(start==0)
	{led1=1;led2=1;led3=1;}
}









  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值