单片机课程设计_直流风扇电机转速测量与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 编辑 ]
搜索更多相关主题的帖子:
电机 PWM 转速测量 风扇 单片机