1、五、软件设计由于实验箱已给出霍尔传感器测量转速的硬件电路,实验中只需要设计软件实现通过AT89C51,单片机完成对电机转速脉冲计数的控制,读取寄存器完成转速频率的确定。其测量过程是测量转速的霍尔传感器和电机机轴同轴连接,机轴每转一周,产生一定量的脉冲个数,由霍尔器件电路输出。经过电耦合器后,成为转数计数器的计数脉冲。同时霍尔传感器电路输出幅度为12V的脉冲经光电耦合后降为5V,保持同单片机AT89C51逻辑电平相一致,控制计数时间,即可实现计数器的计数值对应机轴的转速值。主CPU将该值数据处理后,在12864LCD液晶显示器上显示出来。本程序通过测频的方法计算电动机的转速。电动机转一周,霍尔传
2、感器会产生一个负脉冲信号。程序中将T0当作计数器使用,记录电动机转动的圈数;T1作定时器用,确定计数周期。设定计数周期为1s,上一周期计数器记录下的电机转动圈数,作为当前的转速显示。下面是程序主流程图:六:实现程序:1 12864驱动:#include/*/延时函数void DelayUs(unsigned char t) /当t=1时,延时1.1us 0t255 while(-t);void DelayMs(unsigned char t) /当t=1时,延时1.0ms 0 unsigned int j; while(t-) for(j=0;j100;j+); /LCD12864液晶部分#d
3、efine LCD12864_DataPort P1sbit LCD12864_RS = P25;sbit LCD12864_RW = P26;sbit LCD12864_EN = P27;/sbit LCD12864_Busy = P07; void LCD12864_WriteData(unsigned char content);void LCD12864_WriteCommand(unsigned char content);void LCD12864_CleanRam(void);void LCD12864_Init(void);void LCD12864_Init(void) LC
4、D12864_WriteCommand(0x06); /光标的移动方向 LCD12864_WriteCommand(0x0c); /开显示,关游标 LCD12864_CleanRam(); /清屏 LCD12864_WriteCommand(0x01); /?void LCD12864_CleanRam(void) LCD12864_WriteCommand(0x30);void LCD12864_WriteData(unsigned char content) /LCD12864_CheckBusy(); LCD12864_RS=1; LCD12864_RW=0; LCD12864_Data
5、Port=content; LCD12864_EN=1; LCD12864_EN=0;void LCD12864_WriteCommand(unsigned char content) LCD12864_RS=0;void LCD12864_Gotoxy(unsigned char y,unsigned char x) if(y=1) LCD12864_WriteCommand(0x80|x); if(y=2) LCD12864_WriteCommand(0x90|x); if(y=3) LCD12864_WriteCommand(0x80|x)+8); if(y=4) LCD12864_Wr
6、iteCommand(0x90|x)+8);void LCD12864_Display(unsigned char x,y,unsigned char *str) LCD12864_Gotoxy(x,y); DelayMs(5); while(*str!=0) LCD12864_WriteData(*str); str+; extern void Displaynum(char x,char y,float num) char s4; sprintf(s,%2.1f, num);3.141593 LCD12864_Display(x,y,s);2 主要程序:/*头文件调用*/ #include
7、 intrins.hmath.h#include 12864.h宏定义*/#define uchar unsigned char#define uint unsigned int/*全局变量及数组定义*/uchar code g_arInitDisplay117=The rotate speed; /液晶初始化会死要显示的字符串。uchar code g_arInitDisplay28=round/s /注意:数组的长度至少要比字符串长度大一。 /数组长度选择不合理,会出现意想不到的错误uchar g_arRoundDisplay5=0; /此数组将以字符形式存放将要显示在1602上的数值uc
8、har g_ucT1_OutTimes; /Timer1的溢出次数,用以计时1suint g_uiRound; /电动机的转动圈数,每秒更新一次,可作为电机转速/* Function:Timers_init Description:初始化时钟,T0工作于16位计数模式,记录电机转速;T1为16位定时模式 ,用于管理时间阀门。Calls:不调用其他函数 Called By:main() Input:无 Output:Return:Others:仅在系统初始化时使用一次*/void Timers_init() /定时器的初始化 TMOD=0x15; /T0工作于16位计数模式;T1为16位定时模式
9、 TCON=0x50; /TR1、TR0为1,其余为0 EA=1; /开总中断 ET1=1; /允许T1溢出中断 TH0=0; TL0=0; /电动机每秒钟转动的圈数在200圈之内 TH1=(65536-50000)/256; TL1=(65536-50000)%256; /T1用于计时1s,中断20次约为1sLCD_InitDisplay 12864初始显示内容 Display void LCD_InitDisplay() /在12864上显示出初始字符串 LCD12864_Display(0,0,g_arInitDisplay1); LCD12864_Display(6,1,g_arIni
10、tDisplay2);main 主函数 Timers_init(),LcdInit(), LCD_InitDisplay(), sprintf(),Display()主函数void main() Timers_init(); /定时器初始化 LCD12864_Init(); /液晶初始化 LCD_InitDisplay(); /在12864上显示出初始字符串 while(1) if(g_ucT1_OutTimes=20) /中断20次时,计时达到1s TR0=0; /关定时器0 g_uiRound=256*TH0+TL0; /读取定时器0的计数值,即上一周期电机转动的圈数 TH0=0; TL0
11、=0; /定时器0计数值清零,准备下次计数 TR0=1; /打开定时器0,开始新一轮计数 sprintf(g_arRoundDisplay,%4d,g_uiRound); /将数值Round以字符形式打印到Round_display数组里面 LCD12864_Display(1,1,g_arRoundDisplay); /在12864上显示Round_display里面的字符,即显示Round的值 g_ucT1_OutTimes=0; /T1中断次数清零,开始下一周期的计时 Timer1_INT Timer1的中断函数,中断20次为计时1s 无中断函数,不被任何函数调用void Timer1_
12、INT() interrupt 3 TR1=0; /关闭定时器1 /重装初值,每次计时50ms TR1=1; /定时器1开始计数 g_ucT1_OutTimes+; /Timer0每溢出一次,T1_OutTimes数值加1实验感想: 本次实验在小组成员的共同努力下,完成了通过单片机控制霍尔传感器测量电机转换的速度,掌握了霍尔测速的方法及霍尔测速的原理。通过软件方式实现了电机转速的测量并能在12864液晶频上显示结果。由于实验硬件电路在试验箱上已经给出,实验的操作主要考验软件的编写和开发上,因为自身软件方面基础比较薄弱,因此主要负责查询12864驱动资料辅助软件设计并调试程序,小组的另一位成员则负责程序的主要设计工作。通过实验更加认识到自己的不足,在以后的学习生活中应该更加注重51开发和自身软件这一方面的学习。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2