;******************************************************* ; DC Motor Cotrol : MCS-51 ; WWW.Guidecircuit.com ; MCU : AT89C1051 ;******************************************************* COM1 BIT P3.7 COM2 BIT P1.0 SDA BIT P3.4 SCL BIT P3.3 LED_PWM BIT P3.5 SW_PWM_DOWN BIT P3.1 SW_PWM_UP BIT P3.0 SW_LR BIT P3.4 PWM EQU 09 I2C_DATA EQU 10 BUF_SEG1 EQU 11 BUF_SEG2 EQU 12 DELAY_SEG EQU 13 SS200US EQU 14 OUTPUT EQU 15 EEPROM_CODE EQU 10100000B ;******************************************************* ; MAIN PROGRAM ;******************************************************* ORG 0000H MOV SP,#07H MOV P1,#11111111B MOV P3,#11111111B LCALL DELAY_100MS LCALL READ_EEPROM START: MOV R4,PWM Z1 LCALL CONVERT LCALL DISPLAY LCALL PWM_MODE Z2: JB PWM_DOWN,Z3 LCALL MODE_PWM_DOWN Z3; JB PWM_UP,Z1 LCALL MODE_PWM_UP Z4: JB SW_LR,Z1 SJMP ;******************************************************** ; PWM MODE ;******************************************************** MODE_PWM_UP: PUSH AC MOVE A,PWM CJNE A,#60H,PW1 SJMP PW2 PW1:INC PWM MOV A,PWM ADD A,#00 DA A MOV PWM,A PW2:MOV R4,A LCALL SCAN_WAIT LCALL WRITE_EEPROM POP ACC RET MODE_PWM_DOWN:PUSH ACC MOV A,PWM CJNE A,#00H,PW3 SJMP PW6 PW3:DEC PWM MOV A,PWM ANL A,#0FH CJNE A,#0FH,PW4 PW4:MOV A,PWM JC PW5 ADD A,#10H SUBB A,#10H PW5:MOV PWM,A PW6:MOV R4,A LCALL SCAN-WAIT LCALL WRITE_EEPROM POP ACC RET MODE_LR:CLR LED_PWM LCALL DELAY_1S CPL P3.2 LCALL DELAY_1S RET SCAN_WAOT:MOV R3,#90 LCALL CONVERT QW:LCALL DIAPLAY LCALL PWM_MODE DJNZ R3,QW RET TABLE_SEGMENT:DB 01111111B ;0 DB 00001101B ;1 DB 10110111B ;2 DB 10011111B ;3 DB 11001101B ;4 DB 11011011B ;5 DB 11111011B ;6 DB 00001111B ;7 DB 11111111B ;8 DB 11011111B ;9 CONVERT:PUSH ACC MOV A,R4 SWAP A ANL A,#0FH MOV DPTR,#TABLE_SEGMENT MOVC A,@A+DPTR MOV BUF_SEG2,A MOV A,R4 ANL A,#0FH MOV DPTR,#TABLE_SEGMENT MOVC A,@A+DPTR MOV BUF_SEG2,A POP ACC RET DISPLAY:MOV P1,BUF_SEG1 CLR COM1 LCALL DELAY_SEGMENT SETB COM1 MOV P1,BUF_SEG2 CLR COM2 LCALL DELAY_SEGMENT SETB COM2 RET DELAY_SEGENT:MOV DELAY_SEG,#00H DJNZ DELAY_SEG,$ RET WRITE_EEPROM:LCALL I2C_START MOV I2C_DATA,#EEPROM_CODE1 LCALL I2C_WR MOV I2C_DATA,#00H LCALL I2C_WR MOV I2C_DATA,PWM LCALL I2C_WR LCALL I2C_STOP RET READ_EEPROM:LCALL I2C_START MOV I2C_DATA,#EEPROM_CODE1 LCALL I2C_WR MOV I2C_DATA,#00H LCALL I2C_WR LCALL EEPROM_RD1 MOV PWM,I2C_DATA RET I2C_WR:PUSH ACC MOV A,I2C_DATA MOV R5,#08 I2C_WR_1:RLC A MOV SDA,C LCALL I2C_DELAY DJNZ R5,I2C_WR_1 SETB SDA LCALL I2C_DELAY SETB SCL LCALL I2C_DELAY JB SDA,I2C_WR_2 I2C_WR_2:CLR SCL POP ACC RET I2C_RD:PUSH ACC CLR A MOV R5,#08 I2C_RD_1:ACALL I2C_DELAY SETB SCL ACALL I2C_DELAY MOV C,SDA RLC A CLR SCL DJNZ R5,I2C_RD_1 MOV I2C_DATA,A POP ACC RET EEPROM_RD1:LCALL I2C_START MOV I2C_DATA,#EEPROM_CODE1+1 LCALL I2C_WR LCALL I2C_RD LCALL I2C_STOP RET I2C_NACK:SETB SDA LCALL I2C_CLK RET I2C_START:SETB SDA SETB SDA LCALL I2C_DELAY CLR SDA LCALL I2C_DELAY CLR SCL RET I2C_STOP:CLR SDA LCALL I2C_DELAY SETB SCL LCALL I2C_DELAY SETB SDA RET I2C_CLK:LCALL I2C_DELAY SETB SCL LCALL I2C_DELAY CLR SCL RET I2C_DELAY:MOV R6,#03 I2C_DELAY_1:NOP NOP DJNZ R6,I2C_DELAY_1 RET ;********************************************** ; Delay ;********************************************** DELAY_10MS:MOV R7,#10 DELAY_10MS_1:MOB R6,#0E6H DELAY_10MS_2:NOP NOP DJNZ R6,DELAY_10MS_2 DJNZ R7,DELAY_10MS_1 RET DELAY_100MS:MOV R7,#100 DELAY_100MS_1:MOB R6,#0E6H DELAY_100MS_2:NOP NOP DJNZ R6,DELAY_10MS_2 DJNZ R7,DELAY_10MS_1 RET DELAY_1S:MOV R5,#100 DELAY_1S_1:ACALL DELAY_10MS DJNZ R5,DELAY_1S_1 RET PWM_MODE:PUSH ACC PUSH 00H MOV TMOD.#10H MOV TLO,#0B0H MOV TH0,#0B0H SETB LED_PWM MOV SS200US,#00 MOV OUTPUT_PWM,#00 SETB TRO CLR A DELO:CJNE A,PWM,DEL1 CLR LED_PWM DEL1:JNB TCON.0,DEL1 INC SS200US MOV R0,SS200US CJNE R0,#05GMDEL1 MOV SS200US,#00 INC OUTPUT_PWM MOV A,OUTPUT_PWM ADD A,#00 DA A MOV OUTPUT_PWM,A CJNE A,#70HDEL0 CLR TRO POP 00H POP ACC RET END