3. LY-51S单片机开发板
应用开发板上的单片机,八个独立按键,8个LED灯,两个继电器。 4. 控制系统
基于51S单片机的直流电机控制系统。系统组成:无刷直流电机,无刷直流电机驱动器,LY-51S单片机开发板上的单片机,8个独立按键,八个LED灯,两个继电器。 单片机I/O口分配: P1.0 : 方向信号。 P1.1:启停信号。 P1.2:PWM信号。
独立按键 P3 功能 P0 LED K1 P3.0 启动 P0.7 LED8 K2 P3.1 停止 P0.6 LED7 K3 P3.2 自动 P0.0 LED1 K4 P3.3 手动 P0.1 LED2 K5 P3.4 正转 P0.2 LED4 K6 P3.5 反转 P0.3 LED3 K7 P3.6 加速 P0.4 LED5 K8 P3.7 减速 P0.5 LED6 接线图见附录
8个独立按键为单片机的输入,接P3口。8个LED为输出的信号显示,显示不同的工作状态,接P0口。P1.0口输出的方向信号接继电器1,控制驱动器的F/R与COM口的通断控制电机正反转。F/R与COM不接通时电机顺时针方向运转,反之则逆时针方向运转。P1.1口输出的启停信号接继电器2,控制驱动器的R/S与COM口的通断控制电机启停。R/S与COM断开时电机运行,反之则停止运行。
附录 控制程序
程序:
#include\
sbit start=P3^0; sbit stop=P3^1; sbit AUTO=P3^2; sbit hand=P3^3; sbit forward=P3^4; sbit reverse=P3^5; sbit acceleration=P3^6; sbit deceleration=P3^7;
sbit led1=P0^0; //auto sbit led2=P0^1; //hand sbit led3=P0^2; //forward sbit led4=P0^3; //reverse sbit led5=P0^4; //acceleration sbit led6=P0^5; //decelerate sbit led7=P0^6; //on sbit led8=P0^7; //off
sbit direction=P1^0; //zhuanfan sbit RS=P1^1; //on off sbit PMW=P1^2; //kongzhi //sbit speaker=P1^3;
int CYCLE,PWM_ON,count;
void initial() {
CYCLE=20; PWM_ON=0; count=0; }
/*------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS
------------------------------------------------*/ void DelayUs2x(unsigned char t) { while(--t); }
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(unsigned char t) { while(t--) {
//大致延时1mS DelayUs2x(245); } }
/*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ void Init_Timer0(void) {
TMOD |= 0x01; //使用模式1,16位定时器,使用\符号可以在使用多个定时器时不受影响 TH0=(65536-2000)/256; TL0=(65536-2000)%6;
EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 }
/*------------------------------------------------ 定时器中断子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 {
TH0=(65536-2000)/256; TL0=(65536-2000)%6;
if(count==PWM_ON) //如果定时等于on的时间 说明作用时间结束,输出低电平 {
PMW=0; // }
if(count==CYCLE) //反之低电平时间结束后返回高电平 {
//重新赋值 2ms
//重新赋值 2ms
DelayUs2x(245);
count=0;
if(PWM_ON!=0) //如果开启时间是0 保持原来状态 {
PMW=1; } } count++; }
void accelerate() {
if(PWM_ON==CYCLE) { } else
{PWM_ON++;} }
void decelerate() {
if(PWM_ON==0) { } else
{PWM_ON--;} } main() {
initial(); Init_Timer0();
while(1) {
if(!stop)//stop {
DelayMs(10); if(!stop) {
PWM_ON=0; while(start) {
RS=0; led7=0; led8=1;
P0=0xff;