📄 adtra.txt
字号:
$INCLUDE (C8051F020.inc)
SYSCLK EQU 11059 ; 系统时钟频率
TC_10ms EQU (SYSCLK / 12) * 10;
ROOMCODE EQU 0xb930 ; ADC值左对齐
; ADC 数据变量
TEMPCODE: DS 2 ;
CSEG AT 0
ljmp Main
org 7bh
ljmp ADC0_ISR ; ADC0 转换结束中断
Temp_2 SEGMENT CODE ; declare CODE segment
RSEG Temp_2 ; select CODE segment
USING 0 ; using register bank 0
Main:
mov WDTCN, #0deh ; 关闭看门狗
mov WDTCN, #0adh
mov SP, #STACK-1 ; 初始化堆栈指针
acall SYSCLK_Init ; 系统时钟源初始化
mov XBR2, #40h ; 使能交叉开关,弱上拉
orl P1MDOUT, #40h ; enable P1.6 (LED on target board)
acall ADC0_Init ; 初始化ADC0和温度传感器
acall Timer3_Init ; 初始化 Timer3
acall Timer3_Start ;使能 Timer3
acall ADC0_Enable ; 使能 ADC0
setb EA ; 开中断
sjmp $ ; 等待
ADC0_ISR:
push PSW ; 保护现场
push acc
clr AD0INT ; 清ADC0中断标志
mov TEMPCODE, ADC0H ;转换结果高位
mov TEMPCODE+1, ADC0L ;转换结果低位
clr C
mov a, TEMPCODE+1 ; subtract LSBs
subb a, #LOW(ROOMCODE)
mov TEMPCODE+1, a ; store new LSB
mov a, TEMPCODE ; subtract MSBs (and carry)
subb a, #HIGH(ROOMCODE)
mov TEMPCODE,a ; store new MSB
setb LED ; turn LED on.
jnc ADC0_ISR_END ;
ADC0_ISR_END:
pop acc
pop PSW
reti
SYSCLK_Init:
mov OSCXCN, #67h ; 使能外部振荡器
clr A ; 等待至少1毫秒
djnz acc, $ ;
djnz acc, $ ;
osc_wait: ; poll for XTLVLD-->1
mov a, OSCXCN
jnb acc.7, osc_wait
orl OSCICN, #08h ; 选择外部振荡器作为系统时钟源
orl OSCXCN, #80h ; 打开丢失时钟监测器
ret
Timer3_Init:
mov TMR3CN, #00h ;停止Timer3,清T3溢出标志TF3,
mov TMR3RLH, #HIGH(-TC_10ms);重装载初值
mov TMR3RLL, #LOW(-TC_10ms)
mov TMR3H, #0ffh ;设置为自动重装载
mov TMR3L, #0ffh
anl EIE2, #NOT(01h) ;关闭T3中断
ret
Timer3_Start:
orl TMR3CN, #04h ; set TR3
ret
ADC0_Init:
clr AD0EN ; 关闭ADC0
mov REF0CN, #07h ;
mov AMX0SL, #0fh ;选择温度作为ADC的输入
mov ADC0CF, #((SYSCLK/2500) SHL 3) ;设置SAR时钟为 2.5MHz
orl ADC0CF, #01h ; PGA Gain = 2
mov ADC0CN, #45h ;
ret
ADC0_Enable:
setb AD0EN ;使能ADC0
orl EIE2, #02h ;ADC转换结束中断
ret
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -