07汽电一08年上学期学生成绩! 07运八08年上学期学生成绩!
发新话题
打印

单片机课程设计_直流风扇电机转速测量与PWM控制

单片机课程设计_直流风扇电机转速测量与PWM控制

一.设计思路
程序应用模块化进行设计,主要有初始化模块、显示模块、读键模块、数制转换模块、双字节除法模块、中断模块和控制调节模块。编程次序可按此先后进行。
初始化模块:8155工作方式、T0和T1工作方式、标志位状态、所用单元初值、中断设置以及初始显示等。
显示模块:设定值和实测值的数值与字符动态显示。
读键模块:从I/O口依据某位数码管亮时读入小按键是否有效,然后根据四个小键盘的不同功能进行相应的处理,只要设定值一改变立刻显示。加1键和减1键要有连加连减功能。
数制转换模块:将二进制转换为十进制。
外部中断模块:将转1圈的时间通过双字节除法程序求出即时转速。
定时中断模块:PWM输出波形形成。
控制调节模块:通过设定值和实测值的比较来改变脉冲波的占空比,该数据的调节分为简单比例调节PP和比例积分调节PI。调节公式分别为:
YK=YK1+KP*EK
YK=YK1+KP*EK+KI*EK2
YK:要输出的数据
YK1:上次输出的数据
EK:设定值和实测值的差值
EK1:上次的EK值
EK2:EK-EK1的差值
KP:比例系数(设KP=1~2)
KI:积分系数(设KI=1~2)
一.    带注释软件清单
;==========使用单元设定==========
//..................................使用单元设定
     DIS0 EQU 30H
     DIS1 EQU 31H
     DIS2 EQU 32H
     DIS3 EQU 33H
     LED EQU 34H
     TM1 EQU 35H;
     TM2 EQU 36H;
     INTV BIT 37H;中断标志
     THX EQU 38H;定时脉宽高电平
     CISHU EQU 39H
     FIRST BIT 41H; 检测加减是否第一次按下
     SET1 BIT 42H
     SETZ0 EQU 43H;设定当前设定值SETZ0~SETZ3
     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 52H; 设定速度暂存单元
     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 001BH;定时器T1中断入口地址
       AJMP ITX1
       ORG 0070H
MAIN:  MOV SP,#70H;设定堆栈指针入口地址
        ACALL INIT;调用初始化程序
  M1:  JB SET1,FLASH;当前为设置状态则跳到闪烁显示模块
        ACALL DISP; 否则为一般显示
        SJMP NEXTT
FLASH: ACALL DISP1
NEXTT: ACALL DELAY;调用按键延时程序
        ACALL M2;调用按键程序
        DJNZ CISHU,M1;第隔100MS刷新一下实测值
        MOV CISHU,#20
ACALL CONTROL;调用控制调速模块
        SJMP M1
//==========初始化模块==========
  INIT:MOV 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中断
       SETB 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,#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;
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 DIS3,SETZ3

      MOV DIS2,SETZ2

SHANRET: 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 KK0
RET

KEY:  MOV A,LED

      JB  FIRST,PK1; 若FIRST为1则调用密码按键 PKEY1,KEY2,KEY3,PKEY4

      JNB ACC.0,KEY1  ;否则调用一般按键KEY1-KEY4,其中KEY2,KEY3为共用的

      JNB ACC.3,KEY4

      SJMP PK2

PK1:  JNB ACC.0,PKEY1

      JNB ACC.3,PKEY4

PK2:  JNB ACC.1,KEY2

      JNB ACC.2,KEY3

RET



;==========设置键设定==========

  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 SETZ3,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

      RET

PANGAO:MOV A,DIS2      ;             低位减到0判断高位是否为0,

       JZ ENDKEY        ;             是0则什么也不做,返回

[ 本帖最后由 cool 于 2007-6-17 17:49 编辑 ]

TOP

JIE1:MOV DIS3,#9        ;            若高位不为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:RET

PKEY4:JB 11H,SUCCESS

      MOV A,DIS3

      CJNE A,#5,ERROR ;            判定输入密码的低位是否正确,不正确直接

      MOV A,DIS2;                  跳到输入密码状态,若正确,再看高位正确否

      CJNE A,#6,ERROR ;            正确则跳到SUCCESS,否则也返回输入密码状态

SUCCESS:SETB 11H ;                11H为判定密码成功与否标志

      JB 07H,FC ;                    输入成功密码第一次先跳到FC,测定初值

      CLR FIRST ;                   设定完成,将输入密码标志清掉

      SETB TR1 ;                    定时器0和1打开

      SETB TR0;

      SETB ONPRESS

      SJMP PRET

FC:   MOV DIS0,#11;                  设定输入测定值的显示方式

      MOV DIS1,#15

      MOV SETZ2,#0

      MOV SETZ3,#0

      CLR 07H;                       07H是用于设定是否第一次设定

      SETB ONPRESS

      RET

ERROR:MOV DIS3,#15;                 当密码输入错误时,返回输入密码状态

       MOV DIS2,#15

PRET:  RET

ENDKEY:RET

;==========单步加减&连续加减子程序==========

;==加部分==

JIA:JB JIA1,S1

    SETB JIA1

    MOV TM3,#20

S2:INC DIS3

   JB LIANJIA,ALLRET

S1:JB LIANJIA,S2

   DJNZ TM3,ALLRET

   SETB LIANJIA
SJMP S2

   RET

;==减部分==

JIAN:JB JIAN1,S3

      SETB JIAN1

      MOV TM3,#20

S4:DEC DIS3

   JB LIANJIAN,ALLRET

S3:JB LIANJIAN,S4

   DJNZ TM3,ALLRET

   SETB LIANJIAN

   SJMP S4

RET

//============判断键是否弹起===========

KK0:MOV A,LED

    JB ACC.2,KK1;         

    CLR JIAN1

    CLR LIANJIAN

    RET

KK1:MOV A,LED

    JB ACC.1,KK2

    CLR JIA1

    CLR LIANJIA

    RET

KK2:MOV A,LED

    JB ACC.3,ALLRET

    CLR ONPRESS

    RET

ALLRET:RET

//==========定时器T1中断模块(用于调速)==========

ITX1:PUSH ACC

     PUSH B

     CPL P1.0

     JNB P1.0,L1

     MOV TH1,THX

     SJMP L2

L1:  MOV A,#0FFH

     CLR C

     SUBB A,THX

     MOV TH1,A

L2:  POP 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,TL0

CHUZHI:MOV TH0,#00H;  将定时器初值置0

       MOV TL0,#00H

       SETB TR0 ;    定时器打开

       ACALL CHUFA ;   调用双字节除法程序

RETIX: POP B

       POP ACC

       RETI

TOP

发新话题
本社区内所有文章为会员所发布,会员拥有该内容的所有权力及责任,转载时请注明出处! ! 管理员 冷雨 QQ:414195205
拒绝任何人以任何形式在本社区发表与中华人民共和国法律相抵触的言论!
同一个世界 同一个梦想 One World One Dream