本帖最后由 铁皮 于 2012-10-21 20:05 编辑
N年没发贴了,先上程序,这是可以直接编译后写入单片机的程序,不要笑话,程序还有很大优化的余地,喜欢的自已优吧
ORG 0000H
LJMP MAIN
ORG 000BH ;周期定时器T0中断服务程序
LJMP INTT0
ORG 001BH ;占空比定时器T1中断服务程序
LJMP INTT1
ORG 0100H
MAIN: CLR P1.7 ;P1.7置低电平,第一个周期全低电平
MOV IE, #00H ;关所有中断
SETB PT0 ;T0中断为最高优先级
MOV TMOD, #11H ;T1为16位,T0为16位
MOV TH0, #0B1H ;T0初值45536,周期20mS
MOV TL0, #0E0H
MOV R0, #7DH ;占空值寄存器赋初值125,中间位置,R0范围:0-250
SETB EA ;开总中断
SETB ET0 ;允许T0中断
SETB ET1 ;允许T1中断
SETB TR0 ;开启T0
BUTTON: MOV P3, #0FFH ;P3=1再读判断
JNB P3.0, BUTTON1 ;没按下P3.0则判断P3.1,按下P3.0则转+程序
JNB P3.1, BUTTON2 ;没按下P3.1继续扫描,按下P3.1时转-程序
AJMP BUTTON
;周期定时器T0中断服务程序,主要功能为将输出变高,计算T1值
INTT0: PUSH ACC
CLR TR1 ;停止T1定时器
MOV TH0, #0B1H ;T0初值45536,周期20mS
MOV TL0, #0E0H ;重装T0初值
STT1: SETB P1.7
MOV A, R0 ;T1=65536-((R0*4)+1000)=64536-R0*4
MOV B, #4H ;R0*4
MUL AB ;R0*4
MOV R6, A ;将低8位寄存入R6,空出A
MOV A, #18H
SUBB A, R6 ;#18H-R6得出低8位值
MOV TL1, A ;装计算出的低8位装入T1
MOV A, #0FCH ;计算高8位
SUBB A, B ;高8位-#0FC
MOV TH1, A ;装计算出的高8位装入T1
SETB TR1 ;开启T1定时器
CLR C
OUT0:POP ACC
RETI
;占空比定时器T1中断服务程序
INTT1: PUSH ACC
CLR P1.7 ;P1.7=0
POP ACC
RETI
;P3.0+键程序
BUTTON1:ACALL DL20MS ;调用延时20mS程序消抖
JB P3.0, BUTTON ;没按P3.0则转回BUTTON(P3.0=1转)
CJNE R0,#0FAH,R0NO250;按+程序,先判R0=250已到最大,不转
AJMP BUTTON ;已到最大跳回
R0NO250:INC R0 ;没到最大则R0+1
AJMP BUTTON
;P3.1-键程序
BUTTON2:ACALL DL20MS ;调用延时20mS程序消抖
JB P3.1, BUTTON ;没按P3.1则转回BUTTON(P3.1=1转)
CJNE R0,#00H,R0NO00 ;-程序,先判R0=00不转
AJMP BUTTON ;跳出,等待按键
R0NO00: DEC R0 ;R0-1
AJMP BUTTON
;20mS延时子程序
DL20MS: MOV R1, #0FAH ;R1赋值250
MOV R2, #28H ;R2赋值40,40*250=10000
XHR1: DJNZ R1, XHR1
MOV R1, #0FAH
DJNZ R2, XHR1
RET
END
说明:
用的是89C2051,白菜价2元一片
p1.7输出信号
P3.0按键逆时针转,p3.1按键顺时针转
T0做周期定时器,周期为20ms,时间到使p1.7输出高电平。
R0做占空比寄存器,数值通过按键控制在0至250之间,
T1做高电平时间定时器,溢出时间为1至2mS之间(要想再精确点还得减去T1启动前运行程序的时间),时间到使p1.7输出低电平,时间值由R0决定
按P3.0时R0慢慢增加,直至250,按P3.1时R0慢慢减小,直至0,通过T0中断服务程序中用R0计算得出对应T1值在1至2mS范围
用Keil uVision4调试程序、生成HEX文件,用ISIS 7 Professional模拟、看波形,用硕飞SP300写入单片机,简单搭的2051最小系统
上机实验舵机角度变化范围为90度,将T1值范围加大应该角度变化会变大
开机时R0设为125,即中间位置
开机时在中间
顺时针到底
逆时针到底
手绘简图,P1.7要直驱那个1K上拉电阻不能少
10月21日加个4通的测试波形图(CH1:0度,CH2:72度,CH3:90度,CH4:180度)4个通道的角度由4个存储器的值决定,4通的程序跟上面单通相差较大,0-180度,8位分辨率,只用了T0一个定时器,为的是留一个定时器做串行通信用,不要笑话,我还不会串口程序,8通及以下用51都没问题,而且程序变化不大
|