XI`ANTECHNOLOGICALUNIVERSITY程序设系统总体方法。
1(1)该系统使用实验箱的直流电机、1602液晶、DA、键盘等模块完成设计;(2)直流电机通过DA模块使用PWM方式进行驱动及调速;(3)能够通过1602液晶显示当前转速及PWM占空比;(4)通过按键控制电机的启动和停止。
2、扩展功能:(1)能够通过按键手动输入目标转速(转/秒),启动电机后控制电机稳定在目标转速;(2)使用1602液晶实时显示目标转速、当前转速及启停状态(on/off)。
四、实验思路:本直流电机调速系统以单片机系统为依托,根据PWM调速的基本原理,控制电动机的转速为依据,实现对直流电动机的调速,并通过单片机控制速度的变化。
本设计的直流电机调速系统主要是由硬件和软件两大部分组成。
硬件部分是前提,是整个系统执行的基础,它主要为软件提供程序运行的平台。
而软件部分,是对硬件端口所体现的信号,加以采集、分析、处理,最终实现控制器所要实现的各项功能,达到控制器自动对电机速度的有效控制。
用51来产生PWM波就必须要用软件编程的方法来模拟。
方法大概可以分为软件延时和定时器DA121602C字符型液晶:CS:片选信号,低电平有效;RS:选择读写的是指令或数据,L:指令,H:为数据。
RW:读写控制端,L:写操作,H:读操作。
12864J图形点阵液晶:CS:片选信号,低电平有效;CS1/2:左右半屏使能选择,H:左半屏,L:右半屏;RS:选择读写的是指令或数据,L:指令,H:为数据。
RW:读写控制端,L:写操作,H:读操作。
12864M图形点阵液晶:JP6的16脚是空脚,JP6的15脚是PSB:PSB接高电平,CPU与液晶使用并行接口连接,连接方法与12864J完全相同;PSB接低电平,CPU与液晶使用串行接口连接,此时,RS、RW、E与CPU的I/O管脚相连(STARES59PA才有该功能)。
(1602C字符型液晶)(12864J图形点阵液晶)2)DAC0832数模转换CS:片选,低有效;OUT:转换电压输出;OUT1:经功放电路的电压输出;主要特性:与MCS-51?兼容·;4K字节可编程FLASH存储器;寿命:1000写/擦循环;?数据保留时间:10年全静态工作:0Hz-24MHz??;?三级程序存储器锁定;128×8位内部RAM??;32可编程I/O线;两个16位定时器/计数器;5个中断源;可编程串行通道;?低功耗的闲置和掉电模式;?片内振荡器和时钟电路;直流电机转速测量/控制5)使用光电开关测速CTRL:控制电压(DAC0832经功放电路提供)输入;REV:光电开关脉冲输出(用于转速测量);3、计算机控制技术的课程设计相比硬件的课程设计,简直难了不止一个档次,作为主要的编程人员,当我实际要去控制一个物体的时候,我才知道自己以前学的知识有多么的不牢固,不过真真正正的去做一个实物控制程序的时候,才能真切的体会到以前书本上学的知识是如何运用到实际的,我基本上可以说是为了应付考试勉勉强强学了一些,这次实际做到项目设计后,才理解其真正的含义。
第页还有本次项目,我们采用了LCD显示屏作为显示单元,比LED数码管复杂,LCD液晶显示屏这也是以前没有运用到过的,所以总体来说,这次课程设计带给我的不仅仅是旧知识的复习,还有新的探索。
本课程设计得以完成,首先要感谢秦刚老师,因为课程设计在他的悉心指导下才能顺利完成。
他渊博的专业知识,严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,严以律己、宽以待人的崇高风范、朴实无华、平易近人的人格魅力对我的影响非常深远。
本设计从选题到完成,每一部步是在老师的指导下完成的,倾注了老师大量的心血。
在课程设sbitset=P1^4; //set按键sbitleft=P1^2; //左移光标sbitright=P1^3; //右移光标sbitLCD_RS=P3^0; //1602的RSsbitLCD_RW=P3^1; //1602的RWsbitsys_data=P3^4; //继电器控制脚,用于切换DA功率输出方向(电机or加热电阻)xdataunsignedchardac0832_addr_at_0xd000;//DA的地址xdataunsignedcharLCD_DATA_at_0x8000;//LCD1602的地址/*******************以下为系统的状态量设置**************/bitrps_triger=0; //转速(温度)刷新显示控制,1为需要刷新显示,0为不需要刷新显示bitscale_triger=0; //占空比刷新显示控制bitpower_triger=0; //电源指示刷新显示控制式4位),0~25%1秒)数)速,反之则缓慢调整)unsignedchartime_scale=0; //占空比总周期计数变量,一个周期200次,可以精确到0.5%unsignedinttime_check[4]={1000,3000,6000,10000};//转速调整时间系数表格unsignedcharcheck=0; //检测周期等级,分为0~4共5个等级,0为极小时间系数,4为稳定不变void_nop_(void);/*******************延时函数*****************/ voiddelay(inta){while(a--);}/*******************外部中断初始化*****************/ voidinit_int0(){}{}{LCD_RS=0;LCD_RW=0;LCD_DATA=com;delay(80);}voidLCD_write_data(unsignedchardat){LCD_RS=1;LCD_RW=0;LCD_DATA=dat;delay(80);}/*************LCD1602在电机调速系统下的初始化函数*************/{LCD_write_data('.');LCD_write_com(0xcf);LCD_write_data('%');LCD_write_com(0x8b);LCD_write_data(rps1/1000+0x30);LCD_write_data(rps1%1000/100+0x30);LCD_write_data(rps1%100/10+0x30);LCD_write_data(rps1%10+0x30);}/***************光标闪烁开***************/ voidflash_on(void){LCD_write_com(0x0f);}{}{rps_triger=0;}/************显示当前占空比**************/ voiddisplay_scale(void){flash_off();LCD_write_com(0xcb);LCD_write_data(scale/2/10+0x30);LCD_write_data(scale/2%10+0x30);LCD_write_com(0xce);LCD_write_data(scale%2*5+0x30);scale_triger=0;}/************显示auto模式的状态**************/{{}{LCD_write_data('');}auto_triger_triger=0;}/************显示power的状态(on或off)*************/ voiddisplay_power(void){flash_off();LCD_write_com(0xc0);if(power_data==0){LCD_write_data('o');LCD_write_data('f');LCD_write_data('f');}{}}{{scale--;if(scale<=1)scale=1;}elseif(rps1>rps_data){scale++;if(scale>=199)scale=199;}scale_triger=1;}/************显示电机调速系统下set模式函数**************/ voiddisplay_set(void){{}}{if(power==1)return;else{delay(20);//按键去抖if(power==0){while(power!=1);power_data=~power_data;power_triger=1;set_triger=0;auto_triger_triger=1;}elsereturn;}}{{}}/************set设置模式键**************/ voidfn_set(){if(set==1)return;else{delay(20);//按键去抖if(set==0){while(set!=1);set_triger=~set_triger;auto_triger=0;}}{{switch(set_data){case0:if(rps1/1000>=1)rps1=rps1-1000;break;case1:if(rps1%1000/100>=1)rps1=rps1-100;break;case2:if(rps1%100/10>=1)rps1=rps1-10;break;case3:if(rps1%10>=1)rps1=rps1-1;break;}}else{if(scale<=1)scale=1;elsescale--;scale_triger=1;}}}{{{case0:if(rps1/1000<9)rps1=rps1+1000;break;case1:if(rps1%1000/100<9)rps1=rps1+100;break;case2:if(rps1%100/10<9)rps1=rps1+10;break;case3:if(rps1%10<9)rps1=rps1+1;break;}}else{if(scale>=199)scale=199;elsescale++;scale_triger=1;}}}}{{}elsereturn;}elsereturn;}}/************光标右移键(set模式下有效)**************/voidfn_right(){if(right==1)return;else{delay(20);//按键去抖if(right==0)}}{}/****************定时器0中断服务函数*****************/ voidtimer0(void)interrupt1{unsignedintt;TH0=0xff; //重新装载计时常数TL0=0x1a;if(time_scale>=200)time_scale=0; //占空比计数控制if(time>=4000) //如果计满1秒,计秒变量归零,并将rps的转数数据送到转速(温度)数据变量中保存{time=0;time_scale=0;if(sys_data==1)rps_data=rps*60/4;//在电机调速模式下:每转有4个脉冲,所以除以4 rps=0; //rps归零{}{}{if(time_scale<=scale)dac0832_addr=0xff;//PWM信号输出elsedac0832_addr=0x00; //PWM信号输出}elsedac0832_addr=0x00; //PWM信号输出if(time2>=200) //数据差值检测,0.5秒1次{time2=0;t=abs(rps_data-rps1);//电机调速系统下的参数调整等级划分if(t>1200)check=0;else{if(t>500)check=1;else空比}if(auto_triger==1)check_rps();}elsetime3++;}}/****************主函数*****************/voidmain(){key0=1; //读引脚之前要写1key1=1;power=1;set=1;T0_init(); //T0初始化init_int0(); //外部中断int0初始化{状态显示if(sys_data==1)display_set(); //不同的系统(电机调速、温度控制)不同的set状态显示}}}。