NAME HW1 PROG SEGMENT CODE STACK SEGMENT IDATA TIMER0 SEGMENT CODE VAR SEGMENT DATA BITVAR SEGMENT BIT SETPOINT EQU 80h ; ; RELOAD VALUE FOR TIMER-0 IS (FF - (1/512 * (OSC/12))) == 05Dh R0H EQU 05DH ; TIMER 0 RELOAD LOW BYTE (1/512 OF A SEC) = ~2MS ; note that this is only 166 machine cycles. Neet to make sure ; that our interrupt routine is less than this! RSEG BITVAR SECTIC: DBIT 1 ; bit flags to keep track of half second HAFSEC: DBIT 1 ; and one second ticks RSEG VAR CNT: DS 1 ; 256 interrupts/second THI: DS 1 ; duty cycle is THI/255 RSEG STACK ; stack, only used for interrupt routine DS 10H CSEG AT 0 ; reset vector LJMP START CSEG AT 0BH ; timer-0 interrupt vector LJMP TIMER0 RETI RSEG PROG ; main program ; INITIALIZATION START: MOV SP, #STACK-1 ; INITIALIZE STACK POINTER MOV TMOD,#02H ; SET TIMER MODE TO 2 (8 bit auto-reload) MOV TH0, #R0H ; set auto-reload value to 93 (255- SETB TR0 ; ENABLE T0 SETB ET0 ; ENABLE T0 INTERRUPT CLR TF0 ; CLEAR T0 INTERRUPT FLAG SETB EA ; ENABLE GLOBAL INTERRUPTS ; CHECK TEMP AGAINST SETPOINT EVERY SECOND LOOP: JNB SECTIC,LOOP ; WAIT UNTIL 1 SECOND PASSES BEFORE CHECKING AGAIN CLR SECTIC ; CLEAR SECOND TIC FLAG ; Check temperture to see if duty cycle adjustment is necessary CLR C MOV A,#SETPOINT ; COMPARE CURRENT TEMPERATURE TO SETPOINT SUBB A,P2 ; COMPARE TO TEMPERATURE JZ LOOP ; COPASETIC! JC TOCOLD ; TOHOT: MOV A,THI ; LOAD CURRENT DUTY CYCLE JZ LOOP ; IF ALREADY ZERO, THEN DO NOTHING DEC THI ; REDUCE DUTY CYCLE JMP LOOP ; DONE TOCOLD: MOV A,THI ; LOAD THI INC A ; JZ LOOP ; ALREADY AT 255 SO DO NOTHING MOV THI,A ; STORE NEW DUTY CYCLE JMP LOOP ; ; Interrupt Service Routine: RSEG TIMER0 ; SET FOR 2MS TIME BASE ; FIRST INCREMENT TIME OF DAY COUNTER PUSH PSW ; push status PUSH ACC ; push accumulator MOV A,CNT ; INCREMENT THE COUNT INC A MOV CNT,A ; STORE THE COUNT JNZ DOPWM CPL HAFSEC ; INVERT HALF SECOND TICKER JB HAFSEC,DOPWM ; SETB SECTIC ; IF OVERFLOW, SET SEC TIC TO TRUE (SEND MESSAGE) ; NOW DO PWM (~4MS RESOLUTION AT 1HZ) DOPWM: MOV A,CNT ; GET LOW BYTE OF TIME CLR C ; CLEAR CARRY BEFORE SUBB SUBB A,THI ; IF THI IS GREATER THAN COUNT JC HI CLR P1.1 ; SET OUTPUT JMP DONE HI: SETB P1.1 ; OTHERWISE CLEAR IT DONE: POP ACC POP PSW RETI END