查看: 1633|回复: 5
|
请教会ASM和C language的大大看看这program 如何用C language写?
[复制链接]
|
|
我写了个ASM的program 但我想看一看有哪位大大会用C language 写类似的program 吗,因为我不大会C programming,但我想看看这program要如何用c language写,尤其是interrupt的部分.我用的mcu是89c52,11.0592MHz.我已经simulate了这program,可以跑的,我只是想看看大大们如何用C写类似的program吧了。
我的program 是switch 1-5(pin 3,4,5,6,7) 分别输出20%,40%,60%,80%和100%的pwm 来control 12v dc motor turn left.
switch 6(pin 8) 是100% pwm control 12v dc motor turn right.
然后,switch 7,8(pin 11,12)是control servo motor turn left & right 的。
我的simulation 图如下:
我的ASM program 如下:
CPU "8051.TBL"
INCL "8051.INC"
ORG 0000H
JMP MAIN
ORG 000BH
JMP ISR_T0
ORG 001BH
JMP ISR_T1
;##############################################################################
;USE 11.0592MHz
MAIN: MOV TMOD,#00010001B ;TIMER1=16BIT TIMER, TIMER0=16BIT TIMER
SETB EA ;ENABLE ALL INTERRUPTS
SETB ET0 ;ENABLE TIMER 0 INTERRUPT
SETB ET1 ;ENABLE TIMER 1 INTERRUPT
MOV TH0,#0B8H ;20ms (65536-18432=47104dec=b800hex)
MOV TL0,#00H
MOV TH1,#0FAH ;1.5ms (65536-1382=64154dec=FA9Ahex)
MOV TL1,#9AH
SETB TR0
SETB TR1
;##############################################################################
START: CLR P1.0 ;reverse control
CLR P1.1 ;forward control
;##############################################################################
REV: JB P1.7,PWM100 ;100% pmw reverse
MOV 40h,#100
SETB P1.0
LPREV: MOV 42H,#100
DJNZ 42H,$
DJNZ 40H,LPREV
CLR P1.0
JMP REV
;##############################################################################
PWM100: JB P1.6,PWM80 ;100% pmw forward
MOV 40h,#100
SETB P1.1
LP100A: MOV 42H,#100
DJNZ 42H,$
DJNZ 40h,LP100A
CLR P1.1
JMP REV
;##############################################################################
PWM80: JB P1.5,PWM60 ;80% pmw forward
MOV 40H,#80
MOV 41H,#20
SETB P1.1
LP80A: MOV 42H,#100
DJNZ 42H,$
DJNZ 40H,LP80A
CLR P1.1
LP80B: MOV 42H,#100
DJNZ 42H,$
DJNZ 41H,LP80B
JMP REV
;##############################################################################
PWM60: JB P1.4,PWM40 ;60% pmw forward
MOV 40H,#60
MOV 41H,#40
SETB P1.1
LP60A: MOV 42H,#100
DJNZ 42H,$
DJNZ 40H,LP60A
CLR P1.1
LP60B: MOV 42H,#100
DJNZ 42H,$
DJNZ 41H,LP60B
JMP REV
;##############################################################################
PWM40: JB P1.3,PWM20 ;40% pmw forward
MOV 40H,#40
MOV 41H,#60
SETB P1.1
LP40A: MOV 42H,#100
DJNZ 42H,$
DJNZ 40H,LP40A
CLR P1.1
LP40B: MOV 42H,#100
DJNZ 42H,$
DJNZ 41H,LP40B
JMP REV
;##############################################################################
PWM20: JB P1.2,JMP20 ;20% pmw forward
MOV 40H,#20
MOV 41H,#80
SETB P1.1
LP20A: MOV 42H,#100
DJNZ 42H,$
DJNZ 40H,LP20A
CLR P1.1
LP20B: MOV 42H,#100
DJNZ 42H,$
DJNZ 41H,LP20B
JMP20: JMP REV
;##############################################################################
ISR_T0: CLR TR0
CLR TF0
MOV TH0,#0B8H
MOV TL0,#00H
LEFT: JB P3.1,RIGHT
MOV TH1,#0FAH
MOV TL1,#0AEH
JMP EXIT
RIGHT: JB P3.2,CENTRE
MOV TH1,#0F9H
MOV TL1,#0AFH
JMP EXIT
CENTRE: MOV TH1,#0FAH
MOV TL1,#2EH
EXIT: SETB P3.0 ;SERVO MOTOR SIGNAL PIN
SETB TR0
SETB TR1
RETI
;##############################################################################
ISR_T1: CLR TR1
CLR TF1
CLR P3.0
RETI |
|
|
|
|
|
|
|
发表于 18-1-2008 06:43 AM
|
显示全部楼层
interrupt 部分:
interrupt number , description , vector address
0 , External INT 0 , 0003H
1 , Timer /Counter 0, 000BH
2 ,External INT1 , 0013H
3 ,Timer/Counter 1 , 001BH
4 ,Serial Port , 0023H
开始你要initialise 你的 interrupt,
IE= 0x8A; // enable global , timer 0 and 1 interrupt
然后你的interrupt function 是:
void ISR_T1 (void) interrupt 3 { //有了红色那部分, 你的这个就是interrupt function了。
TR1=0; //只要 enable interrupt, 就自动跳来这里,
TF1=0; //不用自己set 在0018H jump 这里。
P3.0=0;
} |
|
|
|
|
|
|
|
发表于 20-1-2008 02:22 AM
|
显示全部楼层
原帖由 yes1010 于 18-1-2008 02:03 AM 发表
我写了个ASM的program 但我想看一看有哪位大大会用C language 写类似的program 吗,因为我不大会C programming,但我想看看这program要如何用c language写,尤其是interrupt的部分.我用的mcu是89c52,11.0592MHz.我已 ...
要从asm convert去c是很麻烦的, 除非你是那个写asm的人,知道program flow的了。
不如你放flow chart或者做一点 program flow的解释, 这样比较可以帮到你。(有点懒惰看code...)
或者你自己可以写, 然后post上来, 大家一起讨论, 这样会更好。
8051 c compiler不错的有
keil -> 付费软件。free trial, 2k code limitation.
sdcc->免费软件。 |
|
|
|
|
|
|
|
楼主 |
发表于 20-1-2008 01:58 PM
|
显示全部楼层
谢谢chan1314和fitlizt 回我的话题,对不起我没做program flow的解释,在此补上了:
main program部分:
check switch port1.2 -port1.7
如果switch port1.7 low,setbit port1.0;
如果switch port1.2-port1.6 low, 依次send 20%,40%,60%,80%,100% pwm 去port p1.1, duty cycle 10ms.
interrupt 部分:
timer 0 每20ms set bit port3.0,check port3.1 port3.2;
如果port3.1和 port3.2没low的话,叫timer 1 在1.5ms后clear bit port 3.0.
如果port 3.1 low,叫timer 1 在1.25ms后clear bit port 3.0.
如果port 3.2 low,叫timer 1 在1.75ms后clear bit port 3.0.
我真的不会用c 写program,对不起,见笑了 ,真的请你们教我如何写。 |
|
|
|
|
|
|
|
发表于 24-1-2008 02:06 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 24-1-2008 06:45 AM
|
显示全部楼层
楼上的program 基本上是对的。
不过delay 那边他忘了clear timer over flag. -> TF1 = 0;
pwm部分可以参考我的program, led blinking那边。 用timer2 来generate pwm.
http://chinese3.cari.com.my/myforum/viewthread.php?tid=1030872&extra=page%3D1&page=3
还有interrupt那边unsigned int i; 用unsigned char i; 就可以了。
int occupied 2 bytes ram,16bits, process time比较长。没超过255用unsigned char比较省ram, 时间。
这是我的意见, 最近比较忙, 有空再写我的solution贴上来。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|