?? temp_2.asm
字號:
;-----------------------------------------------------------------------------
; Temp_2.ASM
;-----------------------------------------------------------------------------
; Copyright 2001, Copyright (C) 2004 Silicon Laboratories, Inc.
;
; FILE: Temp_2.ASM
; DEVICE: C8051F30x
; ASSEMBLER: Keil A51
; AUTH: BW
; DATE: 11 DEC 01
;
; This program provides an example of how to configure the on-chip
; temperature sensor with the ADC.
;
; The calibrated on-chip 24.5MHz internal oscillator is used as the system
; clock source.
;
; The ADC is configured for left-justified mode, GAIN = 2, using Timer2
; overflows as the start-of-conversion source. Timer2 is configured in
; auto-reload mode to overflow every 10ms. The ADC conversion complete
; interrupt handler reads the ADC value and compares it with the expected
; value for room temperature (about 25 degrees C), stored in ROOMCODE.
; If the measured temperature is below this value, the LED is turned off.
; If the measured value is above ROOMCODE, the LED is turned on.
;
; The LED switch point can be easily modified by changing the value of
; ROOMCODE.
;
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
; EQUATES
;-----------------------------------------------------------------------------
$INCLUDE (C8051F300.inc)
LED EQU P0.2 ; LED on target board ('1' is LED
; ON)
SYSCLK EQU 24500 ; SYSCLK frequency in kHz
TC_10ms EQU (SYSCLK / 12) * 10 ; number of timer counts in 10ms
ROOMCODE EQU 0x95 ; ADC value for 25 degrees C.
;-----------------------------------------------------------------------------
; VARIABLES
;-----------------------------------------------------------------------------
;-------------------
; STACK
STACK SEGMENT IDATA ; declare STACK segment
RSEG STACK
DS 80h ; reserve 128 bytes for stack
;-----------------------------------------------------------------------------
; MACRO DEFINITIONS
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
; RESET AND INTERRUPT VECTOR TABLE
;-----------------------------------------------------------------------------
CSEG AT 0
ljmp Main
org 43h
ljmp ADC0_ISR ; ADC0 end of conversion interrupt
;-----------------------------------------------------------------------------
; MAIN PROGRAM CODE
;-----------------------------------------------------------------------------
Temp_2 SEGMENT CODE ; declare CODE segment
RSEG Temp_2 ; select CODE segment
USING 0 ; using register bank 0
Main:
; Disable the WDT.
anl PCA0MD, #NOT(040h) ; clear Watchdog Enable bit
mov SP, #STACK-1 ; init stack pointer
acall SYSCLK_Init ; initialize system clock source
acall PORT_Init ; initialize crossbar and GPIO
acall ADC0_Init ; initialize ADC0 and temp sensor
acall Timer2_Init ; initialize Timer2
setb TR2 ; START Timer2
setb AD0EN ; enable ADC
setb EA ; enable global interrupts
sjmp $ ; spin forever
;-----------------------------------------------------------------------------
; INTERRUPT VECTORS
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
; ADC0_ISR
;
; This ISR is activated on the completion of an ADC sample. When this event
; occurs, the ADC value is copied to the holding variable TEMPCODE, and is
; compared with the code for 25 degrees C. If the temperature is above
; 25 degrees C, the LED is turned on. If the temperature is below 25 degrees
; C, the LED is turned off.
;
ADC0_ISR:
push PSW ; preserve registers
push acc
clr AD0INT ; clear ADC0 interrupt flag
clr C
mov a, ADC0 ; read ADC value
subb a, #ROOMCODE ; subtract room constant
; compare TEMPCODE with value expected for 25 degrees C
; if (TEMPCODE - ROOMDEG) < 0, then turn LED off, otherwise,
; turn it on.
setb LED ; turn LED on.
jnc ADC0_ISR_END ; exit if subtract result was
; positive,
clr LED ; otherwise, turn LED off then exit
ADC0_ISR_END:
pop acc
pop PSW
reti
;-----------------------------------------------------------------------------
; SUBROUTINES
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
; SYSCLK_Init
;-----------------------------------------------------------------------------
; This routine initializes the system time base by selecting the internal
; 24.5MHz oscillator as the system clock source. Also enables the missing
; clock detector.
;
SYSCLK_Init:
mov OSCICN, #07h ; select internal oscillator at
; 24.5MHz as the system clock
; source
mov RSTSRC, #04h ; enable missing clock detector
ret
;-----------------------------------------------------------------------------
; PORT_Init
;-----------------------------------------------------------------------------
; This routine initializes the crossbar and GPIO pins.
;
PORT_Init:
orl XBR0, #04h ; skip LED pin in crossbar
; assignments
mov XBR2, #40h ; Enable crossbar and weak pull-ups
orl P0MDOUT, #04h ; enable P0.2 (LED on target board)
; as push-pull
orl P0MDIN, #04h ; enable P0.2 (LED) as digital
; input
ret
;-----------------------------------------------------------------------------
; Timer2_Init
;-----------------------------------------------------------------------------
; This routine initializes Timer2 in 16-bit auto-reload mode to overflow
; at 100Hz using SYSCLK/12 as its time base. Exits with Timer2
; stopped and Timer2 interrupts disabled.
;
Timer2_Init:
mov TMR2CN, #00h ; STOP Timer2, clear TF2H and TF2L;
; disable low-byte interrupt;
; disable split mode; select
; internal prescaler as timebase
anl CKCON, #NOT(060h) ; Timer2 uses SYSCLK/12
mov TMR2RLH, #HIGH(-TC_10ms); init reload values
mov TMR2RLL, #LOW(-TC_10ms)
mov TMR2H, #0ffh ; set to auto-reload immediately
mov TMR2L, #0ffh
clr ET2 ; disable Timer2 interrupts
ret
;-----------------------------------------------------------------------------
; ADC0_Init
;-----------------------------------------------------------------------------
; This routine initializes ADC0 for monitoring the on-chip temp sensor at a
; gain of '2'. Enables the End of Converstion interrupt. Leaves ADC in
; disabled state.
;
ADC0_Init:
mov ADC0CN, #02h ; ADC0 disabled, normal
; track mode, ADC0 conversions
; initiated by overflow of
; Timer2
mov AMX0SL, #0f8h ; select temp sensor as ADC0 input
; ADC conversion clock <= 7.5 MHz
mov ADC0CF, #((SYSCLK / 7500) SHL 3)
orl ADC0CF, #02h ; PGA gain = 2
mov REF0CN, #0eh ; enable temp sensor; VREF = VDD;
; bias generator is on
orl EIE1, #04h ; enable ADC0 End of Conversion
; Interrupt
ret
;-----------------------------------------------------------------------------
; End of file.
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -