单片机控制直流电机

合集下载

单片机控制电机的方式

单片机控制电机的方式

单片机控制电机的方式单片机作为嵌入式系统的核心,广泛应用于各种控制领域。

其中,单片机控制电机是一个重要的应用领域。

本文将介绍单片机控制电机的方式,包括直流电机、步进电机、伺服电机三个方面。

一、直流电机控制1.1 单极性控制单极性控制是最简单的直流电机控制方式,它的电源和直流电机连接在一起,通过改变电源正负极之间的电压大小和方向来改变直流电机的转速和转向。

1.2 双极性控制双极性控制是一种更加高级的直流电机控制方式,它可以使直流电机实现正反转和调速。

1.3 PWM控制PWM控制是一种数字控制方式,它可以调节电源电压的有效值,从而改变直流电机的转速和转向。

PWM控制的理论基础是调制原理,通过改变PWM波的占空比来改变电机的输出功率,从而实现电机的调速和正反转。

二、步进电机控制步进电机是一种特殊的电机,它的转动是以步进的形式进行的,每一步的功率相等,稳定性和精度较高,被广泛应用于各种需要精密控制的领域。

步进电机的控制方式有以下几种:2.1 单相双极控制单相双极控制是最简单的步进电机控制方式,它可以使步进电机实现一定程度的正反转和调速,但是功率低,精度不高,适用于一些比较简单的应用场合。

2.2 双相驱动控制双相驱动控制是一种更加高级的步进电机控制方式,它分为单向驱动和双向驱动。

双向驱动比单向驱动更加灵活,可以实现更加复杂的控制功能。

2.3 微步驱动控制微步驱动控制是一种针对步进电机控制的高级技术,通过改变步进电机的每一步数来实现更加精确的控制。

目前,微步驱动控制已经被广泛应用于各种需要高精度控制的领域。

三、伺服电机控制伺服电机是一种在工业自动化中经常使用的电机,它具有速度反馈、位置反馈和转矩反馈等功能,可以实现高效、高精度的控制。

伺服电机的控制方式有以下几种:3.1 位置控制位置控制是一种使用最为广泛的伺服电机控制方式,它通过电机位置传感器反馈电机当前位置信息,从而实现定位和精确位置控制。

3.2 速度控制速度控制是伺服电机的另一种重要控制方式,它通过电机速度传感器反馈电机当前速度信息,从而实现高效的速度控制。

51单片机直流电机正反转程序

51单片机直流电机正反转程序

51单片机直流电机正反转程序在工业自动化、机器人、电子设备等领域,直流电机是一种常见的电动机。

直流电机具有结构简单、转速范围广、转矩大、控制方便等优点,因此被广泛应用。

在直流电机的控制中,正反转是一种常见的操作。

本文将介绍如何使用51单片机控制直流电机的正反转。

1. 直流电机的原理直流电机是一种将电能转化为机械能的电动机。

它的基本结构由定子、转子、电刷和电枢组成。

当电枢通电时,电枢内部会产生磁场,与定子磁场相互作用,从而产生转矩,使转子转动。

电刷则用来改变电极的极性,使电极的磁场方向与定子磁场方向相互作用,从而使电机正反转。

2. 51单片机控制直流电机的原理51单片机是一种常用的微控制器,具有体积小、功耗低、易于编程等优点。

在控制直流电机时,我们可以使用51单片机来控制电机的正反转。

具体实现方法是通过控制电机的电极极性来改变电机的转向。

3. 51单片机直流电机正反转程序下面是一段使用51单片机控制直流电机正反转的程序:#include <reg52.h>sbit IN1 = P1^0; //定义IN1引脚sbit IN2 = P1^1; //定义IN2引脚void delay(unsigned int t) //延时函数 {unsigned int i, j;for(i=0; i<t; i++)for(j=0; j<125; j++);}void main(){while(1){IN1 = 1; //IN1引脚输出高电平 IN2 = 0; //IN2引脚输出低电平 delay(1000); //延时1秒IN1 = 0; //IN1引脚输出低电平 IN2 = 1; //IN2引脚输出高电平 delay(1000); //延时1秒}```上述程序中,我们使用了P1口的0、1引脚来控制电机的正反转。

当IN1引脚输出高电平、IN2引脚输出低电平时,电机正转;当IN1引脚输出低电平、IN2引脚输出高电平时,电机反转。

单片机控制直流电机的转速

单片机控制直流电机的转速

单片机控制直流电机的转速
单片机是一种集成了CPU、RAM、EPROM和GPIO等功能模块的微型计算机系统,广泛应用于控制、测量、仪表以及通讯等领域。

单片机控制直流电机的转速,是基于单片机的数字输出口产生的PWM波控制直流电机的转速。

直流电机是一种广泛应用的电机类型,其结构简单,控制相对容易。

控制直流电机的转速常常使用PWM技术,即变占空比的脉冲宽度调制技术。

PWM波的占空比与电机的转速成正比关系。

通过单片机的数字输出口产生PWM信号,调整占空比,可以控制直流电机的转速。

以下是单片机控制直流电机转速的具体实现步骤:
1.将电机的正极接到电源,负极接到单片机的数字输出口;
2.设置单片机的计时器,产生PWM波,定时器的频率可以根据电机的额定转速和电机的型号进行设置;
3.根据PWM波的占空比控制电机的转速,可以通过编程控制单片机数字输出口的输出电平,从而调整PWM波的占空比,进而改变电机的转速。

值得注意的是,单片机控制电机转速还需要特别考虑电机的供电和保
护措施。

单片机和电机的供电电压需要相同,并且还需要电源电压稳
定器,以保证电机转速的稳定性。

此外,还需要采取适当的保护措施,如反向保护二极管、电机短路保护电路等,以确保电机和单片机的安全。

总之,单片机控制直流电机的转速是一种基于PWM技术的控制方法,通过单片机的数字输出口产生PWM信号,调整占空比,可以实现对
电机的精确控制。

在实际应用中,我们需要根据电机的特性和实际需
要选择合适的单片机型号,并采取适当的保护和供电措施,以确保系
统的安全和稳定性。

单片机电机控制

单片机电机控制

单片机电机控制引言:单片机作为一种集成电路芯片,广泛应用于各个领域,尤其在电机控制方面发挥着重要作用。

本文将介绍单片机在电机控制中的应用及相关知识,以及常见的控制方法和技术。

一、单片机在电机控制中的应用单片机在电机控制中的应用广泛,包括直流电机控制、步进电机控制、交流电机控制等。

通过单片机的控制,可以实现电机的启停、速度调节、方向控制等功能。

1. 直流电机控制:直流电机是一种常见的电机类型,广泛应用于各个领域。

单片机可以通过PWM信号控制直流电机的转速和方向。

通过改变PWM信号的占空比,可以控制直流电机的速度,通过改变PWM信号的正负脉冲,可以控制直流电机的正转和反转。

2. 步进电机控制:步进电机是一种精密控制的电机,常用于需要准确定位的应用中。

单片机可以通过控制步进电机驱动器的信号,实现步进电机的精确控制。

通过改变驱动器信号的频率和脉冲数,可以控制步进电机的转速和步距。

3. 交流电机控制:交流电机是一种常见的电机类型,广泛应用于各个领域。

单片机可以通过外部电路和传感器,获取交流电机的相关信号,从而实现对交流电机的控制。

常见的控制方法包括矢量控制、电流控制和速度控制等。

二、电机控制的常见方法和技术在单片机电机控制中,常见的方法和技术有PWM调速、PID控制、闭环控制等。

1. PWM调速:PWM调速是一种通过改变PWM信号的占空比来调节电机转速的方法。

通过改变占空比,可以改变电机的平均电压和平均功率,从而实现电机的调速功能。

PWM调速具有调速范围广、控制精度高的优点,在电机控制中被广泛应用。

2. PID控制:PID控制是一种比例、积分和微分控制的方法,常用于对电机速度和位置的控制。

通过测量电机的反馈信号和设定值,PID控制可以根据误差的大小来调整控制器的输出,从而实现电机的精确控制。

3. 闭环控制:闭环控制是一种通过反馈信号来调节电机控制器输出的方法。

通过测量电机的反馈信号,可以实时调整控制器的输出,从而实现对电机的精确控制。

单片机控制直流电机调速课件

单片机控制直流电机调速课件

电机调速应用实例
机器人控制
电机调速应用于机器人的运动控制,提高机 器人的精度和速度。
工业设备
电机调速应用于各种工业设备,提高生产效 率和质量。
电动车驱动
电机调速应用于电动车的驱动控制,实现高 效能耗和长续航里程。
风力发电
电机调速应用于风力发电装置,优化风能的 利用效率。
总结
1 单片机控制直流电
机调速是一种常见 的应用
单片机控制直流电机调速 课件
本课件将介绍单片机控制直流电机调速的原理和应用。通过详细讲解控制系 统搭建和调速实现方法,以及PID调节算法的应用,帮助您深入理解电机调速。
直流电机调速原理
1 电压控制
改变电机供电电压以控制转速。
2 电流控制
调整电机驱动电流以改变负载对转速的影 响。
3 脉宽调制
4 反馈调节
2
脉宽调制方法
通过改变脉冲宽度来调节电机的平均电压。
3
PID调节方法
结合比例、积分和微分控制来实现精确的电机调速。
PID调节算法在电机控制中的应用
PID调节算法是一种常用的闭环控制方法,可以根据实际转速和目标转速进行调节,实现精确的电机调 速。 该算法通过比例控制、积分控制和微分控制来实现稳定的调速效果。 PID调节算法在电机控制中得到广泛应用,为工业自动化和机电一体化技术的发展提供了重要支持。
通过改变脉冲宽度来控制驱动电机的平均 电压。
使用转速传感器等反馈信号进行闭环控制。
电机调速系统搭建
硬件搭建
使用单片机和面包板搭建电机 调速系统。
电路连接
将电机与单片机连接,建立电 机调速的电路。
传感器连接
将转速传感器连接至电路,用 于反馈调节。

基于单片机控制的直流电机调速系统设计

基于单片机控制的直流电机调速系统设计

基于单片机控制的直流电机调速系统设计一、引言直流电机在工业自动化领域中广泛应用,其调速系统的设计是实现自动控制的关键。

本文将介绍一种基于单片机控制的直流电机调速系统设计方案,主要包括电机原理、硬件设计、软件设计以及实验结果与分析等内容。

二、电机原理直流电机是一种将直流电能转换为机械能的装置,其原理基于电磁感应和安培定律。

电机由定子和转子两部分组成,定子上绕有恒定电流,产生磁场,而转子上带有电流,与定子的磁场互相作用,产生力矩使电机旋转。

三、硬件设计1.单片机选择在本设计中,选择了一款功能强大、性能稳定的单片机作为控制核心,例如使用ST C89C51单片机。

该单片机具有丰富的GP IO口和定时器/计数器等外设,适合进行电机控制。

2.电机驱动电路设计电机驱动电路主要包括功率电源、运放电路和驱动电路。

其中,功率电源为电机提供稳定的直流电源,运放电路用于信号放大和滤波,驱动电路则根据控制信号控制电机的转速。

3.速度测量电路设计为了实时监测电机的转速,需要设计速度测量电路。

常见的速度测量电路包括光电编码器、霍尔传感器等,通过测量转子上感应物体的变化来获得电机的转速信息。

四、软件设计1.程序框架软件设计的目标是实现对电机转速的控制和监测。

基于单片机的软件设计主要包括主程序的编写、中断服务程序的编写以及定时器的配置等。

2.控制算法常见的直流电机调速算法包括电压调速法、P WM调速法等。

根据实际需求选择合适的算法,并根据测量到的转速信号进行反馈控制,实现对电机转速的精确控制。

五、实验结果与分析设计完成后,进行实验验证。

通过设置不同的转速需求,观察电机的实际转速与设定转速的误差,并分析误差原因。

同时还可以测试电机在不同负载下的转速性能,以评估系统的稳定性和鲁棒性。

六、总结基于单片机控制的直流电机调速系统设计是实现自动控制的重要应用。

本文介绍了该系统的硬件设计和软件设计方案,并展示了实验结果。

通过系统实现电机转速的精确控制,可以广泛应用于工业自动化领域。

基于单片机pid算法的直流电机速度控制方法

基于单片机pid算法的直流电机速度控制方法

基于单片机pid算法的直流电机速度控制方法基于单片机PID算法的直流电机速度控制方法是一种常用的技术,其基本原理是通过调节PWM(脉宽调制)信号的占空比来控制电机的输入电压,从而实现电机的速度控制。

以下是基于单片机PID算法的直流电机速度控制方法的基本步骤:1.设定目标速度:首先,需要设定电机的目标速度。

这可以通过按键或其他输入设备来实现。

2.采集实际速度:为了实现精确的控制,需要实时获取电机的实际速度。

这可以通过在电机转轴上安装光电编码器或霍尔传感器来实现,这些传感器可以实时检测电机的转速并将其转换为电信号。

3.计算偏差:单片机通过比较目标速度和实际速度,计算出速度偏差。

如果实际速度小于目标速度,偏差为负;反之,偏差为正。

4.应用PID算法:单片机使用PID算法来处理速度偏差。

PID控制器通过比例、积分和微分三个环节来计算控制量,以尽可能消除偏差。

具体的PID参数(如Kp、Ki、Kd)可以根据实际情况进行调整,以获得最佳的控制效果。

5.生成PWM信号:基于PID控制器的输出,单片机生成PWM信号来调节电机的输入电压。

占空比决定了电机输入电压的大小,进而影响电机的转速。

6.实时调整:在整个控制过程中,单片机不断采集电机的实际速度,计算偏差,并调整PWM信号的占空比,以使电机尽可能接近目标速度。

7.显示和保存数据:为了方便调试和观察,可以通过单片机的显示屏实时显示电机的实际速度和偏差。

此外,也可以将重要的数据保存在单片机的内部或外部存储器中。

8.安全保护:为了防止电机过载或意外事故,单片机应具备安全保护功能。

例如,当电机实际速度超过设定速度一定时间时,单片机应自动切断电源或发出报警信号。

基于单片机PID算法的直流电机速度控制方法具有精度高、稳定性好、适应性强等优点,广泛应用于各种需要精确控制电机速度的场合。

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

基于C51单片机的直流电机PWM调速控制--SQ这是最近一阶段自己学习所获,现分享与大家。

这里采用A T89C52单片机做主控制芯片,实现两路直流电机的PWM调速控制,另外还可以实现转向、显示运行时间、显示档位等注:考虑小直流电机自身因素,调速范围仅设有四级电路原理图:C语言程序源代码:/******************** 硬件资源分配*********************/数码管:显示电机状态(启停、正反、速度)、运行时间、是否转弯按键:K4 启动/暂停K3 正反转/转弯允许K2 加速/左转/运行时间清零K1 减速/右转/停止定时器:T0 数码管动态显示,输出PWMT1 运行时间记录********************************************************//*******主程序文件PWM.c******/#include <reg52.h>#include "Afx.h"#include "Config.c"#define CIRCLE 5 //脉冲周期//按键定义uchar key,key_tmp=0, _key_tmp=0;//显示定义uchar LedState=0xF0; //LED显示标志,0xF0不显示,Ox00显示uchar code LED_code_d[4]={0xe0,0xd0,0xb0,0x70}; //分别选通1、2、3、4位uchar dispbuf[4]={0,0,0,0}; //待显示数组uchar dispbitcnt=0; //选通、显示的位uchar mstcnt=0;uchar Centi_s=0,Sec=0,Min=0; //分、秒、1%秒//程序运行状态标志bit MotState=0; //电机启停标志bit DirState=0; //方向标志0前,1后uchar State1=-1;uchar State2=-1;uchar State3=0;uchar State4=-1;uchar LSpeed=0;uchar RSpeed=0;//其他uint RunTime=0;uint RTime_cnt=0;uint LWidth;uint RWidth; //脉宽uint Widcnt=1;uint Dispcnt;//函数声明void key_scan(void);void DisBuf(void);void K4(void);void K3(void);void K2(void);void K1(void);void disp( uchar H, uchar n );void main(void){P1|=0xF0;EA=1;ET0=1;ET1=1;TMOD=0x11;TH0=0xFC;TL0=0x66; //T0,1ms定时初值TH1=0xDB;TL1=0xFF; //T1,10ms定时初值TR0=1;Widcnt=1;while(1){key_scan();switch(key){case 0x80: K1(); break;case 0x40: K2(); break;case 0x20: K3(); break;case 0x10: K4(); break;default:break;}key=0;DisBuf();LWidth=LSpeed;RWidth=RSpeed;}}//按键扫描**模拟触发器防抖void key_scan(void){key_tmp=(~P3)&0xf0;if(key_tmp&&!_key_tmp) //有键按下{key=(~P3)&0xf0;}_key_tmp=key_tmp ;}//按键功能处理/逻辑控制void K4(void){if(State4==-1){State4=1;TR1=1;dispbuf[3]=1;LedState=0x00; //打开LEDMotState=1; //打开电机LSpeed=1;RSpeed=1; //初速设为1}else if(State4==1){State4=0;TR1=0;MotState=0; //关闭电机}else if(State4==0){MotState=1;if(State3==0){State4=1;TR1=1;}else if(State3==1){LSpeed=2;RSpeed=2;}}}void K3(void){if(State4==1)DirState=!DirState;if(State4==0){if(State3==0){State3=1; //可以转向标志1可以,0不可以TR1=1;dispbuf[3]=9;MotState=1;LSpeed=2;RSpeed=2;}else if(State3==1){State3=0;TR1=0;dispbuf[3]=0;MotState=0;}}}void K2(void){if(State4==1&&LSpeed<4&&RSpeed<4){LSpeed++;RSpeed++;}else if(State4==0){if(State3==0){//State4=-1;//LedState=0xF0;MotState=0;Sec=0;Min=0;}else if(State3==1&&LSpeed<4&&RSpeed<4){//TurnState=0;LSpeed=2;RSpeed++;}}}void K1(void){if(State4==1&&LSpeed>1&&RSpeed>1){LSpeed--;RSpeed--;}else if(State4==0){if(State3==0){State4=-1;LedState=0xF0;MotState=0;}else if(State3==1&&LSpeed<4&&RSpeed<4){//TurnState=1;LSpeed++;RSpeed=2;}}}//显示预处理void DisBuf(void){if(RTime_cnt==100){Sec++;RTime_cnt=0;}if(Sec==60){Min++;Sec=0;}if(State4==1){dispbuf[0]=Sec%10;dispbuf[1]=Sec/10;dispbuf[2]=Min;if(!DirState) //正转dispbuf[3]=LSpeed;if(DirState) //反转dispbuf[3]=LSpeed+4;}if(State4==0){if(State3==0){dispbuf[0]=Sec%10;dispbuf[1]=Sec/10;dispbuf[2]=Min;dispbuf[3]=0;}if(State3==1){dispbuf[0]=RSpeed;dispbuf[1]=LSpeed;dispbuf[2]=Min;dispbuf[3]=9;}}}//LED驱动void disp( uchar H, uchar n ){P1=n;P1|=LedState ;P1|=LED_code_d[H];}//T0中断**显示/方波输出void Time_0() interrupt 1{TH0=0xFC;TL0=0x66;Widcnt++;Dispcnt++;//电机驱动/方波输出if(Widcnt>CIRCLE){Widcnt=1;}if(Widcnt<=LWidth)LMot_P=!DirState&&MotState;elseLMot_P=DirState&&MotState;LMot_M=DirState&&MotState;if(Widcnt<=RWidth)RMot_P=!DirState&&MotState;elseRMot_P=DirState&&MotState;RMot_M=DirState&&MotState;//显示if(Dispcnt==5){disp(dispbitcnt,dispbuf[dispbitcnt]);dispbitcnt++;if(dispbitcnt==4){dispbitcnt=0;}Dispcnt=0;}}//T1中断**运行时间void Time_1() interrupt 3{TH1=0xDB;TL1=0xFF;RTime_cnt++;}/******配置文件Afx.h******/#ifndef _AFX_#define _AFX_typedef unsigned char uchar;typedef unsigned int uint;typedef unsigned long ulong;#endif/******IO配置文件Config.c******/#ifndef _Config_#define _Config_#include "Afx.h"#include <reg52.h>//显示定义sbit led=P3^2;//电机引脚定义sbit LMot_P=P2^2; sbit LMot_M=P2^3; sbit RMot_P=P2^0; sbit RMot_M=P2^1;#endif。

单片机控制的直流电机正反转和加速减速C程序

单片机控制的直流电机正反转和加速减速C程序

单片机控制的直流电机正反转和加速减速C程序简介本文档旨在向读者介绍如何使用单片机控制直流电机实现正反转和加速减速功能的C程序。

程序实现正反转控制以下是控制直流电机正反转的C程序示例:include <avr/io.h>void motor_forward(){// 设置引脚控制直流电机正转}void motor_reverse(){// 设置引脚控制直流电机反转}int main(){// 初始化单片机引脚设置和其他必要的配置while (1){// 检测是否需要正转或反转,根据需要调用motor_forward()或motor_reverse()函数}return 0;}加速减速控制以下是控制直流电机加速减速的C程序示例:include <avr/io.h>void motor_speed_up(){// 调整引脚控制直流电机的占空比以加速电机转速}void motor_slow_down(){// 调整引脚控制直流电机的占空比以减速电机转速}int main(){// 初始化单片机引脚设置和其他必要的配置while (1){// 检测是否需要加速或减速,根据需要调用motor_speed_up()或motor_slow_down()函数}return 0;}结论通过上述示例程序,我们可以实现通过单片机控制直流电机的正反转和加速减速功能。

读者可以根据实际需求进行相应的参数调整和功能扩展。

请注意,上述示例程序仅为演示目的,具体的引脚配置和控制方式需根据实际硬件和单片机型号进行调整。

用单片机控制直流电机-终结版

用单片机控制直流电机-终结版

用单片机控制直流电机摘要本设计以AT89C51单片机为核心,以4*4矩阵键盘做为输入达到控制直流电机的启停、速度和方向,完成了基本要求和发挥部分的要求。

在设计中,采用了PWM技术对电机进行控制,通过对占空比的计算达到精确调速的目的。

一、设计方案比较与分析:1、电机调速控制模块:方案一:采用电阻网络或数字电位器调整电动机的分压,从而达到调速的目的。

但是电阻网络只能实现有级调速,而数字电阻的元器件价格比较昂贵。

更主要的问题在于一般电动机的电阻很小,但电流很大;分压不仅会降低效率,而且实现很困难。

方案二:采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整。

这个方案的优点是电路较为简单,缺点是继电器的响应时间慢、机械结构易损坏、寿命较短、可靠性不高。

方案三:采用由达林顿管组成的H型PWM电路。

用单片机控制达林顿管使之工作在占空比可调的开关状态,精确调整电动机转速。

这种电路由于工作在管子的饱和截止模式下,效率非常高;H型电路保证了可以简单地实现转速和方向的控制;电子开关的速度很快,稳定性也极佳,是一种广泛采用的PWM调速技术。

兼于方案三调速特性优良、调整平滑、调速范围广、过载能力大,因此本设计采用方案三。

2、PWM调速工作方式:方案一:双极性工作制。

双极性工作制是在一个脉冲周期内,单片机两控制口各输出一个控制信号,两信号高低电平相反,两信号的高电平时差决定电动机的转向和转速。

方案二:单极性工作制。

单极性工作制是单片机控制口一端置低电平,另一端输出PWM信号,两口的输出切换和对PWM的占空比调节决定电动机的转向和转速。

由于单极性工作制电压波开中的交流成分比双极性工作制的小,其电流的最大波动也比双极性工作制的小,所以我们采用了单极性工作制。

3、PWM调脉宽方式:调脉宽的方式有三种:定频调宽、定宽调频和调宽调频。

我们采用了定频调宽方式,因为采用这种方式,电动机在运转时比较稳定;并且在采用单片机产生PWM脉冲的软件实现上比较方便。

单片机和电机的关系

单片机和电机的关系

单片机和电机的关系引言:单片机是一种集成电路,具有计算、控制、存储和通信等功能,广泛应用于各个领域。

而电机作为一种能够将电能转化为机械能的设备,也是现代工业生产中不可或缺的部件之一。

单片机和电机之间有着密切的关系,本文将从控制电机的角度,探讨单片机和电机的关系。

一、单片机控制电机的原理单片机与电机之间的关系主要体现在单片机对电机的控制上。

单片机可以通过输出脉冲信号来控制电机的转速和方向。

具体来说,单片机通过控制输出引脚的高低电平,来控制电机驱动器的工作状态,从而实现对电机的控制。

二、单片机控制电机的方式1. 直流电机控制直流电机是最常见的一种电机类型,也是应用最广泛的电机之一。

单片机控制直流电机的方式主要有两种:直接驱动和间接驱动。

直接驱动是指单片机的输出端直接连接到电机,并通过控制输出电平的高低来控制电机的转速和方向。

间接驱动是指单片机通过驱动器来控制电机,驱动器则通过接收单片机的控制信号来控制电机的转速和方向。

2. 步进电机控制步进电机是一种精密的电机,常用于需要准确定位和控制转角的场合。

单片机控制步进电机的方式主要有两种:全步进和半步进。

全步进是指单片机通过输出脉冲信号来控制步进电机的转动,每个脉冲信号使得步进电机转动一定的角度。

半步进是在全步进的基础上,通过改变脉冲信号的顺序和频率,使步进电机的转动更加精细,可以实现更高的定位精度。

三、单片机控制电机的应用领域单片机与电机的结合在各个领域都有广泛的应用,以下是一些常见的应用领域:1. 工业自动化在工业自动化领域,单片机可以通过控制电机来实现生产线上的各种操作,如输送带的控制、机械臂的运动等。

2. 家电在家电领域,单片机可以通过控制电机来实现家电产品的各种功能,如洗衣机的搅拌、空调的风速调节等。

3. 智能车辆在智能车辆领域,单片机可以通过控制电机来实现车辆的行驶和转向,如无人驾驶汽车中的电机控制系统。

4. 机器人在机器人领域,单片机可以通过控制电机来实现机器人的各种运动,如机器人的行走、手臂的抓取等。

51单片机控制直流电机设计

51单片机控制直流电机设计

单片机控制小功率直流电机一. 设计要求:用单片机控制直流电机加速、减速、正反转和停止。

二. 设计方案分析1、方案设计:直流电机只要能提供一定的直流就可以转动,改变电压极性可以改变转动方向,可以通过给直流电机提供脉冲信号来驱动它,脉冲信号的占空比可以影响到直流电机的平均速度,因此可以通过调整占空比从而能实现调速的目的。

直流电机的驱动电路要有过流保护作用,可用二极管来实现,另外电机的驱动电流是比较大的所以需要用三极管来放大电流。

程序的关键就是如何实现占空比的调整,这个可以通过对51单片机定时器重装初值进行改变,从而改变时间。

设计中用到的元件:STC89C52、晶振(12MHz)、小按键、三极管、二极管、电容、电阻等。

2、背景知识介绍:直流电机调速原理本设计的主要思想为利用PWM控制占空比从而达到改变电机速度。

下面为PWM控制原理;图1为PWM降压斩波器的原理电路及输出电压波形。

在图1a中,假定晶体管V1先导通T1,秒(忽略V1的管压降,这期间电源电压Ud全部加到电枢上),然后关断T2秒(这期间电枢端电压为零)。

如此反复,则电枢端电压波形如图1b中所示。

电动机电枢端电压Ua为其平均值。

图1 PWM降压斩波器原理电路及输出电压波形a) 原理图 b)输出电压波形 1112a d d d T T U U U U T T Tα===+ (3) 式(3)中1112T T T T Tα==+ (4)α为一个周期T 中,晶体管V1导通时间的比率,称为负载率或占空比。

使用下面三种方法中的任何一种,都可以改变α的值,从而达到调压的目的:(1)定宽调频法:T1保持一定,使T2在0~∞范围内变化;(2)调宽调频法:T2保持一定,使T1在0~∞范围内变化(3)定频调宽法:T1+T2=T 保持一定,使T ,在0~T 范围内变化。

不管哪种方法,α的变化范围均为0≤α≤l ,因而电枢电压平均值Ua 的调节范围为0~Ud ,均为正值,即电动机只能在某一方向调速,称为不可逆调速。

51单片机控制直流电机调速系统流程图:

51单片机控制直流电机调速系统流程图:

51单片机控制直流电机调速系统流程图:
题目:单片机控制直流电机调速系统——软件设计
1. 编一段显示程序分别显示当前的转速和我们所需要的转速。

显示用4段数码管来实现。

2:编一段PWM调速的程序,来控制脉冲的宽度从而来控制电机的转速。

3:通过霍尔传感器测速,利用霍尔把信号传给单片机,单片机利用计数器的功能来记录转速,并同时把转速用数码管显示出来。

4:由于真实的转速和我们所设订的转速可能存在很大的误差,所以要编一段PID调速的程序,通过PID调节来减少误差。

5.要3个按键,键1实现设定转速的功能,键2实现切换功能(从所设定的转速切换到真实的转速的显示,键3实现开关的功能。

51单片机控制直流电机设计

51单片机控制直流电机设计

51单片机控制直流电机设计51单片机是一种常用的单片机,广泛应用于嵌入式系统中。

在直流电机控制方面,51单片机可以通过控制IO口输出高低电平来控制电机的转动方向和速度。

本文将介绍如何使用51单片机控制直流电机,并进行详细的设计过程。

一、硬件设计1.电源部分直流电机通常需要较高的电压才能正常运转,因此需要设计一个稳定的电源电路。

可以使用稳压电源模块或者线性稳压电源芯片作为电源模块,并根据电机的额定电压选择合适的电源电压。

2.驱动电路直流电机需要通过驱动电路来控制其转动方向和速度。

驱动电路可以使用电机驱动模块,如L298N驱动模块或者H桥驱动芯片等。

根据电机的额定电流选择合适的驱动模块,并连接正确的引脚。

3.51单片机与驱动模块连接将51单片机的IO口与驱动模块的控制引脚相连,以实现对电机的控制。

通常情况下,驱动模块的使能引脚需要接高电平使能驱动电路,转向引脚控制电机的转向,速度引脚控制电机的转速。

4.电机连接将直流电机的两根引线与驱动模块的输出端相连,确保极性正确。

二、软件设计1.51单片机初始化首先,在主函数中进行51单片机的初始化,包括设置IO口的输入输出方向、初始化定时器等。

2.设置电机转动方向通过控制驱动电路的转向引脚,可以控制电机的正转和反转。

通过设置IO口输出不同的高低电平即可实现。

3.设置电机转动速度通过占空比控制电机的转速,可以使用定时器来设置。

4.电机控制代码我们可以通过编写一些函数来实现电机的控制,例如设置方向的函数、设置速度的函数等。

然后在主函数中调用这些函数来实现电机的控制。

三、实际控制测试在完成硬件设计和软件编写后,可以将51单片机与电源和电机连接起来,并上传软件代码。

然后通过触发相应的输入信号,来控制电机的方向和速度。

通过观察电机的运动情况,可以验证电机控制系统的正确性。

总结本文介绍了51单片机控制直流电机的设计过程,包括硬件设计和软件设计。

通过控制IO口输出高低电平来实现电机的转动方向和速度。

32单片机pwm控制直流电机的实验报告

32单片机pwm控制直流电机的实验报告

32单片机pwm控制直流电机的实验报告实验名称:32单片机PWM控制直流电机实验实验目的:通过学习和实验,让学生了解32单片机PWM控制直流电机的原理和实现方式。

实验原理:PWM即脉冲宽度调制,是一种常用的调制方式。

其原理是基于脉冲的占空比,通过改变脉冲的宽度来控制输出信号的平均值。

在32单片机中,我们可以通过配置寄存器和引脚功能来实现PWM输出。

此次实验中,我们需要通过PWM控制直流电机的速度。

对于直流电机,我们可以通过改变电机的电压来改变其转速,因此我们可以通过控制PWM信号的占空比来实现对直流电机速度的控制。

实验过程:1、准备材料:32单片机、电位器、直流电机,电容等。

2、将电位器接入32单片机的ADC引脚,通过调节电位器来改变ADC引脚的电压。

3、编写程序,配置32单片机PWM模块,实现对直流电机的速度控制。

程序示例如下:#include <reg52.h>sbit IN1 = P3^0;sbit IN2 = P3^1;sbit EN = P3^2;unsigned int speed;void timer0_init(){TMOD = 0x02;TH0 = 0xff;TL0 = 0xff;ET0 = 1;EA = 1;TR0 = 1;}{timer0_init();while(1){speed = ADC_Get(1);TH0 = speed >> 8;TL0 = speed;P1 = speed;}}void pwm_init(){TMOD |= 0x10;TL1 = 0x00;TH1 = 0x00;ET1 = 1;TR1 = 1;EA = 1;}void pwm_output(unsigned int duty) {int value;value = duty*10;TL1 = value;TH1 = value >> 8;}void timer1_isr() interrupt 3{IN1 = 0;IN2 = 1;pwm_output(90);}void timer0_isr() interrupt 1{EN = 1;}4、进行编译和下载,将32单片机与电机、电源等接线好。

基于单片机的直流电机控制系统设计

基于单片机的直流电机控制系统设计

基于单片机的直流电机控制系统设计一、设计目标设计一个基于单片机的直流电机控制系统,能够实现对直流电机的速度和方向的控制。

二、设计方案1.硬件设计(1)电源电路:通过适配器将交流电转换为直流电以供系统使用。

(2)单片机选择:选择一款适合该应用的单片机,如STC89C52系列。

(3)直流电机驱动电路:使用H桥驱动电路来控制直流电机的速度和方向。

(4)编码器:使用编码器来进行速度反馈,可以根据反馈信号来调整电机的转速。

2.软件设计(1)系统初始化:对单片机进行初始化配置,包括IO口的设置、定时器的配置等。

(2)速度控制算法:设计一个控制算法,根据期望速度和实际速度的差距来调整PWM波的占空比,从而控制电机转速。

(3)方向控制算法:设计一个方向控制算法,通过改变H桥电路的输入信号来改变电机的转向。

(4)编码器反馈处理:读取编码器的信号,计算出实际速度,并与期望速度进行比较。

(5)用户接口设计:可以通过按键或者外部PWM输入调节期望速度和方向,实现用户对电机的控制。

三、系统实现1.硬件实现根据硬件设计方案,按照电路原理图进行电路连接和焊接。

确保电源电路正常工作,单片机可以正常工作,H桥驱动电路可以正常控制电机的转向和速度。

连接编码器并确保能够正常读取速度反馈信号。

2.软件实现(1)编写单片机初始化程序,进行必要的配置。

(2)编写速度控制算法,根据期望速度和实际速度的差距来调整PWM波的占空比。

(3)编写方向控制算法,根据用户输入的方向来改变H桥电路的输入信号。

(4)编写编码器反馈处理程序,读取编码器的信号并计算实际速度。

(5)编写用户接口程序,可以通过按键或者外部PWM输入来调节期望速度和方向。

四、系统测试与优化1.对系统进行功能测试,确保可以通过用户接口控制电机的转向和速度。

2.对编码器反馈进行测试,验证实际速度计算的准确性。

3.对速度和方向控制进行测试,确保系统能够按照期望速度和方向进行控制。

4.如果发现问题,对系统进行优化和修改,改进算法和调整参数。

基于单片机的直流电机控制电路设计

基于单片机的直流电机控制电路设计

基于单片机的直流电机控制电路设计1.电机驱动电路:电机驱动电路用于控制直流电机的启停、正反转和速度调节。

常见的驱动电路有H桥电路和PWM调速电路。

-H桥电路:H桥电路由四个开关管组成,可以控制电流的流动方向,从而实现正反转功能。

在单片机的控制下,通过控制开关管的导通与断开,可以实现电机的正转和反转。

-PWM调速电路:PWM调速电路通过控制脉冲宽度来调节电机的速度。

单片机产生一个固定频率的PWM信号,通过改变脉冲宽度的占空比,控制电机的速度。

占空比越大,电机转动的速度越快。

2.单片机控制电路:单片机控制电路主要实现对电机的控制和监测功能。

通过单片机的IO口输出控制信号,实现电机的启停、正反转和调速。

同时,通过AD转换接口可以实现对电机的速度、电流等参数的监控。

3.电源电路:电源电路为整个系统提供稳定的直流电源。

常见的电源电路有开关电源和线性电源。

-开关电源:开关电源通过开关器件的开关操作,实现对输入电压的调整,从而输出稳定的直流电压。

开关电源具有体积小、效率高、稳定性好等优点,是直流电机控制电路中常用的电源方式。

-线性电源:线性电源通过线性调节器件,将输入的交流电压转换为稳定的直流电压。

线性电源具有设计简单、成本低等优点,但效率较低,一般用于对电流要求较低的应用场景。

总结:基于单片机的直流电机控制电路通过驱动电路,实现对电机的启停、正反转和速度调节。

通过单片机控制电路,实现对电机的控制和监测功能。

同时,为了保证电路的正常工作,需要提供稳定的直流电源。

以上是一个基本的电机控制电路设计,具体电路设计和参数设置需根据具体的应用场景和要求来确定。

基于51单片机控制直流电机的设计

基于51单片机控制直流电机的设计

基于51单片机控制直流电机的设计设计目标:1.实现电机的正反转控制。

2.实现电机的速度控制。

3.实现电机的位置控制。

硬件设计:1.51单片机控制器:选择一款性能较好的51单片机,如STC89C522.直流电机:选择合适的直流电机,根据设计需求确定功率和转速。

3.驱动电路:为直流电机提供合适的驱动电路,可以选择H桥驱动芯片,如L298N。

4.传感器:根据设计需求,选用合适的传感器,如编码器、讯号灯等。

软件设计:1.系统初始化:对51单片机进行初始化设置,包括端口方向、定时器等配置。

2.速度控制:设计PID算法,实现对直流电机的速度控制。

通过读取传感器反馈的速度信息,与设定值进行比较,输出控制信号控制电机速度。

3.正反转控制:设计控制程序,读取输入信号控制直流电机的正反转。

可以通过输入按键、外部信号或者串口通信来实现控制。

4.位置控制:通过编码器等传感器读取直流电机的位置信息,与设定值进行比较,输出控制信号控制电机运动到目标位置。

5.通信功能:如果需要与其他设备进行通信,可以使用串口、蓝牙等通信模块实现数据传输。

设计步骤:1.确定设计需求:根据具体应用场景,确定控制电机的功能需求,包括速度控制、正反转控制和位置控制等。

2.硬件搭建:按照设计需求,选取合适的电机、驱动电路和传感器,并进行搭建和连接。

3.软件开发:根据设计目标,编写相应的程序代码,实现功能要求。

5.优化改进:根据实际使用情况,对系统进行优化改进,提高系统的性能和稳定性。

总结:基于51单片机控制直流电机的设计是一种常见的嵌入式系统开发方案。

通过合理选择硬件和设计软件,可以实现控制电机的速度、方向和位置等功能。

在实际应用中,还可以根据具体需求进行优化改进,使系统更加稳定和可靠。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程设计单片机控制直流电动机姓名:xxx学号:xxx专业:xxx指导老师:xxx组号:第xxx组单片机控制直流电机摘要随着时代的进步和科技的发展,电机调速系统在工农业生产、交通运输以及日常伤害中起着越来越重要的作用、由于直流电机剧院良好的起、制动性能,宜与在广泛范围内平滑调速。

在轧钢机、矿井卷机,挖掘机、金属切削机床、金属切削机床、造纸机高层电梯等领域中得到广泛应用。

长期以来,由于直流调速系统的性能指标优于交流调速系统。

PWM控制技术就是以该结论为理论基础,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形。

按一定的规则对各种脉冲的宽度进行调制,既可改变逆变电路输出电压大小,也可以改变输出频率。

PWM控制技术及其控制简单、灵活和动态响应好的优点而成为电子技术最广泛应用的控制方式,也是人们研究的热点。

由于必须在工作期间改变直流电机的速度,直流电机的控制是一个较困难的问题。

直流电机高效运行的最常见方法是施加一个PWM(脉宽调制)方波,其占空比对应于所需速度。

电机起到一个低通滤波器作用,将PWM信号转换为有效直流电平。

特别是对于微处理器驱动的直流电机,由于PWM信号相对容易产生,这种驱动方式使用的更为广泛。

设计要求采用单片机设计一个控制直流电机并测量转速的装置。

单片机扩展有A/D转换芯片ADC0809和D/A转换芯片DAC0832。

(1)通过改变A/D输入端可变电阻来改变A/D的输入电压,D/A输入检测量大小,进而改变直流电机的转速。

(2)手动控制。

在键盘上设置两个按键—直流电动机加速键和直流电机减速键。

在手动状态下,每按一次键,电机的转速按照约定的速率改变。

(3)键盘列扫描(4 6)。

实验原理与步进电机类似,直流电机也可精确地控制旋转速度或转矩。

直流电机是通过两个磁场的互作用产生旋转。

其结构如下页图所示,固定部分(定子)上,装设了一对直流励磁的静止的主磁极N和S,在旋转部分(转子)上装设电枢铁心。

定子与转子之间有一气隙。

在电枢铁心上放置了由A和X 两根导体连成的电枢线圈,线圈的首端和末端分别连到两个圆弧形的铜片上,此铜片称为换向片。

直流电机的速度与施加的电压成正比,输出转矩则与电流成正比。

由于必须在工作期间改变直流电机的速度,直流电机的控制是一个较困难的问题。

直流电机高效运行的最常见方法是施加一个 PWM (脉宽调制)方波,其占空比对应于所需速度。

电机起到一个低通滤波器作用,将PWM 信号转换为有效直流电平。

特别是对于微处理器驱动的直流电机,由于PWM 信号相对容易产生,这种驱动方式使用的更为广泛。

利用直流电机的速度与施加电压成正比的原理,通过滑动变阻器向ADC0809输入控制电压信号,经AD 后,输入到AT89C51中,AT89C51将此信号转发给DAC0832,通过功放电路放大后,驱动直流电机。

设计方案1.系统控制电路采用STC89C52单片机由软件产生脉冲调制信号,来对直流电机进行控制。

2.电机控制电路采用由三极管搭成的H 型桥电路来控制电机的转动。

3.键盘电路采用行式键盘实现电机转速的加速减速以及正反转的控制,在手动状态下,每按一次,其转速相应发生改变。

4.显示电路采用LM016L 对电机运动状态进行显示。

系统组成框图系统总组成框图以STC89C52为主控芯片,采用桥式电路对直流电机驱动,如下所示:硬件电路设计1.键盘控制电路按下DEC按钮,电机转速降低;按下INC按钮,电机转速增加。

2.单片机主控电路图该部分电路主要由STC89C52主控芯片和晶振组成。

STC89C52芯片是低功耗8位CMOS微处理器,提供串口程序下载口。

它主要有以下几个特点:256字节的RAM;4KB的ROM;32个通用I/O口线,为用户提供了丰富的I/O口资源;32个通用工作寄存器;2个定时器/计数器;具有6个中断源;4.0~5.5V的工作电压等。

晶振给单片机正常工作提供稳定的信号。

3.H型桥式电机驱动电路H桥式电机驱动电路包括4个三极管和一个电机。

要使电机运转,只须导通对角线上的一对三极管。

在此设计中用到的完整的驱动电路如下:主控程序程序流程总仿真电路图程序清单1.主程序#include "AT89X51.h"#include <intrins.h>#include <stdio.h>#include "led.h"#include "uart.h"#include "timer0.h"#include "timer1.h"#include "common.h"#include "ADC0831.h"#include "lcd1602.h"#include "keyboard.h"#include "ISR.h"#include "DaType_Change.h"#define DcMotor_Direction_PuChar8 code *String1 = "DC Motor Control";uChar8 code *String2 = "pwm: /100";uChar8 PWM_buff[3];void main(void){LCD_Init();timer0_Init();timer1_Init();#ifdef DcMotor_Direction_PDer1=0;#else Der1=1;#endifLED_Run_EN();WrStrLCD(0,0,String1);WrStrLCD(1,0,String2);while(1){key_Process(); //按键处理子程序Char_To_Str(PWM_duty, &PWM_buff[0]); //液晶显示子程序WrStrLCD(1,4,&PWM_buff[0]);}}2.子程序………………………………………………………………………………………………………………………………………………………#include <ADC.h>unsigned char value_converted=0x00;unsigned char value_AN6=0x00;unsigned char value_AN7=0x00;bit end_of_convertion=0;void ADC_Config(void){ADCF = 0xC0;ADCLK = 0x06;ADCON = 0x20;EA = 1;EADC = 1;while(1){ADCON &= ~0x07;ADCON |= 0x06;ADCON &= ~0x40;ADCON |= 0x08;while(!end_of_convertion);end_of_convertion=0;value_AN6=value_converted;ADCON &= ~0x07;ADCON |= 0x07;ADCON &= ~0x40;ADCON |= 0x08;while(!end_of_convertion);end_of_convertion=0;value_AN7=value_converted;}}void it_Adc(void) interrupt 8{ADCON &= ~0x10;value_converted = ADDH;end_of_convertion=1;}…………………………………………………………………………………………………………………………………………………….. #include "adc0831.h"void ADC_CLK(void){adcclk=1;_nop_();adcclk=0;_nop_();}uChar8 Read_ADC(void){uChar8 i;bit temp = ADC_Val^0;adccs=0;ADC_CLK();while(adcdo);for (i=0; i<8; i++){ADC_CLK();ADC_Val = (ADC_Val<<1)|adcdo;}adccs=1;return(ADC_Val);}void IntToStr(uInt16 t, uChar8 *str, uChar8 n){uChar8 a[5];char i, j;a[0]=(t/10000)%10; //取得整数值到数组a[1]=(t/1000)%10;a[2]=(t/100)%10;a[3]=(t/10)%10;a[4]=(t/1)%10;for(i=0; i<5; i++) //转成ASCII码a[i]=a[i]+'0';for(i=0; a[i]=='0' && i<=3; i++);//计算空格(0)数量for(j=5-n; j<i; j++) //填充空格{ *str=' '; str++; }for(; i<5; i++){ *str=a[i]; str++; } //加入有效的数字*str='\0';} …………………………………………………………………………………………………………………………………………………...... #include "beep.h"sbit beep=P1^4;void BeepRing(void){beep=0;DelayMS(100);beep=1;DelayMS(100);}………………………………………………………………………………………………………………………………………………………#include "DaType_Change.h"void Char_To_Str(uChar8 Data, uChar8 *str){uChar8 a[4];uChar8 i,j;a[0]=(Data/100)%10;a[1]=(Data/10)%10;a[2]=(Data/1)%10;for(i=0; i<3; i++) //转成ASCII码a[i]=a[i]+'0';for(i=0; a[i]=='0' && i<3; i++);for(j=0; j<i; j++) //填充空格{ *str=' '; str++; }for(; i<3; i++){ *str=a[i]; str++; } //加入有效的数字*str='\0';}………………………………………………………………………………………………………………………………………………………#include"delay.h"void DelayUS(uChar8 ValUS)//精确延时,18uS+(ValUS-1)*8us{for(;ValUS>0;ValUS--){;}}static void Delay1MS(void){uChar8 i=2,j=199;do{while(--j);}while(--i);}void DelayMS(uInt16 ValMS){uInt16 uiVal;for(uiVal=0;uiVal<ValMS;uiVal++){Delay1MS();}}………………………………………………………………………………………………………………………………………………………#include"DS18B20.h"sbit DQ=P1^0;void SendDS18B20(uChar8 SendDat){uChar8 i;for(i=0;i<8;i++){DQ=0;_nop_();_nop_();_nop_();_nop_();//延时4usif((SendDat&0x01)==0)DQ=0;elseDQ=1;SendDat=SendDat>>1;DelayUS(5);DQ=1;}}uChar8 Init_DS18B20(void){uChar8 i;DQ=0;DelayUS(61);DQ=1;DelayUS(8);for(i=0;i<100;i++){if(DQ)break;}DQ=1;DelayUS(11);return 0xff;}uChar8 ReceiveDS18B20(void){uChar8 tmp=0;uChar8 i;for(i=0;i<8;i++){tmp=tmp>>1;DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DQ=1;DelayUS(1);if(DQ)tmp|=0x80;DQ=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}return(tmp);}uInt16 ReadDS18B20(void){union{uInt16 Data;uChar8 tmp[2];}temp;temp.tmp[1]=ReceiveDS18B20();temp.tmp[0]=ReceiveDS18B20();return(temp.Data);}uInt16 GetTemper(void){uInt16 Temper;DQ=1;Init_DS18B20();SendDS18B20(0xcc);SendDS18B20(0xbe);Temper=ReadDS18B20();return(Temper);}……………………………………………………………………………………………………………………………………………………... #include "ISR.h"uInt16 ms_Counter;uChar8 ucCounter;uInt16 key_l;//按键低电平计数器uChar8 key_h;//按键高电平计数器uChar8 key;uChar8 kpush;bit Update_ADC_Flag=0;void ISR_Ext0(void) interrupt 0void ISR_timer0(void) interrupt 1{TH0=(65535-1000)/255;TL0=(65535-1000)%255;if(ms_Counter==PWM_duty){Der2 = 0;}ms_Counter++;if(ms_Counter==PWM_cycle){ms_Counter=0;if(PWM_duty) Der2 = 1;}}void ISR_timer1(void) interrupt 3{TH1=0xFB;TL1=0x1E;if((P0&0x0C)==0x0C){if((key_l>30)&&(key_l<800)&&(key_h>30))//释放按键,如果之前按键的时间<1s,读出键值{key=kpush;}if((++key_h)>200) key_h=0;//记录高电平时间key_l=0;if(key>0x80) key=0;}else{kpush=P0&0x0C;key_l++;if((key_l>800)&&(key_h>30)){key=kpush|0x80;key_h=0;key_l=0;}}}………………………………………………………………………………………………………………………………………………………#include "keyboard.h"#include "ISR.h"#include "LED.h"uChar8 PWM_duty = 50;uChar8 PWM_cycle = 100; #include "keyboard.h"#include "ISR.h"#include "LED.h"uChar8 PWM_duty = 50;uChar8 PWM_cycle = 100;//4*4矩阵式键盘扫描uChar8 Key_Scan(void){uChar8 code_h,code_l;P3=0xF0;if((P3&0xF0)!=0xF0){DelayMS(1);if((P3&0xF0)!=0xF0){code_h=0xFE;while((P3&0xF8)!=0xF0){P3=code_h;if((P3&0xF0)!=0xF0){code_l=(P3&0xF0|0x0F);return((~code_h)+(~code_l));}else code_h=(code_h<<1)|0x01;}}}return(0);}//4*4矩阵式键盘译码uChar8 Get_Key_Val(uChar8 key_temp){switch(key_temp){case 0x14 : return 1;case 0x24 : return 2;case 0x44 : return 3;case 0x12 : return 4;case 0x22 : return 5;case 0x42 : return 6;case 0x11 : return 7;case 0x21 : return 8;case 0x41 : return 9;default : return 0;}}//按键处理函数void key_Process(void){switch(key){case 0x08://KB1键按下{if(PWM_duty==100) PWM_duty=100;else PWM_duty++;break;}case 0x88://KB1键按下{if(PWM_duty==100) PWM_duty=100;else if(PWM_duty<=90)PWM_duty=PWM_duty+10;break;}case 0x04: //KB2键按下{if(PWM_duty==0x00) PWM_duty=0x00;else PWM_duty--;break;}case 0x84: //KB2键按下{if(PWM_duty==0x00) PWM_duty=0x00;else if(PWM_duty>=10)PWM_duty=PWM_duty-10;break;}default : break;}key = 0x1C;}uChar8 Key_Scan(void){uChar8 code_h,code_l;P3=0xF0;if((P3&0xF0)!=0xF0){DelayMS(1);if((P3&0xF0)!=0xF0){code_h=0xFE;while((P3&0xF8)!=0xF0){P3=code_h;if((P3&0xF0)!=0xF0){code_l=(P3&0xF0|0x0F);return((~code_h)+(~code_l));}else code_h=(code_h<<1)|0x01;}}}return(0);}//4*4矩阵式键盘译码uChar8 Get_Key_Val(uChar8 key_temp){switch(key_temp){case 0x14 : return 1;case 0x24 : return 2;case 0x44 : return 3;case 0x12 : return 4;case 0x22 : return 5;case 0x42 : return 6;case 0x11 : return 7;case 0x21 : return 8;case 0x41 : return 9;default : return 0;}}//按键处理函数void key_Process(void){switch(key){case 0x08://KB1键按下{if(PWM_duty==100) PWM_duty=100;else PWM_duty++;break;}case 0x88://KB1键按下{if(PWM_duty==100) PWM_duty=100;else if(PWM_duty<=90)PWM_duty=PWM_duty+10;break;}case 0x04: //KB2键按下{if(PWM_duty==0x00) PWM_duty=0x00;else PWM_duty--;break;}case 0x84: //KB2键按下{if(PWM_duty==0x00) PWM_duty=0x00;else if(PWM_duty>=10)PWM_duty=PWM_duty-10;break;}default : break;}key = 0x1C;………………………………………………………………………………………………………………………………………………………#include"lcd1602.h"sbit RS=P0^5;sbit RW=P0^6;sbit EN=P0^7;static void DectectBusyBit(void){P2=0xFF;RS=0;RW=1;EN=1;DelayMS(1);while(P2&0x80);EN=0;}void WrComLCD(uChar8 ComVal){RS=0;RW=0;EN=1;P2=ComVal;DelayMS(1);EN=0;}void WrDatLCD(uChar8 DatVal){RS=1;RW=0;EN=1;P2=DatVal;DelayMS(1);EN=0;}void LCD_Init(void){WrComLCD(0x38);//16x2行显示,5x7点阵,8位数据接口DelayMS(1);WrComLCD(0x38);WrComLCD(0x01);//显示清屏WrComLCD(0x06);//光标自增,画面不动DelayMS(1);WrComLCD(0x0C);//开显示,关光标并不闪烁void ClearDisLCD(void){WrComLCD(0x01);DelayMS(1);}void WrStrLCD(bit Row,uChar8 Column,uChar8 *String){if(!Row) WrComLCD(0x80+Column);else WrComLCD(0xC0+Column);while(*String){WrDatLCD(*String);String++;}}void WrCharLCD(bit Row,uChar8 Column,uChar8 Dat){if(!Row) WrComLCD(0x80+Column);else WrComLCD(0xC0+Column);WrDatLCD(Dat);}………………………………………………………………………………………………………………………………………………………#include "led.h"void LED_Run_EN(){LED_Run = 0;}void LED_Run_disEN(){LED_Run = 1;}void LED_Alarm_EN(){LED_Alarm = 0;}void LED_Alarm_disEN(){LED_Alarm = 1;}void LED_Flash(void){P0^1 = 0;DelayMS(1000);P0^1 = 1;DelayMS(1000);}………………………………………………………………………………………………………………………………………………………#include "SPI.h"char serial_data;char data_example=0x55;char data_save;bit transmit_completed= 0;void SPI_Config(void){SPCON |= 0x10; /* Master mode */SPCON |= 0x82; /* Fclk Periph/128 */SPCON |= 0x20; /* P1.1 is available as standard I/O pin */SPCON &= ~0x08; /* CPOL=0; transmit mode example */SPCON |= 0x04; /* CPHA=1; transmit mode example */IEN1 |= 0x04; /* enable spi interrupt */SPCON |= 0x40; /* run spi */EA=1; /* enable interrupts */}void it_SPI(void) interrupt 9 /* interrupt address is 0x004B */{switch( SPSTA ) /* read and clear spi status register */{case 0x80:serial_data=SPDAT;transmit_completed=1;break;case 0x10:break;case 0x40:break;}}………………………………………………………………………………………………………………………………………………………#include"timer0.h"void timer0_Init(void){TMOD=((TMOD&0xF0)|0x01);//定时器0工作在模式1下//每1mS中断一次TH0=(65535-1000)/255;TL0=(65535-1000)%255;EA=1;//开总中断ET0=1;//打开定时器0的中断TR0=1;//启动定时器0}………………………………………………………………………………………………………………………………………………………#include "timer1.h"void timer1_Init(void){TMOD=((TMOD&0X0F)|0x10);//定时器1工作在模式1下TH1=0xFB;TL1=0x1E;EA=1;//开总中断ET1=1;TR1=1;}………………………………………………………………………………………………………………………………………………………#include"uart.h"bit bStatusFlag=0;void UART_Init(void){TMOD&=0x0F;TMOD|=0x20;TH1=0xFD;TL1=0xFD;ET1=0;TR1=1;SCON|=0X50;}void UART_SendOneByte(uChar8 uDat){SBUF=uDat;while(!TI);TI=0;}void UART_SendString(uChar8 *upStr){while(*upStr){UART_SendOneByte(*upStr++);}}uChar8 UART_RecDat(void){static uChar8 uReceiveData;if(RI){uReceiveData=SBUF;RI=0;bStatusFlag=1;}return(uReceiveData);}课程设计心得体会这次课程设计虽然时间有限,但在设计的过程中,我对单片机的应用有了更深的了解。

相关文档
最新文档