目 录
一、前言--------------------------------------3
1.1课程
任务-------------------------------3
1.2设计目的-----------------------------------3
二、电机转速测量的原理和方法------------------3
三、系统硬件设计------------------------------4
3.1电路原理图总图---------------------------- 4
3.2 光电传感器及其信号放大电路-----------------5
3.3施密特触发电路-----------------------------5
3.4电源供电电路-------------------------------6
3.5单片机时钟电路-----------------------------6
3.6单片机复位电路-----------------------------7
3.7显示电路-----------------------------------7
3.8光电传感器原理-----------------------------8
3.9AT89C52单片机芯片功能及参数----------------8
四、系统软件设计------------------------------10
4.1软件
图及编写程序-----------------------10
4.2程序调试及误差分析-------------------------15
五、实验总结----------------------------------15
附录:参考文献及元件清单-----------------------16
仿真图及PCB截图--------------------------17
一、前言
1. 课程设计任务
本次课程设计要求设计制作一个用光电转换方式来测量电动机的转速系统。测速对象为一台额定电压为5V的直流电动机,其转速受电枢电压控制,用改变电枢电压的方法进行调速。
2. 设计目的
(1)熟悉和掌握51单片机的原理、结构和应用。
(2)了解光电转换的方式及其实际应用。
(2)用PROTUES与PROTEL 99等软件进行电路的设计,进一步了解相关软件的功能及设计的规则。
二、
的提出与论证
要测速,首先要解决是采样的问题。在使用模拟技术制作测速
时,常用测速发电机的方法,即将测速发电机的转轴与待测轴相连,测速发电机的电压高低反映了转速的高低。使用单片机进行测速,可以使用简单的脉冲计数法。只要转轴每旋转一周,产生一个或固定的多个脉冲,并将脉冲送入单片机中进行计数,即可获得转速的信息。
数据处理可使用直接测频法。把被测频率信号经过脉冲形成电路后加到闸门的一个输入端,只有在闸门开通时间1秒内,被计数的脉冲被送到计数器进行计数。设计数器的值为N,由频率定义式计算得到被测信号频率为f=N/T=N。
三、系统硬件设计
3.1电路原理图总图 :
光电传感器接收信号并经LM324芯片放大信号输出,施密特触发器对信号整形再输入单片机,单片机对脉冲进行计数并输出至数码管显示运算结果。
3.2 光电传感器及其信号放大电路
光电传感器把被测量的变化转换成光信号的变化,然后借助光电元件进一步将光信号转换成电信号。再经由LM324运算放大器将其信号放大。
3.3施密特触发器
LM324输出的放大脉冲信号经由施密特触发器整形后再输出到单片机的T0口。
3.4电源供电电路
供电部分使用发光二极管表示电路是否接通。
3.5单片机时钟电路:
如图所示是采用内部震荡方式使89C52单片机产生时钟信号,在单片机芯片的X1和X2引脚两端跨接石英晶体振荡器和两个电容构成稳定的自激振荡电路,其中电容对振荡频率起微调作用。晶振频率为12MHZ
3.6单片机复位电路:
复位时单片机的初始化操作。其功能是使CPU从0000H单元开始执行程序。除了使系统正常初始化外,当程序运行出错或操作错误使系统处于死锁状态时,也需按复位键重启。如图,通过手动按键经复位端经电阻和5V电源接通实现复位功能。
3.7显示及驱动电路
该系统采用四位LED共阳极显示器动态显示数据。并使用PNP型三极管作为驱动电路,在基极加以分压限流电阻,以防止数码管因电流过大而烧坏。
3.8光电传感器原理
光电传感器是应用非常广泛的一种器件,有各种各样的形式,如透射式、反射式等,基本的原理就是当发射管光照射到接收管时,接收管导通,反之关断。以透射式为例,如图2所示,当不透光的物体挡住发射与接收之间的间隙时,开关管关断,否则打开。为此,可以制作一个遮光叶片如图3所示,安装在转轴上,当扇叶经过时,产生脉冲信号。当叶片数较多时,旋转一周可以获得多个脉冲信号。
光电传感器的原理图
遮光叶片
3.9 AT89C52单片机芯片的功能及参数
AT89C52是CHMOS工艺技术制造的高性能8位单片机,内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。
AT89C52芯片引脚功能:
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口作为AT89C51的一些特殊功能口,管脚 备选功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA / VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
四、系统软件设定:
4.1系统流程图及编写程序
1). 系统板上硬件连线
(1). 把“单片机系统”区域中的P0.0-P0.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。
(2). 把“单片机系统”区域中的P2.0-P2.3与“动态数码显示”区域中的S1S2S3S4端口用8芯排线连接。
(3). 把“单片机系统”区域中的P3.4(T0)端子用导线连接到“施密特触发器”区域中的3端口
(4). 把光电传感器输出接入LM324运放的输入端,运放的输出接入“施密特触发器”区域中的2端口。
2). 程序设计内容
(1). 定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz,因此:T0的最大计数频率为25KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。
(2). T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。因此每次放入定时器1的初值为TH1=65536/256,TL1=65536%256。
3) . 系统流程
3).源程序
#include< AT89X52.H >
#include
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7 };//对应四位数码管
unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
//共阳极码段
unsigned char dispbuf[5]={0,0,0,0,0};
unsigned char temp[6];
unsigned char dispcount;
unsigned char timecount;
bit flag; //标志位
unsigned long x,y;
void delay1ms(unsigned char t) // 延时1ms
{
unsigned char j,tt;
for(j=0;j