基于51单片机的直流电机测速系统(proteus仿真 程序 电路 代码)

摘要

本文介绍了以单片机AT89C51为核心的直流电机测速系统。系统以L298作为直流电机驱动芯片,通过改变引脚的电压的输出PWM波,来实现直流电机的驱动及其速度的调节,通过键盘来给定的直流电机转速和方向的信息,并由霍尔传感器测定其转速,经单片机处理后由以T6963C为核心的LCD PG160128A 显示输出。软件使用C语言进行编程,简单,方便。最后使用Keil和Proteus 进行联调仿真。模拟实现直流电机的速度的测定和调节直流电机的正转、反转、加速、减速。本系统具有精度高,成本低,使用方便等优点。

第1章系统分析和主要元件
第1.1节系统分析
本设计的论点是基于单片机的直流电机测速系统,系统的主要构成包括电源系统,输入系统,核心芯片,输出系统。
电源系统把标准的220V电源转化成稳定的直流+5V电源的任务,包含变压、整流、滤波和稳压四部分。
输入系统由键盘,霍尔传感器构成。键盘获取按键信息,单片机通过4次读P1_ 4到P1_7信号,来确定4X4键盘的给定的直流电机转速和方向的信息。霍尔传感器给单片机P3.4/T0脉冲信号,由单片机计算出直流电机的转速。核心芯片采用的是我们所熟知的AT89C51.单片机的主要任务是接收来自键盘和霍尔传感器的信号,处理运算后通过引脚来控制LM298 电机控制芯片,来达到驱动直流电机.的目的。同时单片机将处理好的信息显示到LCD.上。单片机计算并生成PWM波。输出系统由L298及其控制的直流电机,LCD显示器组成。L298负责接收单片机的信号从而实现直流电机启动,停止,加速,减速,正转,反转的功能。LCD显示器通过接收单片机输出的信号,来显示直流电机的转速和方向。
第1.2节单片机芯片
AT89C51 (见图1-1)是一-种带4K字节闪烁可编程可擦除只读存储器的低电压、高性能CMOS,8位微处理器。单片机的可擦除只读存储器可以反复擦除100 次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。AT89C51单片机的基本特性
1.与MCS-51 兼容
2.4K字节可编程闪烁存储器
3.寿命: 1000 写/擦循环
4.数据保留时间: 10 年

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA55S15a2Q5bel56iL5biI4oCU6ICB5rK55p2h,size_6,color_FFFFFF,t_70,g_se,x_16

第1.4节霍尔传感器

采用霍尔元件测量转速是较为常用的测量方法。霍尔传感器是根据霍尔效应制作的一种磁场传感器。它具有对磁场敏感、结构简单、体积小、频率响应宽、输出电压变化大和使用寿命长等优点,因此,在测量、自动化、计算机和信息技术等领域得到广泛的应用。霍尔传感器分为线性型霍尔传感器和开关型霍尔传感器两种。线性型霍尔传感器由霍尔元件、线性放大器和射极跟随器组成,它输出模拟量。开关型霍尔传感器由稳压器、霍尔元件、差分放大器,斯密特触发器和输出级组成,它输出数字量。

这里的传感器我们采用用市场上应用较多的霍尔开关传感器3010T它采用三端平塑封装,具有工作电压范围宽、外围电路简单、输出电平与各种数字电路兼容、可靠性高等优点。

第1.5节LCD显示器

PG160128A是内置T6963C控制器的液晶模块,T6963C 液晶显示控制器多用于中小规模的液晶显示器件,常被装配在图形液晶显示模块上,以内藏控制器型图形液晶显示模块的形式出现。
watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA55S15a2Q5bel56iL5biI4oCU6ICB5rK55p2h,size_6,color_FFFFFF,t_70,g_se,x_16

T6963C的特点

(1) T6963C是点阵式液晶图形显示控制器,它能直接与80系列的8位微处理器接口。(2) T6963C的字符字体由硬件设置其字体有4种。

(3) T6963C的占空比可从1/16到1/128。

(4)T6963C可以图形方式文本方式及图形和文本合成方式进行显示以及文本方式下的特征显示还可以实现图形拷贝操作等等。

(5) T6963C具有内部字符发生器CGROM共有128个字符T6963C 可管理64K显示缓冲区及字符发生器CGRAM并允许MPU随时访问显示缓冲区甚至可以进行位操作。

引脚分配

1 FG:外壳接地

2 VSS: 公共接地端

3 VDD: 电源供应

4 CON:对比调整

5 /WR: 读选通信号,低电平有效输入信号

6 /RD :写选通信号,低申平有效 输入信号

8 /RESET: 为低电平 有效的复位信号

9 D0-D7: LCD与单片机接口的数据总线

10 FSI,FS0:显 示字符的字体选择系统设计
第4章软件仿真

第4.1节仿真方法

首先建立源程序文件,然后选择project/Build target 进行源程序文件的编译。如果源程序有语法错误,编译系统会给出可能出错的地方,改正后,重新编译,一直到没有错误为止。最后打开AT89C51的属性面板,在Program File的属性栏中添加编译完成的HEX文件。在窗口的左卜方可以看釗仿真的控制按钮。.

单击运行按钮,启动Proteus ISIS 仿真。单击暂停按钮或者选择Debug 菜单下的Start/Restart Debug就可以进行程序的调试。Proteus 处于调试状态时,在Debug菜单下可选择查看AT89C51内部数据存储区和特殊功能寄存器区。点击单步执行,可观察各寄存器和内部数据存储区的变化情况,方便程序的查错和调试。

第4.2节仿真

4.2. 1.直流电机正转

原理:当引脚IN1为高电平,IN2位低电平,ENA为高电平时,流经电机的电流为顺时针,所以直流电机正转。

按“=”键时实现直流电机正转(见图4-1), 按键盘“+”实现直流电机速度加快,按键盘“_”实现直流电机速度降低,c处的霍尔传感器计数,并将信息传送给单片机处理,最后在LCD上显示。

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA55S15a2Q5bel56iL5biI4oCU6ICB5rK55p2h,size_20,color_FFFFFF,t_70,g_se,x_16
仿真图
**

结论

**

基于单片机的直流电机测速系统设计以AT89C51为硬件核心,通过键盘给定的信息经单片机运算又由L298 专用驱动芯片来实现直流电机的正转、反转、加速、减速,同时利用霍尔传感器来测定直流电机的转速,并由LCD液晶屏显示电机转速等相关信息。AT89C51价格低廉且应用广泛,而利用芯片L298驱动直流电机,使硬件电路搭建简单。

6 代码及仿真

 

 

#include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define LED_DAT P0 sbit LED_SEG0 = P2^7; sbit LED_SEG1 = P2^6; sbit LED_SEG2 = P2^5; sbit LED_SEG3 = P2^4; #define TIME_CYLC 100 //12M晶振,定时器10ms 中断一次 我们1秒计算一次转速 // 1000ms/10ms = 100 #define PLUS_PER 10 //码盘的齿数 ,这里假定码盘上有10个齿,即传感器检测到10个脉冲,认为1圈 #define K 1.65 //校准系数 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar data Disbuf[4];// 显示缓冲区 uint Tcounter = 0; //时间计数器 bit Flag_Fresh = 0; // 刷新标志 bit Flag_clac = 0; //计算转速标志 bit Flag_Err = 0; //超量程标志 void DisplayFresh();//在数码管上显示一个四位数 void ClacSpeed();//计算转速,并把结果放入数码管缓冲区 void init_timer();//初始化定时器T0\T1 void Delay(uint ms);//延时函数 void it_timer0() interrupt 1 /* interrupt address is 0x000b */ { TF0 = 0; //定时器 T0用于数码管的动态刷新 TH0 = 0xC0; TL0 = 0x00; Flag_Fresh = 1; Tcounter++; if(Tcounter>TIME_CYLC) { Flag_clac = 1;//周期到,该重新计算转速了 } } void it_timer1() interrupt 3 /* interrupt address is 0x001b */ { TF1 = 0; //定时器T1用于单位时间内收到的脉冲数 //要速度不是很快,T1永远不会益处 Flag_Err = 1; //如果速度很高,我们应考虑另外一种测速方法:T测速法 } void main(void) { Disbuf[0] = 0; //开机时,初始化为0000 Disbuf[1] = 0; Disbuf[2] = 0; Disbuf[3] = 0; init_timer(); while(1) { if(Flag_Fresh) { Flag_Fresh = 0; DisplayFresh(); // 定时刷新数码管显示 } if(Flag_clac) { Flag_clac = 0; ClacSpeed(); //计算转速,并把结果放入数码管缓冲区 Tcounter = 0;//周期定时 清零 TH1=TL1 = 0x00;//脉冲计数清零 } if(Flag_Err) //超量程处理 { Disbuf[0] = 0x9e; //开机时,初始化为0000 Disbuf[1] = 0x9e; Disbuf[2] = 0x9e; Disbuf[3] = 0x9e; while(1) { DisplayFresh();//不再测速 等待复位i } } } } //在数码管上显示一个四位数 void DisplayFresh() { P2 |= 0xF0; LED_SEG0 = 0; LED_DAT = table[Disbuf[0]]; Delay(1); P2 |= 0xF0; LED_SEG1 = 0; LED_DAT = table[Disbuf[1]]; Delay(1); P2 |= 0xF0; LED_SEG2 = 0; LED_DAT = table[Disbuf[2]]; Delay(1); P2 |= 0xF0; LED_SEG3 = 0; LED_DAT = table[Disbuf[3]]; Delay(1); P2 |= 0xF0; } //计算转速,并把结果放入数码管缓冲区 void ClacSpeed() { uint speed ; uint PlusCounter; PlusCounter = TH1*256 + TL1; speed =6*PlusCounter/K; //K是校准系数,如速度不准,调节K的大小 Disbuf[3] = (speed/1000)%10; Disbuf[2] = (speed/100)%10; Disbuf[1] = (speed/10)%10; Disbuf[0] = speed%10; } void init_timer()//初始化定时器T0\T1 { TMOD=0x51; //定时器0工作于定时方式1,定时器1工作于计数方式 TH0=(65536-10000)/256; TL0=(65536-10000)%256; //TO定时时间为10000个周期即10毫秒 TH1=0x00; TL1=0x00; ET0=1; /* enable timer0 interrupt */ EA=1; /* enable interrupts */ TR0=1; /* timer0 run */ ET1=1; /* enable timer1 interrupt */ EA=1; /* enable interrupts */ TR1=1; } //延时函数 void Delay(uint ms) { uchar i; while(ms--) for(i=0;i<100;i++); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值