佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1533|回复: 5

请教会ASM和C language的大大看看这program 如何用C language写?

[复制链接]
发表于 18-1-2008 02:03 AM | 显示全部楼层 |阅读模式
我写了个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
回复

使用道具 举报


ADVERTISEMENT

发表于 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 | 显示全部楼层
我很久没写了。。(我刚毕业的。。)
现在要找工,复习复习一下
我是用keil 写的.

timer 1 用来算0.25ms
timer 0 用来算 20ms
send pwm 的部分还没写。。

#include <REG8252.H>

void delay_025ms(void){
  
  TH1 = 0x0FF;
  TL1 = 0x19;
  TR1 = 1;
  while(TF1 == 0);
  TR1 = 0;
}

void ISR_Timer0(void) interrupt 1{

  unsigned int i;

  P3_0 = 1;

  if(P3_1 == 1 && P3_2 == 1){         // 1.5ms clear bit port 3.0  
    for(i=0; i<6; i++)        // 6x0.25ms = 1.5ms
      delay_025ms();  
    P3_0 = 0;
  }

  if(P3_1 == 0){    //1.25ms clear bit port 3.0
    for(i=0; i<5; i++)
      delay_025ms();
    P3_0 = 0;
  }

  if(P3_2 == 0){          //1.75ms clear bit port 3.0
    for(i=0; i<7; i++)
      delay_025ms();
        P3_0 = 0;
  }

//if port 3.1 and 3.2 = 0??
}

void main(void){

        IE = 0x82;      
    TMOD = 0x11;
        TH0 = 0x0B7;
        TL0 = 0xFE;
        TR0 = 1;

        while(1){
          if(P1_7 == 0)
             P1_0 = 1;
          if(P1_2 == 0)
            ;// send 20%                        (给你想一想 )
          if(P1_3 == 0)
            ;// send 40%
          if(P1_4 == 0)
            ;// send 60%
          if(P1_5 == 0)
            ;// send 80%
          if(P1_6 == 0)
           ; // send 100%  
        }
}

[ 本帖最后由 Juzleave 于 24-1-2008 02:11 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贴上来。
回复

使用道具 举报

Follow Us
您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 6-5-2024 04:57 AM , Processed in 0.059717 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表