液晶显示电机测速系统 程序清单
电机转速测量源程序 lcd显示
#include<A T89X52.H>unsigned char dispcount;unsigned char count;unsigned int timecount;bit flag; //将flag定义为位变量//long double a;float x;unsigned char b1,b2,b3,b4,b5,b6;unsigned int b0,b00;#define LCD_DA TA P2 //LCD DA TA#define LCD_BUSY0x80sbit LCD_RS = P1^1;sbit LCD_RW = P1^2;sbit LCD_E = P1^3;/***************************1秒延时子程序start***************************/ void Delay1ms(unsigned int count){unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);}///////////////////////void dellay(unsigned int h){while(h--); //0.01MS}/**************************************************** 函数名称: WriteDataLcd** 入口参数:wdata(unsigned char型)** 出口参数:无** 功能描述: 写数据到LCD****************************************************/void WriteDataLcd(unsigned char wdata){LCD_DA TA=wdata;LCD_RS=1;LCD_RW=0;LCD_E=1;dellay(500); //短暂延时,代替检测忙状态LCD_E=0;}/**************************************************** 函数名称: WriteCommandLcd** 入口参数:wdata(unsigned char型)** 出口参数:无** 功能描述: 写命令到LCD****************************************************/void WriteCommandLcd(unsigned char wdata){LCD_DA TA=wdata;LCD_RS=0;LCD_RW=0;LCD_E=1;dellay(500); //短暂延时,代替检测忙状态LCD_E=0;}//LCD初始化void lcd_init(void){LCD_DA TA=0;WriteCommandLcd(0x38);dellay(2000);WriteCommandLcd(0x38); //显示模式设置WriteCommandLcd(0x08); //关闭显示WriteCommandLcd(0x01); //显示清屏WriteCommandLcd(0x06); //显示光标移动设置WriteCommandLcd(0x0c); //显示开及光标移动设置//改变显示模式:文字不动,光标自动右移?}/**************************************************** 函数名称: display_xy** 入口参数:x(unsigned char型),y(unsigned char型)** 出口参数:无** 功能描述: 设置光标位置,x是列号,y是行号****************************************************/void display_xy(unsigned char x,unsigned char y){if(y==1)x+=0x40;x+=0x80;WriteCommandLcd(x);}/********************************************************************** 函数名称: display_char** 入口参数:x(unsigned char型),y(unsigned char型),dat(unsigned char型)** 出口参数:无** 功能描述: 在具体位置显示单个字符,x是列号,y是行号*********************************************************************/void display_char(unsigned char x,unsigned char y,unsigned char dat){display_xy(x,y);WriteDataLcd(dat);}/********************************************************************* ** 函数名称: display_string** 入口参数:x(unsigned char型),y(unsigned char型),s(指针型)** 出口参数:无** 功能描述: 在具体位置显示字符串,以/0结束,x是列号,y是行号**********************************************************************/ void display_string(unsigned char x,unsigned char y,unsigned char *s){display_xy(x,y);while(*s){WriteDataLcd(*s);s++;}}void main(void){IP=0x02; //将T0定义为高优先级,使CPU优先响应其中断//count=0; //计数脉冲赋初值0//TMOD=0x15; //给TOMD送方式控制字,使T0为计数方式,T1为定时方式// TH0=0;TL0=0;TH1=0XF0;TL1=0X60;TR1=1;ET1=1;TR0=1;ET0=1;EA=1;lcd_init();while(1){if(flag==1){flag=0; //位变量清0//a=count*65536+TH0*256+TL0; // 计算脉冲个数//x=a/10/60;//x=0.5b0=x*10;//b1=10b1=b0%10;//小数位b00=b0/10;//整数4位b2=b00%10;//个位b3=(b00/10)%10;//十位b4=(b00/100)%10;//baib5=b00/1000;//千位timecount=0; //重新使T0计数//count=0;TH0=0;TL0=0;TR0=1;}display_char(5,0,b1|0x30);display_char(4,0,0x2e);display_char(3,0,b2|0x30);display_char(2,0,b3|0x30);display_char(1,0,b4|0x30);display_char(0,0,b5|0x30);display_string(6,0,"(r/min)");}}void to (void) interrupt 1 using 0 // 中断服务函数说明// {count++; //溢出的次数//}void t1 (void) interrupt 3 using 1 //中断服务函数说明// {TH1=0XF0; //重新给T1填装定时初值//TL1=0X60;timecount++;dispcount++;if(dispcount==6){dispcount=0; // 6位扫描完后清0//}if(timecount==250)//时间到1秒关掉计数器//{TR0=0; //时间到10秒关掉计数器//timecount=0;flag=1; //位变量置1//}}。
电机测速系统
目录1 引言 (1)1.1 电机速度检测简介 (1)1.2 电机速度检测的发展趋势 (1)1.3 本设计所要实现的目标 (1)2设计方案的选择 (2)2.1 方案一:采用以PLC为核心的控制方案 (2)2.2 方案二:采用以单片机为核心的控制方案 (2)3主要元器件介绍 (4)3.1 核心元器件AT89S51 (4)3.2 电压比较器LM339 (8)3.3 光电元器件MOC70T2 (10)4系统硬件构成 (11)4.1 设计原理 (11)4.2 电路总体构成 (11)4.3 直流电机电源部分 (12)4.4 光电信号转换及电压比较器部分 (12)4.5 复位部位 (13)4.6 晶振部分 (14)4.7 数码管显示部分 (14)5 系统软件设计 (16)6结论 (17)谢词 (18)参考文献 (19)附录 (20)1引言1.1电机速度检测简介电机速度检测是社会生产和日常生活中重要的测量和控制对象。
近年来,由于世界范围内对转速测量合理利用的日益重视,促使转速测量技术的迅速发展,各种新型的测量仪表相继问世并越来越多地得到应用。
进行转速测量的检测控制,可以使用多种传感器。
由于技术保密,厂家不会提供详细电路图和源代码,用户很难自行进行二次开发和改进。
针对这种现状,使用光电传感器结合AT89S51型单片机设计的一种转速测量与控制系统。
AT89S51单片机采用了CMOS工艺和高密度非易失性存储器技术,而且其输入/输出引脚和指令系统都与MCS-51兼容,是开发该系统的适合芯片。
目前科研生产中采用的速度测量方法可分为两类;直接测量法和间接测量法两大类。
直接测量法是通过某种测量原理或效应直接获得速度量, 如多普勒测速仪、空间滤波测速等。
这种方法的最大优点是反应快、可测量瞬时速度,但设备成本高,且受到大气物理环境的限制。
间接测量法是测量目标的移动距离和时间, 通过计算得到速度量, 如光电测速、光栅测速、磁栅测速和图像测速等,用于测量小型弹丸的天幕法和光幕法测速系统、用于车辆测速的激光测速仪,以及用于生产流水线上的光电脉冲测速方法等等。
课程设计基于单片机的直流电机测速调速及显示系统设计
基于单片机的直流电机测速、调速及显示系统设计课程设计报告题目:基于单片机的直流电机测速、调速及显示系统设计摘要本文要紧研究了利用Quick51系列单片机操纵PWM信号从而实现对直流电机转速进行操纵的方式。
单片机具有体积小、功能强、本钱低、应用面普遍等优势,能够说,智能操纵与自动操纵的核心确实是单片机。
目前,一个学习与应用单片机的高潮在全社会大规模地兴起。
学习单片机的最有效方式确实是理论与实践并重,本文用8051单片机自制了一个采纳了专门的芯片组成了PWM信号的发生系统,而且对PWM信号的原理、产生方式和如何通过软件编程对PWM信号占空比进行调剂,从而操纵其输入信号波形等均作了详细的论述。
还对直流电机的速度进行了测量和显示。
关键词:单片机、PWM、调速、测速、显示系统目录摘要 (1)目录 (2)第一章概述 (3)1.1概述 (3)Quick51的技术简介和进展前景 (3)1.2.1 SmartSOPC与Quick51 (3)1.2.2 Quick51特性 (4)第二章整体方案设计 (5)8051单片机简介 (6)PWM信号发生电路设计 (12)2.2.1 P WM的大体原理 (12)128*64液晶显示 (13)第三章硬件设计与连接 (13)传感器电路设计 (13)信号处置电路设计 (16)存储器电路设计 (17)I2C总线概述 (17)存储器电路 (18)显示电路设计 (18)PWM信号发生电路设计 (19)第四章软件设计 (20)系统软件总流程图 (20)程序清单 (21)答辩问题 (22)第一章概述1.1概述本文要紧研究了利用Quick51系列单片机,通过PWM方式操纵直流电机调速的方式。
冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其成效大体相同。
PWM操纵技术确实是以该结论为理论基础,使输出端取得一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形。
按必然的规那么对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率。
MCS-51单片机电机转速控制及测速显示系统
MCS-51单片机电机转速控制及测速显示系统简介MCS-51单片机是一种广泛应用于嵌入式系统的单芯片微型计算机。
本文将介绍基于MCS-51单片机的电机转速控制及测速显示系统。
该系统通过对电机信号进行处理,实现了对电机转速的控制和测速。
系统组成该系统由电机、电机驱动电路、MCS-51单片机、显示模块等组成。
电机驱动电路:使用了L298N电机驱动芯片,可以为电机提供双向直流电源。
该电子板还添加了变阻器控制,通过调节电子板上的两个旋钮来改变电机的转速和方向。
MCS-51单片机:采用AT89S52芯片,主控为MCS-51单片机,在控制电机的同时,还可以测量电机的转速。
通过单片机与电机驱动电路的控制,来控制电机的转速。
显示模块:采用了LCD2004液晶显示模块,可实现对转速和程序运行状态的显示。
系统原理当电机启动时,读取电机反馈的信号,并将该信号传递给MCS-51单片机进行处理。
根据控制算法,单片机输出PWM(脉冲宽度调制)信号给电机驱动模块,从而改变电机的转速和方向。
同时,单片机还可以测量电机旋转的速度,将其显示在LCD2004液晶显示器上。
当用户需要改变电机的转速时,可以通过旋转电子板上的旋钮来改变电机的转速和方向。
同时,LCD2004显示器可以显示电机的当前实际速度和设定速度,帮助用户更好的控制电机的运转。
系统功能该系统具有以下功能:1.控制电机的转速和方向;2.测量电机的转速;3.显示电机的当前实际速度和设定速度。
系统优势该系统采用MCS-51单片机,具有代码量小、容易维护、功耗低等优势,适合于嵌入式系统中的电机转速控制应用。
此外,显示模块也可以提供对系统状态的及时监控和反馈,便于故障排除。
本文介绍了基于MCS-51单片机的电机转速控制及测速显示系统。
该系统通过对电机信号进行处理,实现了对电机转速的控制和测速。
该系统具有代码量小、容易维护、功耗低等优势,适合于嵌入式系统中的电机转速控制应用。
同时,显示模块也可以提供对系统状态的及时监控和反馈,便于故障排除。
LCD液晶屏测试程序
/// //LCD12864液晶屏测试程序(已通过)//////IIIIII //液晶屏型号:HJ12864M-1//////// /#in elude <reg52.h>#define uchar unsigned char#define uint unsigned int//8bit 数据接入IO 口#define Part P0 〃P0 接8 位数据线//控制数据端sbit LCD_RS=P2A5; //定义12864液晶RS端,寄存器选择信号H:数据寄存器L:指令寄存器sbit LCD_RW=P2AS; // 定义12864 液晶RV端,读/ 写信号H:读L:写sbit LCD_EN=P2A7; //定义12864液晶LCDE端,片选信号下降沿触发,锁存数据sbit LCD_PSB=P3A2; // 定义12864液晶PSB端, H:并行L:串行sbit LCD_RST=P3A4; // 定义12864液晶RST端, H:不复位L:复位uchar code dis1[]={ "床前明月光"};uchar code dis2[]={ "疑是地上霜"};uchar code dis4[]={ "低头思故乡"}; uchar code dis3[]={ "举头望明月"};//毫秒延时函数void delay( uint xms){uint i,j;for (j= 0;i<xms;j++)for (i= 0;i< 110;i++);}//LCD忙检测函数bit lcd_busy(){bit result;LCD_RS=0;LCD_RW=;LCD_EN= 1;result=(bit)(Part & 0x80);uchar code dis4[]={ "低头思故乡"}; LCD_EN=0; return result;}//液晶写命令函数void lcd_write_cmd(uchar com){while (lcd_busy());LCD_RS0; //选择指令寄存器LCD_RW/= //写LCD_EN0;Part=com; //指令值赋给P0 口delay( 5);LCD_EN=;delay( 5);LCD_EN0;//液晶写一个字符数据函数void lcd_write_dat(uchar date) {while (lcd_busy());LCD_RS=; //选择数据奇存器LCD_RW= //写LCD_EN0;P0=date; //数据值赋给P0 口delay( 5);LCD_EN=;delay( 5);LCD_EN0;}//液晶写一个字符串函数void lcd_write_string(uchar *str)while (*str!= '\0' ) // 未结束{lcd_write_dat(*str++);delay( 5);}}//液晶显示位置函数void lcd_pos(uchar x,uchar y) //从第X行的第Y位置开始显示{ uchar pos;if (x==1) // 第一行{ x= 0x80;}else if (x==2) // 第二行{ x= 0x90;}else if (x==3) // 第三行{ x= 0x88;}else if (x==4) // 第四行{ x= 0x98;}pos=x+y- 1; //首地址为0X80lcd_write_cmd(pos);//液晶初始化函数void lcd」nit(){LCD_PSB=; //并行方式LCD_RST=; // 不复位lcd_write_cmd( 0x30);delay( 5);lcd_write_cmd( 0x0c); //开显示,不显示光标delay( 5);delay( 5);lcd_write_cmd( 0x06); //写一个字符后地址指针自动加1 delay( 5);Icd_write_cmd( 0x01); // 清屏//主函数函数void main(){// uchar i;lcd」n it();while (1){lcd_pos( 1,1);// lcd_write_stri ng(dis1);lcd_write_string( "床前明月光");delay( 5);Icd_pos( 2, 1);// lcd_write_stri ng(dis2);lcd_write_string( "疑是地上霜"); delay( 5);lcd_pos( 3, 1);// lcd_write_stri ng(dis3);lcd_write_string( "举头望明月"); delay( 5);lcd_pos( 4, 1);// lcd_write_stri ng(dis4);lcd_write_string( "低头思故乡"); delay( 500);。
控制步进电机LCD显示
2011 - 2012 学年第 1 学期学生课程实习报告环节名称计算机控制技术课程实习所属课程计算机控制技术学生姓名冼燎刚学号************ 所在班级电气1081 成绩评语指导教师签名一、设计题目:控制步进电机LCD显示二、设计要求:设计一个单片机三相步进电机控制系统,要求系统具有以下功能。
(1)用K0-K2作为通电方式选择键,K0为单三拍,K1为双三拍,K2为三相六拍。
(2)K3-K4作为启动和方向控制。
(3)正转时红色指示灯亮,反转时黄色指示灯亮,不转时绿灯亮。
(4)可通过键盘设定步进电机步数给定值。
(5)用三位LED数码管显示剩余工作步数三、系统总体框图与原理说明系统的整体框图四、硬件电路图五、程序流程图六、仿真说明输入一个三位数按下DIRECTION 选择方向相应的灯会亮选择不同的工作方式按下START按钮,倒数开始,电机按剩余步数转动。
倒数完毕,显示OVER,绿灯亮。
七、心得体会通过自己几天的辛勤努力并查阅诸多资料,终于完成了本次课程设计。
从系统框图到程序,自己逐一完成。
程序虽然很长,但通过分成不同的H文件,有序地把它们分割成几部分。
不仅对于自己,还对查看程序的人有不少的帮助。
设计的思路按照对于仿真的步骤编程。
从按下第一个按键开始,就已经进入到设计者的程序当中。
程序有较强的逻辑性,这些都依赖于平时的练习及老师的教导。
附录:程序清单//***************************程序的总体文件*************************//#include<reg51.h>#include<led_show.h>#include<keyscan.h>#include<keycount.h>void initial();un i,motor_step=0,time_control=0;uc keyscan();uc loop1[2][4]={{0x01,0x02,0x04,0x08},{0x08,0x04,0x02,0x01}};//A B C Duc loop2[2][4]={{0x03,0x06,0x0C,0x09},{0x09,0x0C,0x06,0x03}}; //AB BC CD DAucloop3[2][8]={{0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x0A},{0x0A,0x08,0x0C,0x04,0x06,0x02,0x03,0x01}}; //A AB B BC C CD D DAvoid initial_show(); //函数申明void clr();void wirte_com(uc com);void wirte_data(uc date);void delay(unsigned int z);void input_keycode() ;void output_key();void count();void swith();void test();void main() //主函数initial(); //初始化initial_show();clr();while(1){input_keycode();output_key();TMOD=0x01; // fangshi yiTL1=0xB0;TH1=0x3C;ET0=1; //yun xu TO zhongduanTR0=1;EA=1;while(1);}}/*************中断服务函数***********/void T0_time() interrupt 1//{ TL1=0xB0;TH1=0x3C;time_control++;if(a>0){if(time_control==2){swith(); }}else{ red=1;green=0;yellow=1;wirte_com(0xc0+10);for(i=0;i<4;i++) // over{wirte_data(table6[i]);}}void count(){t=a/100;f=a%100/10;g=a%10;wirte_com(0xC0+10); //rewrite stepwirte_data(table[t]);wirte_data(table[f]);wirte_data(table[g]);}void swith(){switch(motor1){case 0:{if(motor_step<4){P3=loop1[fanzhuan][motor_step] ;}else{motor_step=0;P3=loop1[fanzhuan][motor_step] ;}motor_step++;break;}case 1:{if(motor_step<4){P3=loop2[fanzhuan][motor_step] ;}else{motor_step=0;P3=loop2[fanzhuan][motor_step] ;}motor_step++;break;}case 2:{if(motor_step<8){P3=loop3[fanzhuan][motor_step] ;}else{motor_step=0;P3=loop3[fanzhuan][motor_step] ;}motor_step++;break;}}count();time_control=0;a--; //zong bu shu}///*************************键盘扫描电路********************************// uc temp,ge,shi,bb,num;uc keyscan() //键盘扫描子程序{while(1){P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1; //重新赋值bb=P1; //保留值temp=temp&0xf0; //去抖动if(temp!=0xf0){temp=P1;switch(temp){case 0xee:num=0;break;case 0xde:num=1;break;case 0xbe:num=2;break;case 0x7e:num=3;break;default:break;}while(P1==bb); // 等待放手delay(10);while(P1==bb);}}P1=0xfd;temp=P1;bb=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xed:num=4;break;case 0xdd:num=5;break;case 0xbd:num=6;break;case 0x7d:num=7;break;default:break;}while(P1==bb);delay(10);while(P1==bb);}}P1=0xfb;temp=P1;bb=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xeb:num=8;break;case 0xdb:num=9;break;case 0xbb:num=10;break;case 0x7b:num=11;break;default:break;}while(P1==bb);delay(10);while(P1==bb);}}P1=0xf7;temp=P1;bb=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xe7:num=12;break;case 0xd7:num=13;break;case 0xb7:num=14;break;case 0x77:num=15;break;default:break;}while(P1==bb);delay(10);while(P1==bb);}}if(num!=99) return(num);}}//********************LCD显示电路*****************************// #define uc unsigned char#define un unsigned intunsigned int i;sbit rs=P2^0; //位申明sbit rw=P2^1;sbit e=P2^2;uc code table2[]="designed by xlg";uc code table3[]="setting:";uc code table4[]="remaining:";uc code table5[]=" ";uc code table6[]="over:";void wirte_com(uc com);void wirte_data(uc date);void delay(un z);void initial() //初始化子函数{rs=1;rw=1;e=1;wirte_com(0x01); // 显示清零delay(10);wirte_com(0x38); //16*2显示;5*7点阵;八位数据接口delay(10);wirte_com(0x0f); // 1 开显示,有光标光标闪手(1 1 1)delay(10);wirte_com(0x06); //000001NS (N=1时右移)(S=0时整屏不移动)delay(10);wirte_com(0x80); //初始化指针delay(10);}void initial_show(){for(i=0;i<16;i++){wirte_data(table2[i]);}delay(100);wirte_com(0x01);wirte_com(0x80);for(i=0;i<8;i++){wirte_data(table3[i]);}wirte_com(0xC0);for(i=0;i<10;i++){wirte_data(table4[i]);}}void clr(){wirte_com(0x80+10);for(i=0;i<3;i++){wirte_data(table5[i]);}wirte_com(0x80+10);}void wirte_com(uc com) //液晶写指令{P0=com;rs=0;rw=0;e=0; //上升沿delay(10);e=1;}void wirte_data(uc date) //液晶写数据{P0=date;rs=1;rw=0;e=0; //上升沿delay(100);e=1;}void delay(un z) //延时子程序{un x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//**********************键盘电路读取**********************************// sbit start=P2^3 ;sbit red=P2^4 ;sbit green=P2^5 ;sbit yellow=P2^6 ;un a,b,c,d,t,f,g,fanzhuan=1,motor1=0,output_type;uc code table[]="0123456789ABCDEF"; //定义表格void input_keycode(){num=99;keyscan();while (table[num]!='A'){while (table[num]>='0'&&table[num]<='9' ){wirte_com(0x80+10);t=table[num];wirte_data(t); //bai位数 abc tfga=table[num]-48;num=99; //shi位数keyscan();b=table[num]-48;a=a*10+b;f=table[num] ;wirte_data(f);num=99; //ge位数输入的数据存在Akeyscan();c=table[num]-48;a=a*10+c;g=table[num] ;wirte_data(g);wirte_com(0x0c);wirte_com(0x80+10);num=99;keyscan();}while (table[num]=='C'){wirte_com(0x80+15);if(fanzhuan==1){fanzhuan=0;wirte_data('a');red=0;green=1;yellow=1;}else{fanzhuan=1;wirte_data('b');red=1;green=1;yellow=0;}wirte_com(0x80+15);num=99;keyscan(); }while (table[num]=='D'||table[num]=='E'||table[num]=='F') {switch(table[num]){case 'D':{motor1=0;wirte_com(0xC0+15);wirte_data('1'); //类型 a/bwirte_com(0xC0+15);break;}case 'E':{ motor1=1;wirte_com(0xC0+15);wirte_data('2'); //类型 a/bwirte_com(0xC0+15);break; }case 'F':{ motor1=2;wirte_com(0xC0+15);wirte_data('3'); //类型 a/bwirte_com(0xC0+15);break; }}num=99;keyscan();}if (table[num]=='B'){clr();num=99;keyscan();}}}void output_key(){ wirte_com(0xC0+10);wirte_data(t);wirte_data(f);wirte_data(g);wirte_com(0xC0+10);}。
电机测试系统操作规程[1]
操作类作业指导书
文件 编号 版本/修改 页号 第 1 页 共 3 页
电机测试系统操作规程
实施 日期
电机测试系统操作规程
发放对象 (复印)
原件管理
编制
审核
批准
年
月日年Fra bibliotek月日
年
月
日
文件 类别 文件 名称 发布 日期 1 操作步骤
操作类作业指导书
文件 编号 版本/修改 页号 第 2 页 共 3 页
2.4 将标定杆固定在测功机轴伸上,杆上有一个小螺钉的面朝上,天平标定杆的中心至端面的距离
文件 类别 文件 名称 发布 日期
操作类作业指导书
文件 编号 版本/修改 页号 第 3 页 共 3 页
电机测试系统操作规程
实施 日期
注意:悬挂砝码应先选取轻而结实的细线,砝码应悬挂于标定杆臂的最外端,切勿随意悬挂,以免造 成臂长误差。标定时标定杆应处于水平位置,不应有明显的倾斜。 3 注意事项 3.1 启动被试电机(或电动工具),逐渐升高电机的电压到额定值。对高速电机(如串激电机)的实 验,应注意安全,应从低速逐渐调节到高速,若出现强烈振动等不良现象,应立即关闭电机,并检查 联轴节上固定螺钉和装夹有无松动,轴线是否偏移是否偏移等。 3.2 绝不允许在测功机有励磁电流情况下,静止启动被测电机,这样将对传感器产生冲击,损坏测 功机。切记,应在无励磁电流下启动电机。 3.3 切断电源(先断开电机电源),将测功机励磁电源的电流旋钮至最低位,拆下被试电机。 3.4 确认被试品在装置中是扭转形式,不允许有冲击形式存在(例如冲击钻的冲击档位,应选取非 冲击档位,或将冲击装置拆除)。 3.5 确保被试品被安全的、牢固的固定于夹具上,防止工具在大转矩状态或高速状态下飞出,造成人 员财产的损失。 3.6 24 芯信号电缆必须在输出参数仪的电源开关关闭的情况下才能拔插。 3.7 测功机在工作时应按规定开启冷却装置。 3.8 不要在一瞬间给一台冷却的测功机很高的能量(扭力、转速),在测试大负载之前允许测功机预 热,这要靠给被试品增加负载来完成。如果要被试品必须在冷却状态下测试,要先用另一个被试品来 预热测功机。 3.9 所有的测功机都是消耗能量的装置,它将被试品的机械能转化成热能,所以不允许超载运行! 即不允许超过测功机铭牌上规定的转速,转矩,功率值。超载使用将大大的减少测功机的使用寿命, 并可能导致许多隐藏的损害。 3.10 应允许考虑被试品与测试装置之间材料的影响。如一个暴露内部框架结构的试品(磁性)放置 在钢盘底座上方,将有影响现象和结果的可能。 4 日常维护 4.1 假使传动轴上轴承有噪音,应立即更换以避免传动轴被卡住的可能性和造成对其他零件的损害。 4.2 更换轴承时测功机需要局部拆卸,拆卸应该由在电子和精密机械设备方面有经验的人员来做。 4.3 轴承在装入传动轴前,应用清净汽油洗隔离圈内不应有污染物。 等汽油蒸发后涂上 2#白色特种高 速复合锂基脂。 4.4 外轴承拆下洗净后,不能放油脂,应滴入精密仪表油、或表油数滴。 4.5 每一年由当地的计量部门检定一次。
电机测速系统设计报告
电机测速系统设计报告引言电机测速是现代工业中广泛使用的一项技术。
它可以实时监测电机的转速,对其运行状态进行控制和调整。
本设计报告将介绍一个基于电机测速系统的设计方案,旨在实现对电机的精确测速。
设计目标本设计的主要目标是设计一个能够准确测速并实时显示电机转速的系统。
具体设计要求如下:1. 硬件设计应具有高精度和稳定性,能够适应不同类型和功率的电机;2. 软件设计要求简单而实用,易于使用和维护;3. 系统应提供实时显示电机转速的功能,并可输出数据供其他设备或系统使用。
设计原理电机测速系统的设计原理基于电机驱动信号和测速传感器。
电机驱动信号通过采集和分析电机的电磁信号来确定电机的运行状态,而测速传感器用于检测电机转动的角度变化。
通过结合这两种信号,可以得到电机的准确转速。
系统设计硬件设计硬件设计主要由以下几个部分组成:1. 电机驱动电路电机驱动电路负责提供所需的电源和信号,使电机能够正常运转。
该电路应具备良好的稳定性和适应性,以适应不同类型和功率的电机。
2. 测速传感器测速传感器用来检测电机转速的变化。
常见的传感器有光电传感器、霍尔传感器等。
在本设计中,我们选择了霍尔传感器作为测速传感器,因其具有高精度和快速响应的特点。
3. 数据采集与处理单元数据采集与处理单元负责对电机驱动信号和测速传感器的信号进行采集和处理。
通过对这两种信号的分析,可以得到电机的准确转速。
4. 显示单元显示单元用于实时显示电机的转速。
可以采用LED或LCD显示屏等形式,以便操作人员直观地了解电机的运行状态。
软件设计软件设计主要包括数据采集与处理程序和转速显示程序两部分。
1. 数据采集与处理程序数据采集与处理程序负责从硬件部分采集电机驱动信号和测速传感器信号,并进行相应的数据处理。
该程序应具备高效、稳定和准确的特点。
2. 转速显示程序转速显示程序根据数据采集与处理程序提供的数据,实时显示电机的转速。
该程序应具备良好的用户界面,并且能够与其他设备或系统进行数据交互。
测速+显示+PID调速程序
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit zhen=P1^0;sbit fan=P1^1;sbit en=P1^2;long bb;#define KP 1.6 //比例系数#define KI 0.5 //积分系数#define KD 0 //微分系数#define max 200 //返回的最大值,是PWM的周期值#define min 0 //返回的最小值,为0#define deadline 0x08//速度PID设置死区范围#define setspeed 80 //速度设定值typedef struct PID //定义数法核心数据{int vi_Ref;//速度PID,速度设定值int vi_FeedBack; //速度PID,速度反馈值long PreError;//速度PID,前一次,速度误差setspeed-speedlong PreDerror;//速度PID,前一次,速度误差之差uint v_Kp; //速度PID,Ka = Kpuint v_Ki; //速度PID,Kb = Kp * ( T / Ti )uint v_Kd; //速度PID,kc = Kp * ( Td / T )long PreU;//电机控制输出值}PID;static PID sPID; //PID控制结构static PID*sptr=&sPID;uchar code loops[] = {0x7f,0xbf,0xdf,0xef};//定义显示位控制驱动码uchar code table[]={0x14,0xd7,0x4c,0x45,0x87,0x25,0x24,0x57,0x04,0x05}; // 共阳极0,1,2,3,4,5,6,7,8,9void PIDInit(void){sptr->vi_Ref=setspeed;//速度设定值sptr->vi_FeedBack=bb; //速度反馈值sptr->PreError = 0 ; //前一次,速度误差,setspeed-speedsptr->PreDerror = 0 ; //前一次,速度误差之差,d_error-PreDerror;sptr->v_Kp = KP;sptr->v_Ki = KI;sptr->v_Kd = KD;sptr->PreU = 0; //电机控制输出值}PID;uint speed_pid(int v);void DisplayFresh();void delay(uint z);void init();uchar i,a,b,c,d;main(){init();while(1){en=1;delay(sptr->PreU );en=0;delay(200-sptr->PreU );DisplayFresh();}}void delay(uint z) //延时z*0.1ms{ uint x,y;for(x=z;x>0;x--)for(y=11;y>0;y--);}void init()//初始化{TMOD=0x51;TH0=(65536-20000)/256;TL0=(65536-20000)%256;IT1=1;//外部中断1触发类型选择IT0=1;//外部中断0触发类型选择TR1=0;//T1的运行控制位,清0时停止T1 TR0=1;//T0的运行控制位,置1时启动T0 EA=1; //开总中断ET0=1;//定时计数器0中断允许zhen=1;fan=0;sptr->PreU=30;//设置初始占空比}void timer0() interrupt 1{TH0=(65536-20000)/256;//赋初值20msTL0=(65536-20000)%256;i++;if(i%10==0) // 判断是否时间到了0.2S{TR1=0; //T1不允许中断bb=TH1*256+TL1; //计算脉冲数TR1=1;bb/=2; //计算转过的圈数,除以2即为转过的圈数,叶片转一圈得到2个脉冲speed_pid(bb); //速度PI计算}if(a%25==0){void ClacSpeed(); // 0.25S刷新一次数码管缓存器内的值}}//PIDuint speed_pid(int v){signed long error,d_error,dd_error; //sptr->vi_FeedBack=v;error = (signed long)(sptr->vi_Ref - sptr->vi_FeedBack); // 偏差计算d_error = error - sptr->PreError;dd_error = d_error - sptr->PreDerror;sptr->PreError = error; //存储当前偏差sptr->PreDerror = d_error; //储存当前误差之差sptr->PreU += (signed long)( sptr -> v_Kp * d_error +sptr -> v_Ki * error +sptr->v_Kd*dd_error);//速度PID计算if( sptr->PreU >=max )//速度PID,防止调节最高溢出sptr->PreU = max;elseif( sptr->PreU <= min ) //速度PID,防止调节最低溢出sptr->PreU = min;elsereturn ( sptr->PreU ); // 返回预调节占空比}void DisplayFresh(){P2 =loops[0] ;P0 = table[a];delay(50);P2 =loops[1] ;P0 = table[b];delay(50);P2 =loops[2] ;P0 = table[c];delay(50);P2 =loops[3] ;P0 = table[d];delay(50);}void ClacSpeed(){a = (bb/1000)%10;b = (bb/100)%10;c = (bb/10)%10;d = bb%10;}。
基于AT89C51的LCD数字测速仪的设计测量汽车速度
目录1、设计背景 (1)2、欲实现功能 (3)3、系统硬件设计 (4)3.1系统框图及测速原理 (4)3.2单片机AT89C52 (5)3.3 OPTC光电断续器 (6)3.4 液晶显示LM016L (7)3.5 三端稳压集成器LM7805 (8)3.6电源 (8)4 、软件设计 (9)4.1 程序流程图 (9)4.2 C语言编程 (9)5 、系统仿真及调试 (10)6 、元器件清单 (11)7 、结语 (11)8 、附录 (13)附录1 实验仿真电路 (13)附录2 源程序 (14)9 、参考文献 (23)10 、致谢 (24)内容摘要随着居民生活水平的不断提高,家用轿车开始普及为人们娱乐、休闲代步的工具。
汽车测速仪能够满足人们最基本的需求,让人们能清楚地知道当前的速度、里程、时间等物理量。
以便做出判断和采取必要的措施,以防止交通事故的发生。
测速仪作为汽车最基本、最重要的部件之一,在汽车的运行过程中起着至关重要的作用。
一个性能良好、测量精确、稳定的测速系统,从某种意义上说,直接影响着汽车乃至司乘人员的生命安全。
本论文主要阐述一种基于光电传感器的汽车测速仪的设计。
以 AT89C52 单片机为核心,OPTC 光断续器测转数,实现对汽车速度、时间的测量统计,并能将汽车的里程数及速度信息送单片机,并通过单片机输出驱动信号,用LCD实时显示。
文章详细介绍了汽车测速仪的硬件电路和软件设计。
硬件部分利用光电传感器组件将汽车每转一圈的脉冲数传入单片机系统,然后单片机系统将信号经过处理送显示。
软件部分用C语言进行编程,采用模块化设计思想。
该系统硬件电路简单,子程序具有通用性,完全符合设计要求。
关键词:速度;时间;光断续器;单片机;LCD显示The car speedometer design based on the AT89C51ABSTRACTWith the developing of people’s life, the car is becoming the universal tool of transportation and substitute for walking and becoming the first choice of entertainment and exercising. The car speedometer can fulfill the basic need of people’s life, so that they can learn the speed、the mileage 、the time of the car. For that people could take some necessary measures in case of any accident happened by a dangerous speed. As one of the most basic and important part of a ca r, speedometer is taking an important role during the car’s running. To some extent, an accurate and stable speedometer has a effect on the driver’s life directly.In this paper, the car speedometer design based on the photoelectric sensor element is elaborated. By AT89C52 as kernel, using photoelectric sensor element to measure revolution, the measure and statistic are achieved. The car speed can be displayed on LCD. In this article, the hardware circuit and software design of car speedometer instrument are introduced in detail. About the hardware, the pulse number is transmitted of one cycle of the car into Single Chip Microcomputer system. Then the signal processed by Single Chip Microcomputer system is sent to display scream. About the software, in C language; the program is designed in the mode of modules. The system has simple hardware, common sub-program, and meets the demand of design.KEY WORDS:Mileage / speed; Time;temperature;photoelectric sensor element; Single chip microcomputer; LCD基于AT89C51的LCD数字测速仪1设计背景随着人们生活水平的逐渐提高,人们对于生活质量的要求也日益增加,尤其是对出行的要求。
直流电机调速测速按键显示
摘要本设计基于单片机STC90C516RD+为核心,以小型直流电机为对象,以L9110芯片为驱动核心,通过4个按键,实现直流电机的启动,速度和方向的控制,并通过液晶LCD1602显示出来。
对直流电机进行速度测量的原理,采用了PWM技术对电机进行控制,通过对占空比的计算达到精确调速的目的。
实时测量电机的实际转速,并显示出来。
采取传统的调速系统主要有以下的缺陷:模拟电路容易随时间飘移,会产生一些不必要的热损耗,以及对噪声敏感等。
而用PWM技术后,避免上述的缺点,实现了数字式控制模拟信号,可以大幅度减低成本和功耗。
并且PWM调速系统开关频率较高,仅靠电枢电感的滤波作用就可以获得平滑的直流电流,低速特性好;同时,开关频率高,快响应特性好,动态抗干扰能力强,可获很宽的频带;开关元件只需工作在开关状态,主电路损耗小,装置的效率高,具有节约空间、经济好等特点。
关键词:单片机;PWM;直流电机;L9110;目录一、设计任务 4二、设计方案 41、设计思路 42、基本原理与总体设计框图 5三、系统硬件设计 61、 STC90C51最小系统 6(1) STC90C516RD+芯片 6 (2)系统时钟电路 6(3)复位电路 7(4)最小系统原理图 72、直流电机设计部分 8(1)直流电机的基本结构 8 (2)直流电机的工作原理 8 (3)直流电机PWM调速原理 93、电机驱动及测速模块 114、液晶显示部分 115、独立按键模块 12四、系统软件设计 131、电机控制流程图 142、显示程序流程图 153、定时中断流程图 15五、调试与结果 16六、心得体会 17参考文献 18附录一元器件清单 19附录二程序清单 201、设计任务以单片机为控制核心的直流电机PWM调速控制系统,实现的功能主要包括:直流电机的正、反转;直流电机的加速和减速;直流电机的启动和停止;以及直流电机的转速在LCD显示屏上显示。
2、设计方案1、设计思路直流电机PWM控制系统的主要功能包括:直流电机的加速、減速以及电机的正转和反转,并且可以调整电机的转速,还可以方便的读出电机转速的大小,能够很方便的实现电机的智能控制,其间,还包括直流电机的直接清零、启动(置数)、暂停、连续等功能。
51单片机测电机转速LCD显示
主程序* 文件名称: Jiuzhouxuese.c 转速计的设计(LCD显示)的主程序* 原理: T1计数,T0计时,电动机每转动一周产生16个脉冲,T1采集一分钟内的脉冲数,后即可计算出转速* 版本信息: 2011-10-23---------------------------------------------------------------*/#include "LCD1602.h"#include<reg51.h>#define uint unsigned int#define uchar unsigned charbit flag; //计满1秒钟标志位uchar count=100; //储存定时器T0中断次数uint Speed; //储存电机转速uchar DispBuffer[4];//存放转换成液晶显示字符(ASCII)的数组/*------------------------------------------------------------功能:主函数说明:使用晶振为12MHz的芯片,定时0.01秒。
计时器初值为C=65536-0.01/10^(-6)=0D8F0H---------------------------------------------------------------*/void main(void){TMOD=0x51;//T1工作于计数模式1,T0工作于计时模式1;TH0=0xd8; //定时器T0赋初值TL0=0xf0;EA=1; //开总中断ET0=1; //定时器T0中断允许TR0=1; //启动定时器T0while(1){TR1=1; //计数T1启动TH1=0; //计数T1高8位赋初值0TL1=0; //计数T1低8位赋初值0flag=0; //时间还未满1秒钟while(flag==0) //时间未满等待Speed=(TH1*256+TL1)*60/16; //计算速度,每周产生16个脉冲}}/*-------------------------------------------------------------函数功能:定时器T0的中断服务函数--------------------------------------------------------------*/void Time0(void ) interrupt 1 using 1 //定时器T0的中断编号为1,使用第1组工作寄存器{count--; //T0每中断1次,count减1LCD_Initial();//液晶初始化if(count%4==0){DispBuffer[0]=Speed/1000+0x30; //将显示数据并分解出千位转换成ASCII码}if (count%4==1){DispBuffer[1]=Speed%1000/100+0x30;//将显示数据并分解出百位转换成ASCII码}if(count%4==2){DispBuffer[2]=Speed%100/10+0x30;//将显示数据并分解出十位转换成ASCII码}if(count%4==3){ DispBuffer[3]=Speed%10+0x30 ; // 将显示数据并分解出个位转换成ASCII码}LCD_Prints(1,0,DispBuffer);//LCD显示数据while(0);if(count==0) //若累计满100次,即计满1秒钟{flag=1; //计满1秒钟标志位置1count=100; //清0,重新统计中断次数}TH0=0xf0; //定时器T0重新赋初值TL0=0xd8;}LCM1602驱动程序/************************************* *************************************File Name: LCD1602.hAuthor: JiuzhouxunseCreated: 2011/10/23************************************* ************************************* */#ifndef _LCD_1602_H#define _LCD_1602_H#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char定义接口************************************* sbit LcdRs = P2^0;sbit LcdRw = P2^1;sbit LcdEn = P2^2;sfr DBPort = 0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口//内部等待函数************************************* ************************************* unsigned char LCD_Wait(void){LcdRs=0;LcdRw=1; _nop_();LcdEn=1; _nop_();//while(DBPort&0x80),在用Proteus仿真时,屏蔽此语句,否则会进入死循环!LcdEn=0;return DBPort;//向LCD写入命令或数据************************************* ***********************#define LCD_COMMAND 0 // 命令#define LCD_DATA 1 // 数据#define LCD_CLEAR_SCREEN 0x01// 清屏#define LCD_HOMING 0x02 // 光标返回原点void LCD_Write(bit style, unsigned char input){LcdEn=0;LcdRs=style;LcdRw=0; _nop_();DBPort=input; _nop_();//注意顺序LcdEn=1; _nop_();//注意顺序LcdEn=0; _nop_();LCD_Wait();}//设置显示模式************************************* ***********************#define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND,0x08|DisplayMode);}//设置输入模式************************************* ***********************#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00// 为缺省设置#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00//画面不可平移void LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND,0x04|InputMode);}//初始化LCD********************************* ***************************void LCD_Initial(){LcdEn=0;LCD_Write(LCD_COMMAND,0x38);//8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);//此句不能省LCD_SetDisplay(LCD_SHOW|LCD_NO _CURSOR); //开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CL EAR_SCREEN); //清屏LCD_SetInput(LCD_AC_UP|LCD_NO_ MOVE); //AC递增, 画面不动}//************************************ ************************************ void LCD_Pos(unsigned char x, unsignedchar y){if(y==0)LCD_Write(LCD_COMMAND,0x80|x); if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0 x40));}void LCD_Prints(uchar x,uchar y, unsigned char *str){while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}Proteus仿真图。
智能电机测速仪课程设计报告
智能装置课程设计题目:智能电机测速仪姓名:晁平复班级:自动化4班学号:63同组人:王平一、课程设计目的:a)深切了解PIC16F877单片机的工作原理,熟练掌握汇编语言程序设计方式,熟练利用MPLAB-ICD仿真器及MPLAB-IDE仿真调试软件。
b)通过该课程设计使学生初步掌握以单片机为核心的智能装置设计的简单原则、步骤和方式。
c)熟悉智能装置设计中有关的硬件设计调试,如人机界面等。
d)熟悉智能装置设计中相关软件的设计、编程和调试。
二、课程设计内容:a)以16F877单片机为核心,结合给出的其他原器件和智能装置实验系统原有的内容设计智能电机测速显示仪硬件电路。
b)利用实验板提供的光电耦合器收集电机速度。
c)将收集的速度值通过液晶显示器显示出来。
d)将转速内容上传至运算机界面。
e)利用SPI总线与D/A转换器,操控电机进行调速,使电性能够达到范围内的任何要求转速。
三、课程设计要求:a)按如实验指导书的设计内容及所给出的元件,设计智能电机测速显示仪硬件原理图。
b)依照设计好的硬件原理图在实验板上用导线搭建硬件电路。
c)用万用表检查硬件电路连接是不是正确,检查无误后上电并编制简单的测试程序分步伐试各部份功能。
d)在各部份功能实现后,编制完整的智能电机速度测试系统软件与调速软件,并进行软硬件联调,直抵达到设计要求。
e)依照设计内容要求测试仪表误差并做分析,给出仪表精度,完成后由教师进行验收检查。
四、课程设计设备a)仪器i.MPLAB-ICD模块与仿真头ii.智能装置实验系统iii.安装了MPLAB-IDE开发软件的运算机iv.数字万用表v.导线若干b)元器件i.PIC16F877芯片(6MHz晶振)ii.LCD显示屏(双行液晶单色显示,可显示汉字与字符)iii.测速电机(转速范围约在0~2500转,自带红外线光电开关测速,测速结果以脉冲形式从电机的1口输出,电机转速由dianji1与dianji2两个端口的电位差决定)iv.RS-232串行总线接口(支持异步传输,波特率自定,11与12两个端口别离为发送和接收数据口)v.MAX515芯片(12位D/A转换器,输出电压对应0~5V)vi.可调电位器(用于纯测速程序的电机手动调速,调速电压0~5V)五、课程设计硬件原理图:六、课程设计硬件设计思路:电机测速与调速,第一测速部份需要对电机测速脉冲引入PIC芯片,并进行按时计数,测定在一段时刻内电机转了多少圈,以此推算电机的转速。
直流电机测速并显示
可实现功能:1可控制左右旋转2可控制停止转动3有测速功能,即时显示在液晶上4有速度档位选择,分五个档次,但不能精确控速5档位显示在液晶上用到的知识:1用外部中断检测电机送来的下降沿,在一定时间里统计脉冲个数,进行算出转速。
23ucharsflag=1;//用来标志速度档位#defineright_turnPW1=0;PW2=1 //顺时针转动#defineleft_turnPW1=1;PW2=0 //逆向转动#defineend_turnPW1=1;PW2=1 //停转voidkeyscan(); //键盘扫描voiddelay(ucharz);voidtime_init(); //定时器的初始化voidwrite_com(ucharcom); //液晶写指令voidwrite_data(uchardate);//液晶写数据voidlcd_init(); //液晶初始化voiddisplay(uintrate); //显赫速度voidint0_init(); //定时器0初始化voidkeyscan(); //键盘扫描程序voidjudge_derection();voidmain(){time_init(); //定时器的初始化lcd_init(); //液晶初始化int0_init(); //定时器0初始化while(1){}}if(aa==5){aa=0;temp=count*0.5*60*2*2*100/24; //计算转速,每分转多少圈count=0; //重新开始计数脉冲数display(temp); //把计算得的结果显示出来}}voidtimer1()interrupt3using0{if(flag){flag=0;end_turn;a=t0; //t0的大小决定着低电平延续时间TH1=(65536-a)/256;TL1=(65536-a)%256; //重装载初值}else{flag=1; //这个标志起到交替输出高低电平的作用if(dflag==0){ge=rate%10;write_com(0x80);write_data('0'+wan);write_data('0'+qian);write_data('0'+bai);write_data('.');write_data('0'+shi);write_data('0'+ge);}/******延时函数********/voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/************写指令************/voidwrite_com(ucharcom){lcdrs=0;Da=com;delay(1);lcden=1;write_data('e');write_data('a');write_data('r');}/***********键盘扫描程序**********/voidkeyscan(){if(stop==0){TR1=0; //关闭定时器0 即可停止转动end_turn; //停止供电write_com(0x80+0x40);write_data('0');}if(left==0){TR1=1;dflag=1; //转向标志置位则左转write_com(0x80+0x40);write_data('0'+sflag);}if(right==0){write_data('3');}if(sflag==4){t0=10000;t1=40000; //占空比为百分之80write_com(0x80+0x40);write_data('4');}if(sflag==5){t0=5000;精心整理t1=45000; //占空比为百分之90 write_com(0x80+0x40);write_data('5');}if(sflag>=6){sflag=0;t0=25000;t1=25000;write_com(0x80+0x40);write_data('1');。
液晶(LCD)显示程序
************************************************************* 功能:液晶(LCD)显示程序;LCD: TRULY M19264-5A1 192*64点阵驱动器: S6B0108/S6B0107或HD61202及相兼容驱动器MPU: AT89S51开发环境: KEIL C51作者:纪长城日期: 2005年10月************************************************************/ #include <AT89X51.H>#include <ZKDot.h>#define DISP_OFF 0X3E //关闭显示#define DISP_ON 0X3F //打开显示#define START_ROW 0xC0 //设置起始行#define FIRST_PAGE 0xB8 //设置页#define START_YADD 0x40 //设置列/*----------------------------------------MPU端口定义----------------------------------------*/#define LCD_PORT P0#define LCD_RESET P2_2#define LCD_CSA P2_3#define LCD_CSB P2_4#define LCD_RS P2_5#define LCD_RW P2_6#define LCD_E P2_7/*------------------------------------------LCD的区选择程序:F为要选通的区,取值为0,1,2,对应选中三个区,取其它值选中第三个区--------------------------------------------*/void LCD_CSAB_SET(unsigned char block){if(0==block) //0 选择第一区{LCD_CSA=0;LCD_CSB=0;}else if(1==block) //1 选择第二区{LCD_CSA=0;LCD_CSB=1;}else //2 选择第三区{LCD_CSA=1;LCD_CSB=0;}}/*---------------------------------------//延时子程序----------------------------------------*/void Delay_xMs(unsigned int xMs){unsigned int i,j;for(i=0;i<xMs;i++)for(j=0;j<500;j++);}/*---------------------------------------向LCD中写入指令或指令,F=0 是指令,F=1是数据,bkock是选择写入哪个区 ---------------------------------------*/void LCD_Write( unsigned char Com,bit F){LCD_PORT = Com; //把数据输出LCD_RS = F; //确定是数据还是指令LCD_RW = 0;LCD_E = 1;LCD_E = 0; //电平下降沿数据写入控制器}/*----------------------------------------------坐标定位程序参数XPage 定位页取值0--7 共8页Y 横向定位取值0-191 共192列-----------------------------------------------*/ void LCD_XY_SET(unsigned char X,unsigned char YPage) {if(X<64) //在第一个区中{LCD_CSAB_SET(0);LCD_Write(FIRST_PAGE|YPage,0);LCD_Write(START_YADD|X,0);}else if(X<128) //在第二个区中{LCD_CSAB_SET(1);LCD_Write(FIRST_PAGE|YPage,0);LCD_Write(START_YADD|X-64,0);}else if(X<192) //在第三个区中{LCD_CSAB_SET(2);LCD_Write(FIRST_PAGE|YPage,0);LCD_Write(START_YADD|X-128,0);}}/*--------------------------------------------清除一行的子程序 H是要清的页,取值0-3--------------------------------------------*/void LCD_Clear_H(unsigned char H){unsigned char i,j,k;for (k=0;k<2;k++)for (i=0;i<3;i++){LCD_XY_SET(i*64,H*2+k);for(j=0;j<64;j++) LCD_Write(0x00,1);}}/*----------------------------------------LCD初始化程序----------------------------------------*/void LCD_Init(void){unsigned char i;LCD_E = 0;LCD_RW = 1;LCD_RS = 0;LCD_RESET= 0; //液晶模块复位Delay_xMs(10); //等待10mSLCD_RESET= 1; //液晶结束复位电平LCD_CSAB_SET(0);LCD_Write(DISP_ON,0); //模块1显示开LCD_CSAB_SET(1);LCD_Write(DISP_ON,0); //模块2显示开LCD_CSAB_SET(2);LCD_Write(DISP_ON,0); //模块3显示开for (i=0;i<4;i++) LCD_Clear_H(i); //清屏}/*----------------------------------------读display RAM---------------------------------------*/unsigned char LCD_READ_RAM(unsigned char x,unsigned char y) {unsigned char temp;LCD_XY_SET(x,y);LCD_RW = 1; //设置为读数据LCD_RS = 1;LCD_PORT =0XFF; //设置总线为高电平(空)LCD_E = 0;LCD_E = 1;temp =LCD_PORT;LCD_E =0;return temp;}/*------------------------------------------设制起始行,参数line为要起始的行,取值范围0--63,block 为要设置的块-----------------------------------------*/void LCD_LINE_SET(unsigned char line){unsigned char i;for (i=0;i<3;i++){LCD_CSAB_SET(i);LCD_Write(START_ROW|line,0);}}/*----------------------------------------------显示一个16*8的ASCII的程序 ,参数是ascii码值,x取值0-191,y取值0-3 只能显示四行------------------------------------------------*/bit LCD_PRINT_ASCII_1608(unsigned char ascii,unsigned char x,unsigned char y) {unsigned char i,j;if((x+8)>191)return 1;for(j=0;j<2;j++)for(i=j;i<16;i+=2){LCD_XY_SET(x+(i>>1),y*2+j);LCD_Write(AsciiDotBig[(ascii-0x20)*16+i],1);}return 0;}/*-------------------------------------------------查找汉字程序参数是内码的高8位与低8位---------------------------------------------------*/unsigned char LCD_SEARCH_HZ16(unsigned char h,unsigned char l){unsigned char i;for(i=0;i<17;i++)if(HZ[i].Index[0]==h&&HZ[i].Index[1]==l) return i;}/*----------------------------------------------------16点阵的汉字显示程序----------------------------------------------------*/bit LCD_PRINT_HZ16(unsigned char wz,unsigned char x,unsigned char y) {unsigned char i,j;if((x+16)>192) return 1;for(j=0;j<2;j++)for(i=0;i<16;i++){LCD_XY_SET(x+i,y*2+j);LCD_Write(HZ[wz].Msk[i+(16*j)],1);}return 0;}/*--------------------------------------------点操作函数,参数,X/Y,取值为192/64 F 0-1,0是画点,1是取消点---------------------------------------*/void LCD_POINT(unsigned char X,unsigned char Y,bit F){unsigned char i,j,k;i=Y&&0xF8;//i是X/8的余数Y>>=3; //x是X/8的商j=LCD_READ_RAM(X,Y);//空读操作j=LCD_READ_RAM(X,Y);//读出8位数据LCD_XY_SET(X,Y);k=1<<i;if(F){k=~k;LCD_Write(j&k,1);}elseLCD_Write(j|k,1);}/*----------------------------------------------- 显示图像的一个例子---------------------------------------------*/ void LCD_TU(void){unsigned char i,j;for(i=0;i<6;i++)for(j=0;j<100;j++){LCD_XY_SET(j,i);LCD_Write(TP[i*100+j],1);}}/*---------------------------------------------测试主函数-------------------------------------------------*/ main(){unsigned char i,j,k,m;unsigned char code c[]="我老婆最可爱最漂亮的";LCD_Init();LCD_TU();for(i=0;i<18;i+=2){m=LCD_SEARCH_HZ16(c[i],c[i+1]); LCD_PRINT_HZ16(m,i*8,3);}while(1){for(i=0;i<64;i++){LCD_LINE_SET(i);if(i==0)Delay_xMs(500); //等待elseDelay_xMs(20); //等待}}}。
电机测速系统设计与实现
电机测速系统设计与实现【摘要】本文所介绍电机测速系统主要由霍尔传感器、单片机、LCD1602液晶显示模块组成。
系统以STC89C52单片机系统和霍尔传感器为核心,霍尔传感器把不同转速所转变成的不同频率的脉冲信号发送至到单片机,通过单片机的设置可对霍尔传感器输入的脉冲信号进行计数和处理,这样能精确地算出加到引脚的单位时间内检测到的脉冲数,单片机进行控制与计算后,采用LCD液晶显示模块实时显示。
本测速系统的设计具有操作方便,显示清晰,结构简单,稳定可靠,成本低廉等优点。
【关键词】霍尔传感器;单片机;LCD1602Abstract:This article describes the motor speed of the system consists of a Hall sensor,microcontroller,LCD1602 LCD module.STC89C52 SCM system as the core system and the Hall sensor,Hall sensor sends pulses are converted into different speeds at different frequencies to the microcontroller,the Hall sensor input pulse signal is counted and processed by the microcontroller setting,this can accurately calculate the number of pulses applied to the pin within the unit time detected,the microcontroller for control and calculation,using real-time display LCD LCD module.Design of the measurement system is easy to operate,clear display,simple structure,reliable,and low cost.Key word:Hall sensor;MCU;LCD16021.系统的整体设计本设计能够实现电机在转动过程中速度指标的实时显示功能。
电机转速显示程序
电机转速表设计#include<reg51.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字unsigned int v; //储存电机转速unsigned char count; //储存定时器T0中断次数bit flag; //计满1秒钟标志位/*****************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
液晶显示电机测速系统程序清单;A T89C2051 P1--->LCD 数据线; P3.0(RXD)[2] --->KEY0; P3.1(TXD)[3] --->KEY1; P3.2(INT0)[6] --->PWM_MOTO ; P3.3(INT1)[7] --->霍尔传感器; P3.4(T0)[8] --->LCD RS; P3.5(T1)[9] --->LCD RW; P3.6 [无] --->NC; P3.7 [11] --->LCD E;++++++++++++++++++++++++++++++++RS BIT P3.4 ;p3.4-->T0 RW BIT P3.5 ;p3.5-->T1E BIT P3.7 ;p3.3-->INT1 PORT BIT P3.2SIGN_1S BIT 00H ;1s 标志位SIGN_CT1S BIT 01HNOSPEED BIT 02HCOM DA TA 30HDA T DA TA 31HT10MS DA TA 32H ;Clock_S DA TA33HClock_M DA TA34HClock_H DA TA35H SECONDH DA TA 36H SECONDL DA TA 37HNO_AME DA TA 38H ROUNDHH DA TA 39H ROUNDH DA TA 3AH;速度检测值千百位ROUNDL DA TA 3BH;速度检测值十个位CNTH DA TA 3CH ;检测计数值CNTL DA TA 3DHCOMP DA TA 3EHT200MS DA TA 3FH;显示缓冲区============HOUR_H DA TA 40HHOUR_L DA TA 41HMINU_H DA TA 43HMINU_L DA TA 44H SECO_H DA TA 46HSECO_L DA TA 47HSECH_H DA TA 4BHSECH_L DA TA 4CHSECL_H DA TA 4DHSECL_L DA TA 4EHORG 0000HAjmp MAINORG 000bHajmp PWM ;定时器T0脉宽调制ORG 0013Hajmp COUNT ;外部中断INT1ORG 001bHajmp TIME ;定时器T1 记时ORG 0030HMAIN:mov SP,#60HCLR Portmov 40h,#'0'mov 41h,#'0'mov 42h,#':'mov 43h,#'0'mov 44h,#'0'mov 45h,#':'mov 46h,#'0'mov 47h,#'0'mov 48h,#' 'mov 49H,#'T'mov 4AH,#':'mov 4BH,#'0'mov 4CH,#'0'mov 4DH,#'0'mov 4EH,#'0'mov 4FH,#'s'mov 50h,#'N'mov 51h,#':'mov 52h,#'0'mov 53h,#'0'mov 54h,#'0'mov 55h,#'0'mov 56h,#'0'mov 57h,#'r'mov 58h,#'p'mov 59H,#'m'mov 5AH,#' 'mov 5BH,#'M'mov 5CH,#'o'mov 5Dh,#'t'mov 5EH,#'o'mov 5FH,#01Hclr SIGN_1sCLR SIGN_CT1Smov T10MS,#00HMOV CLOCK_S,#0MOV CLOCK_M,#0MOV CLOCK_H,#0MOV SECONDH,#0MOV SECONDL,#0MOV NO_AME,#0MOV ROUNDL,#0MOV ROUNDH,#0MOV COMP,#0MOV T200MS,#0;setb PT1 ;设置中断优先级;setb IT0 ;选择INT0边沿触发方式setb IT1 ;选择INT1边沿触发方式setb EA ;开总中断允许mov TMOD,#11h;置定时器0方式1,定时器1方式1 mov TH1,#0D8H;定时器1置数,定时10ms mov TL1,#0F0H;mov TH0,#0 ;定时器0置数;mov TL0,#0nopnopsetb ET1 ;开定时器1setb TR1;setb ET0 ;开定时器0;setb TR0;setb EX0 ;开/INT0中断源setb EX1 ;开/INT1中断源lcall INTlcall CG_WRITElcall DISPLAYMAIN_LOOP:ACALL DEALTIMEACALL KEYSNOPNOPAjmp MAIN_LOOPDEALTIME:MOV A,CLOCK_S;处理秒,并送显示寄存区ACALL HBCDACALL HASCMOV SECO_H,AMOV SECO_L,BNOPMOV A,CLOCK_M;处理分,并送显示寄存区ACALL HBCDACALL HASCMOV MINU_H,AMOV MINU_L,BNOPMOV A,CLOCK_H;处理时,并送显示寄存区ACALL HBCDACALL HASCMOV HOUR_H,AMOV HOUR_L,BNOPMOV A,SECONDL;处理工作秒低99秒,并送显示寄存区ACALL HBCDACALL HASCMOV SECL_H,AMOV SECL_L,BNOPMOV A,SECONDH;处理工作秒高99秒,并送显示寄存区ACALL HBCDACALL HASCMOV SECH_H,AMOV SECH_L,BNOPNOPRETKEYS: MOV A,P3 ;处理按键CPL AANL A,#03HJZ KKTOTLCALL DELAY10MSMOV A,P3CPL AANL A,#03HJZ KKTOTJB ACC.0,KEY0JB ACC.1,KEY1KKTOT: AJMP KOUTKEY1: JB P3.1,K1OT;连按判断,按键释放(P3.1=1)才执行功能ACALL DELAYACALL DELAYAJMP KEY1K1OT: INC NO_AME;按B键功能:选择/确定,不可连按MOV A,NO_AMECJNE A,#1,KPD2MOV COMP,#1KPD2: CJNE A,#2,KPD3MOV COMP,#4KPD3: CJNE A,#3,KPD4MOV COMP,#7KPD4: CJNE A,#4,KPD5MOV COMP,#15KPD5: CJNE A,#5,KOUTMOV NO_AME,#0MOV COMP,#16AJMP KK1OUT KEY0: MOV A,NO_AME;按A键功能:数字加1,可连按累加NOPAME_HOUR:CJNE A,#1,AME_MINUINC CLOCK_HMOV A,CLOCK_HCJNE A,#24,KOUTMOV CLOCK_H,#0AJMP KOUTAME_MINU:CJNE A,#2,AME_SECOINC CLOCK_MMOV A,CLOCK_MCJNE A,#60,KOUTMOV CLOCK_M,#0AJMP KOUTAME_SECO:CJNE A,#3,AME_MOTOINC CLOCK_SMOV A,CLOCK_SCJNE A,#60,KOUTMOV CLOCK_S,#0AJMP KOUTAME_MOTO:CJNE A,#4,KOUTMOV A,5FHCJNE A,#01H,SCLOSEMOV 5FH,#00H ;开电机SETB PORTCLR NOSPEEDAJMP KOUTSCLOSE: MOV 5FH,#01H;关电机CLR PORTSETB NOSPEEDKOUT: LCALL DELAY10MSLCALL DELAY10MSLCALL DELAY10MSNOPKK1OUT: NOPRET;============================;标号:HBCD功能:单字节十六进制;整数转换成单字节BCD码整数;入口条件:待转换的单字节十六进制整数;在累加器A中。
;出口信息:转换后的BCD码整数(十位;和个位)仍在累加器A中,百位在R3中。
;影响资源:PSW、A、B、R3 堆栈需求:;2字节HBCD: MOV B,#100;分离出百位,存放在R3中DIV AB; MOV R3,AMOV A,#10 ;余数继续分离十位和个位XCH A,BDIV ABSWAP AORL A,B;将十位和个位拼装成BCD码RET;标号:HASC功能:单字节十六进;制数转换成双字节ASCII码;入口条件:待转换的单字节十六进制数在;累加器A中。
;出口信息:高四位的ASCII码在A中,低;四位的ASCII码在B中。
;影响资源:PSW、A、B 堆栈需求:4;字节HASC: MOV B,A;暂存待转换的单字节十六进制数LCALL HAS1 ;转换低四位XCH A,B ;存放低四位的ASCII码SWAP A ;准备转换高四位HAS1: ANL A,#0FH;将累加器的低四位转换成ASCII码ADD A,#90HDA AADDC A,#40HDA ARET ;标号:HB2功能:双字节十六进制;整数转换成双字节BCD码整数;入口条件:待转换的双字节十六进制整数;在R6、R7中。
;出口信息:转换后的三字节BCD码整数;在R3、R4、R5中。
;影响资源:PSW、A、R2~R7 堆栈需;求:2字节HB2: CLR A;BCD码初始化MOV R3,AMOV R4,AMOV R5,AMOV R2,#10H;转换双字节十六进制整数HB3: MOV A,R7;从高端移出待转换数的一位到CY中RLC AMOV R7,AMOV A,R6RLC AMOV R6,AMOV A,R5;BCD码带进位自身相加,相当于乘2ADDC A,R5DA A ;十进制调整MOV R5,AMOV A,R4ADDC A,R4DA AMOV R4,AMOV A,R3ADDC A,R3MOV R3,A;双字节十六进制数的万位数不超过6,不;用调整DJNZ R2,HB3 ;处理完16bitRET;标号:MULD功能:双字节二进制;无符号数乘法;入口条件:被乘数在R2、R3中,乘数在;R6、R7中。