单片机课程设计直流风扇电机转速测量与PWM控制_第1页
单片机课程设计直流风扇电机转速测量与PWM控制_第2页
单片机课程设计直流风扇电机转速测量与PWM控制_第3页
单片机课程设计直流风扇电机转速测量与PWM控制_第4页
单片机课程设计直流风扇电机转速测量与PWM控制_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机课程设计_直流风扇电机转速测量与pwm控制一设计思路程序应用模块化进行设计,主要有初始化模块、显示模块、读键模块、数制转换模块、双字节除法模块、中断模块和控制调节模块。编程次序可按此先后进行。初始化模块:8155工作方式、t0和t1工作方式、标志位状态、所用单元初值、中断设置以及初始显示等。显示模块:设定值和实测值的数值与字符动态显示。读键模块:从i/o口依据某位数码管亮时读入小按键是否有效,然后根据四个小键盘的不同功能进行相应的处理,只要设定值一改变立刻显示。加1键和减1键要有连加连减功能。数制转换模块:将二进制转换为十进制。外部中断模块:将转1圈的时间通过双字节除法程序求出即时转速。

2、定时中断模块:pwm输出波形形成。控制调节模块:通过设定值和实测值的比较来改变脉冲波的占空比,该数据的调节分为简单比例调节pp和比例积分调节pi。调节公式分别为:yk=yk1+kp*ekyk=yk1+kp*ek+ki*ek2yk:要输出的数据yk1:上次输出的数据ek:设定值和实测值的差值ek1:上次的ek值ek2:ek-ek1的差值kp:比例系数(设kp=12)ki:积分系数(设ki=12)一 带注释软件清单;=使用单元设定=/.使用单元设定 dis0 equ 30h dis1 equ 31h dis2 equ 32h dis3 equ 33h led equ 34h tm1 equ 35h

3、; tm2 equ 36h; intv bit 37h;中断标志 thx equ 38h;定时脉宽高电平 cishu equ 39h first bit 41h; 检测加减是否第一次按下 set1 bit 42h setz0 equ 43h;设定当前设定值setz0setz3 setz1 equ 44h setz2 equ 45h setz3 equ 46h tm3 equ 47h; 循环次数单元 jia1 bit 48h; 单步加标志 lianjia bit 49h; 连加标志 jian1 bit 50h; 单步减标志 lianjian bit 51h; 连减标志 setdata equ 5

4、2h; 设定速度暂存单元 realdata equ 53h; 实测速度暂存单元 yk1 equ 54h; 上次输出数据暂存单元 kp equ 56h;比例系数 ki equ 57h;积分系数 ek equ 58h;设定值和实测值的差值 ek1 equ 59h;上次的ek值 output equ 60h; ek2 equ 61h;ek-ek1的值 onpress bit 62h;判定enter键是否弹起标志 tms equ 63h;闪烁时长 shan bit 64h; 闪烁标志;=主程序= org 0000h sjmp main org 0013h;外部中断1入口地址 ajmp inx1 org

5、 001bh;定时器t1中断入口地址 ajmp itx1 org 0070hmain: mov sp,#70h;设定堆栈指针入口地址 acall init;调用初始化程序 m1: jb set1,flash;当前为设置状态则跳到闪烁显示模块 acall disp; 否则为一般显示 sjmp nexttflash: acall disp1nextt: acall delay;调用按键延时程序 acall m2;调用按键程序 djnz cishu,m1;第隔100ms刷新一下实测值 mov cishu,#20acall control;调用控制调速模块 sjmp m1/=初始化模块= init:m

6、ov dptr,#0fd00h ;设置pa、pb为输出口,pc为输入口 mov a,#03h movx dptr,a mov tmod,#21h ;定时器/计数器t1为方式2,定时器/计数器t0为方式1 mov tl0,#00h ; 定时器/计数器t0赋初值#00h mov th0,#00h mov thx,#0bbh ;输出单元赋初值#0bbh,即脉冲高电平宽度 mov th1,thx mov tl1,thx setb tr1 ;启动定时器/计数器t1 setb tr0 ; 启动定时器/计数器t0 setb et1 ;允许定时器/计数器t1溢出中断 setb ex1 ;允许外部中断1中断 s

7、etb it1 ;选择边沿触发 setb ea ;cpu开中断 setb 07h; setb shan clr 11h;检测是否成功 mov led,#7fh mov r0,#dis0 mov dis0,#14 mov dis1,#15 mov dis2,#15 mov dis3,#15 mov setz2,#15 mov setz3,#15 clr onpress setb set1 setb first clr jia1 clr lianjia clr jian1 clr lianjian clr intv mov kp,#1 mov ki,#1 mov ek1,#0 mov cishu,

8、#20 mov tm2,#50 ret/=显示模块= disp:mov dptr,#0fd02h ;指向pb口 mov a,led rl a ;左移1位 jb acc.4,d1 mov a,#0feh ; 移出则重设起始值 mov r0,#dis0 d1:mov led,a movx dptr,a mov a,r0 ; 取显示ram数据 mov dptr,#tab movc a,a+dptr ; 换码操作 mov dptr,#0fd01h ; 置8155 pa口 movx dptr,a inc r0 ;未移出则显示ram地址加1 ret/=设置时闪烁模块=disp1:jb shan,liang

9、;djnz tms,an 闪烁标志shan为1时调用disp显示模 cpl shan; 块显示当前设定值,闪烁时间到,将标志取 mov tms,#50 ;反,并再次送入闪烁时长tms.当闪烁标 sjmp shanret;志为0时闪烁时间到先将dis3, dis2, liang:acall disp ; 送入#16,即全灭值,再调用disp,再将标 djnz tms,shanret; 志位取反,重新装入时长tms,这样就 cpl shan;能实现闪烁功能 mov tms,#50 sjmp shanret an: mov dis3,#16 mov dis2,#16 acall disp mov d

10、is3,setz3 mov dis2,setz2shanret: ret/=延时5ms子程序模块=delay:mov tm2,#5 del2:mov tm1,#255 del1:djnz tm1,del1 djnz tm2,del2 ret/=读键模块=m2: mov dptr,#0fd03h;置pc口 movx a,dptr jnb acc.5,key; 若pc5为0则调用按键程序 acall kk0retkey: mov a,led jb first,pk1; 若first为1则调用密码按键 pkey1,key2,key3,pkey4 jnb acc.0,key1 ;否则调用一般按键key

11、1-key4,其中key2,key3为共用的 jnb acc.3,key4 sjmp pk2pk1: jnb acc.0,pkey1 jnb acc.3,pkey4pk2: jnb acc.1,key2 jnb acc.2,key3ret;=设置键设定= key1:setb set1 mov dis0,#11 ;将前次设定值代入 mov dis1,setz1 mov dis2,setz2 ;装入上次设定值 mov dis3,setz3 ret;=加键设定= key2:jnb set1,endkey acall jia; 调用jia程序,看是单步加还是连加 mov a,dis3 mov setz

12、3,a cjne a,#10,endkey jin1:mov dis3,#0;若低位满10则高位加1,并将低位变为0 inc dis2 mov a,dis2 mov setz2,a cjne a,#10,endkey sjmp endkey;=减键设定=key3:jnb set1,endkey mov a,dis3 jz pangao jj:acall jian ; 调用jian程序,看是单步加还是连减 mov setz3,dis3 retpangao:mov a,dis2 ; 低位减到0判断高位是否为0, jz endkey ; 是0则什么也不做,返回jie1:mov dis3,#9 ; 若

13、高位不为0则高位减1,低位置9 dec dis2 mov setz2,dis2 sjmp jj;=enter键设定=key4:jb onpress,endkey clr set1; 将设置标志清掉 mov dis0,#10 mov setz1,dis1 ret/=设定密码时的设置和enter按键=pkey1:retpkey4:jb 11h,success mov a,dis3 cjne a,#5,error ; 判定输入密码的低位是否正确,不正确直接 mov a,dis2; 跳到输入密码状态,若正确,再看高位正确否 cjne a,#6,error ; 正确则跳到success,否则也返回输入密

14、码状态success:setb 11h ; 11h为判定密码成功与否标志 jb 07h,fc ; 输入成功密码第一次先跳到fc,测定初值 clr first ; 设定完成,将输入密码标志清掉 setb tr1 ; 定时器0和1打开 setb tr0; setb onpress sjmp pretfc: mov dis0,#11; 设定输入测定值的显示方式 mov dis1,#15 mov setz2,#0 mov setz3,#0 clr 07h; 07h是用于设定是否第一次设定 setb onpress reterror:mov dis3,#15; 当密码输入错误时,返回输入密码状态 mov

15、 dis2,#15pret: retendkey:ret;=单步加减连续加减子程序=;=加部分=jia:jb jia1,s1 setb jia1 mov tm3,#20s2:inc dis3 jb lianjia,allrets1:jb lianjia,s2 djnz tm3,allret setb lianjiasjmp s2 ret;=减部分=jian:jb jian1,s3 setb jian1 mov tm3,#20s4:dec dis3 jb lianjian,allrets3:jb lianjian,s4 djnz tm3,allret setb lianjian sjmp s4r

16、et/=判断键是否弹起=kk0:mov a,led jb acc.2,kk1; clr jian1 clr lianjian retkk1:mov a,led jb acc.1,kk2 clr jia1 clr lianjia retkk2:mov a,led jb acc.3,allret clr onpress retallret:ret/=定时器t1中断模块(用于调速)=itx1:push acc push b cpl p1.0 jnb p1.0,l1 mov th1,thx sjmp l2l1: mov a,#0ffh clr c subb a,thx mov th1,al2: pop

17、 b pop acc reti/=外部中断1模块(用于测速)=inx1:push acc push b jb set1,retix ; 若当前为设置状态则不做测速 clr tr0 ; 当产生中断时,先关定时器0 mov r6,th0 ; 将当前的th0放入r6,tl0放入r7 mov r7,tl0chuzhi:mov th0,#00h; 将定时器初值置0 mov tl0,#00h setb tr0 ; 定时器打开 acall chufa ; 调用双字节除法程序retix: pop b pop acc reti单片机课程设计_直流风扇电机转速测量与pwm控制(含p调节和pi调节)4#e#;=双字

18、节除法=chufa:mov r2,#00h ; 赋被除数r2r3r4r5=500000us mov r3,#07h mov r4,#0a1h mov r5,#20hddiv: mov b,#16ddv1:clr c mov a ,r5 rlc a mov r5,a mov a,r4 rlc a mov r4,a mov a,r3 rlc a mov r3,a xch a,r2 rlc a xch a,r2 mov f0,c clr c subb a,r7 mov r1,a mov a,r2 subb a,r6 jb f0,ddv2 jc ddv3ddv2:mov r2,a mov a,r1 m

19、ov r3,ainc r5ddv3:djnz b,ddv1/=数值转换模块(将二进制-十进制)=bin:mov a,r5 mov b,#10 div ab mov dis2,a ; 将商赋予显示值的高位dis2 mov dis3,b ; 将余数赋予显示值的低位dis3 mov realdata,r5 ;将测速值r5赋予实测值单元realdata ret/=控制调节模块=control:jb p1.5,pi ; 若p1.5=1做pi环节,否则做pp环节 acall pp; mov th1,thx ret pi:mov a,setz2 ; setz2为设定值的高位 mov b,#10 mul ab

20、 add a,setz3 ; 此时a中为设定值setdata mov setdata,a clr c subb a,realdata mov ek,a ; ek=设定值setdata-实测值realdata jc downzero ; 若有借位(即设定值setdata实测值realdata), sjmp overzero; 转向downzero;否则转向overzerodownzero:mov a,realdata subb a,setdata ; 将实测值realdata-设定值setdata的差值存入a mov b,kp mul ab mov b,a ; 将(realdata-setdat

21、a)*kp的值存入b mov a,thx ;将上次输出的数据thx存入a subb a,b mov 05h,a ; 05h=yk1+kp*ek jc fu ;若有借位,转向fu,否则转向zheng sjmp zhengoverzero:mov b,kp mul ab ;将ek*kp的值存入a add a,thx jmp zhengzheng: mov a,ek subb a,ek1 mov ek2,a ;ek2=ek-ek1 jc zheng1 ;若有借位即ek2风速最大值#0ffh, sjmp overppi; 则转向xx1;否则转向overppi xx1: clr c mov a,#0ff

22、h ; 将风速最大值#0ffh存入a sjmp overppizheng2: mov a,ek1 subb a,ek ; 将ek1-ek的值存入a mov b,a mov a,ki mul ab ;将ki*(ek1-ek)的值存入a mov b,a mov a,05h subb a,b ; 将yk1+kp*ek+ki*ek2的值存入a jc xx2 ;若有借位即(a)0,则转向xx2; sjmp overppi; 否则转向overppi xx2: clr c mov a,#00h sjmp overppi fu: mov a,ek subb a,ek1 mov ek2,a jc xx2 ; 若

23、有借位即ek2=ek-ek1的值0, sjmp fu1;则转向xx2;否则转向fu1fu1: mov a,ek2 subb a,05h ; a=ek2-(yk1+kp*ek) jc xx2 ; 若有借位即a的值0,则转向xx2; sjmp overppi; 否则转向overppioverppi:mov thx,a mov ek1,ek retpp: mov a,setz2 ; setz2为设定值的高位 mov b,#10 mul ab add a,setz3 ;此时a中为setdata mov setdata,a clr c subb a,realdata ;此时a中为ek=setdata-realdata jz cc ;若setdata=realdat,转向cc jc tt1 ; 若有借位即ek=setdata-realdata#0ffh,则转向pp2;否则转向pp4 sjmp pp4 tt1: clr c ; 实测值大于设定值的情况 mov a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论