S3F/94C8通用ADC检测电压转换显示例程
S3F/94C8通用ADC检测电压转换显示例程
;--------------------------------------
;程序中所有分号后面的都是注释语句
;#号表示一个常量名字或数据
;-----------------------------------------------------
.include "s3c9454.reg"必须加入寄存器定义文件,这个文件是OPENICE自带的
.include "\myfile\sam\mysam.inc"
;-----------------------------------------------------
;以下为程序运行所用变量定义
00HLED-A位数据定义
01HLED-B位数据定义
02HLED-C位数据定义
03HLED-D位数据定义
04HSEG-A位显示码
05HSEG-B位显示码
06HSEG-C位显示码
07HSEG-D位显示码
08H定时标志寄存器
09H显示循环计数器
0AH0.5S计时器
0BH电压值高位
0CH电压值低位
0DHADC数据高位
0EHADC数据低位
;--------------------------------------------
;位操作定义
P0.0P0.0是164时钟驱动线
P0.1P0.1是164数据驱动线
P0.5P0.5是数码管驱动位线1
P0.4P0.4是数码管驱动位线2
P0.3P0.3是数码管驱动位线3
P0.2P0.2是数码管驱动位线4
P2.6输入电压接在P26
TMRFLAG.00.5S定时标志
BPV ADC转换启动设定值
;--------------------------------------------------------
&&&&&&&&&;9454只有一个中断向量地址,在0000H,这里设置中断服务程序INT_9454
&&&&&&&&ORG
0000HORG表示定义一个绝对的ROM地址,0000H地址
&&&&&&&&.VECTOR $,INT_9454一个向量地址占用2个字节,$表示是在当前地址处定义,也可以采用直接的绝地址定义,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;如:.VECTOR 0000H,INT_9454,两者效果相同
;------------------------------------------------------------
;显示编码予定义
DIGIT_CODE:
表格开始地址是0000H
0FFH全显示
00H不显示(黑屏)
LED_OFF .EQU
;-----------------------------------------------------------
;SMART OPTION
;有关这几个数据设置,请详细参阅9454手册的ADDRESS SPACE部分的SMART OPTION说明
;SMART OPTION定义4个字节数据在003CH--003FH这4个ROM地址
&&&&&&&&ORG
&&&&&&&&DB
&&&&&&&&DB
&&&&&&&&DB
0E7H设置内部LVR使能,用内部复位,LVR电平为2.3V
&&&&&&&&DB
03H ;00H定义外部晶振,03H定义内部OSC
;-----------------------------------------------------------
;-------<>
&&&&&&&&ORG
RESET:-------------------------
&&&&&&&&;follow must set
&&&&&&&&DI
disable interrupt
&&&&&&&&LD
;Watch-dog disable
&&&&&&&&LD
;selet non-divided CPU clock
&&&&&&&&LD
;Stack pointer must be set as 0C0H
&&&&&&&&LD
&&&&&&&&LD
P0CONL,#B设置P00--P05作为输出
&&&&&&&&LD
P2CONH,#B设置P26作为ADC输入
&&&&&&&&LD
T0CON,#BTMR0输入时钟=FXX/8, 开启T0中断
&&&&&&&&LD
T0DATA,#50若OSC=3.2MHZ,则T0每2MS产生一次中断,TIME= (3.2MHZ/256)*50= 4MS
&&&&&&&&LD
LED_LOOP,#00H
&&&&&&&&EI
;----------------------------------------
&&&&&&&&;每0.5S检测一次温度
&&&&&&&&TMBIT
&&&&&&&&JR
&&&&&&&&CLRBIT
&&&&&&&&CALL
GET_PV检测得到输入电压值
&&&&&&&&CALL
DISPLAY_CONVERT转换温度数据到ABCD四位显示数据
&&&&&&&&CALL
DIGIT_CONVERT转换显示数据到显示码
&&&&&&&&JR
;--------------------------------------------------------
;该进程检测ADC端口NTC热敏电阻状态并查表得到温度值
&&&&&&&&LD
R0,#ADC_PV
&&&&&&&&CALL
&&&&&&&&;LD
ADC_H,#00H
&&&&&&&&;LD
ADC_L,#0F0H
&&&&&&&&;转换得到的AD数据在ADC_H:ADC_L中存放
&&&&&&&&;再通过乘法计算得到实际的电压值
&&&&&&&&;ADC分辨率为1023,则每份电压为0.0049V,则设乘数为49
&&&&&&&&LD
&&&&&&&&LD
&&&&&&&&LD
&&&&&&&&CALL
UMUL160816位ADC数据乘以分辨率49
&&&&&&&&;R13:R14:R15是返回的乘积值,由于最大乘积不会超过16位,则只取R14:R15即可
&&&&&&&&;将乘积再除以100,得到3位的电压值
&&&&&&&&LD
&&&&&&&&LD
&&&&&&&&LD
&&&&&&&&CALL
&&&&&&&&;返回的商在R14:R15中存放
&&&&&&&&LD
&&&&&&&&LD
&&&&&&&&RET
;--------------------------------------------------------
;该模块把电压值转换为ABCD四位显示数据
DISPLAY_CONVERT:
&&&&&&&&&&&&&&
&&&&&&&&;得到整数位值(百位)
&&&&&&&&LD
&&&&&&&&LD
&&&&&&&&LD
&&&&&&&&SUB
&&&&&&&&SBC
&&&&&&&&JR
C,CVT_DATA
&&&&&&&&INC
&&&&&&&&JR
&&&&&&&&LD
&&&&&&&&ADD
R1,#100由于前面对R1进行了予减100,则这里必须先行加上100
&&&&&&&&CALL
CONVERT_DATA
&&&&&&&&LD
&&&&&&&&LD
&&&&&&&&LD
DIGIT1,#LED_OFF
&&&&&&&&RET
;--------------------------------------------------------
;该进程把一个两位数据转换为十位和个位数据
;R1--要转换的两位数据,转换后为个位数据
;R0--转换后的十位数据
CONVERT_DATA:
&&&&&&&&CP
&&&&&&&&JR
ULE,CVT_ST
&&&&&&&&LD
R1,#99最大限99
&&&&&&&&LD
&&&&&&&&CP
&&&&&&&&JR
ULT,CVT_BACK
&&&&&&&&SUB
&&&&&&&&INC
&&&&&&&&JR
&&&&&&&&RET
;---------------------------------------------------------
;该进程把要数码管各位要显示的数据转换为显示码
DIGIT_CONVERT:
&&&&&&&&LD
R10,#00H调入显示码定义高位地址
&&&&&&&&LD
R11,#DIGIT_CODE调入显示码定义起始地址
&&&&&&&&;调入A位显示码
&&&&&&&&LD
R11,#DIGIT_CODE调入显示码定义起始地址
&&&&&&&&ADD
R11,DIGIT1LED-A位数据定义
&&&&&&&&LDC
R0,@RR10把RR10寄存器对中的地址所指向的ROM地址字节中的数据调入到R0
&&&&&&&&LD
SEG1,R0把R0寄存器中的地址所指向的ROM地址字节中的数据调入到
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;SEG-A位显示码
&&&&&&&&;调入B位显示码
&&&&&&&&LD
R11,#DIGIT_CODE调入显示码定义起始地址
&&&&&&&&ADD
R11,DIGIT2
&&&&&&&&LDC
&&&&&&&&OR
R0,#80H点亮中间点指示
&&&&&&&&LD
&&&&&&&&;调入C位显示码
&&&&&&&&LD
R11,#DIGIT_CODE调入显示码定义起始地址
&&&&&&&&ADD
R11,DIGIT3
&&&&&&&&LDC
&&&&&&&&LD
&&&&&&&&;调入D位显示码
&&&&&&&&LD
R11,#DIGIT_CODE调入显示码定义起始地址
&&&&&&&&ADD
R11,DIGIT4
&&&&&&&&LDC
&&&&&&&&LD
&&&&&&&&RET
;--------------------------------------------------------
;该进程根据输入的ADC设置数据进行AD检测得到ADH,ADL数据
;连续测64次AD输入求平均值
;R0---输入的ADCON设置数据
;返回:ADC_H:ADC_L是平均值的高位和低位
&&&&&&&&PUSH
R15首先将用到的暂存器入栈
&&&&&&&&PUSH
&&&&&&&&PUSH
&&&&&&&&PUSH
&&&&&&&&PUSH
R11但如果主程序中未用到这些工作寄存器,也可以不用管这些
&&&&&&&&PUSH
&&&&&&&&PUSH
&&&&&&&&LD
R9,#6416次计数
&&&&&&&&CLR
&&&&&&&&CLR
&&&&&&&&CLR
&&&&&&&&;R10:R11:R12是用来存储16次检测值加法和
&&&&&&&&;R13:R14:R15用来暂存ADDATAH:ADDATAL的移位转换
&&&&&&&&LD
&&&&&&&&TM
ADCON,#08HADCON.3是AD转换完成位标志
&&&&&&&&JR
Z,ADC_WAIT
&&&&&&&&;转换完成
&&&&&&&&LD
R15,ADDATAL
&&&&&&&&LD
R14,ADDATAH
&&&&&&&&LD
&&&&&&&&&&&
&&&&&&&&;将AD数据加到加法和
&&&&&&&&RCF
&&&&&&&&RLC
R14通过左移2位方式将ADDATAH的高2位移入到R12
&&&&&&&&RLC
R13并腾出低2位以便加入ADDATAL的低2位
&&&&&&&&RLC
&&&&&&&&RLC
&&&&&&&&AND
R14,#B低2位必须先行清零,以消除C标志移入的影响
&&&&&&&&ADD
R14,R15加上低2位值
&&&&&&&&ADC
&&&&&&&&ADD
&&&&&&&&ADC
&&&&&&&&ADC
&&&&&&&&DEC
&&&&&&&&JR
NZ,ADC_LOOP
&&&&&&&&;64次检测完毕,求平均值
&&&&&&&&;采用简单移位除法,将整个32位加法和右移4位即可得到
&&&&&&&&;除2
&&&&&&&&RRC
&&&&&&&&RRC
&&&&&&&&RRC
&&&&&&&&;除4
&&&&&&&&RRC
&&&&&&&&RRC
&&&&&&&&RRC
&&&&&&&&;除8
&&&&&&&&RRC
&&&&&&&&RRC
&&&&&&&&RRC
&&&&&&&&;除16
&&&&&&&&RRC
&&&&&&&&RRC
&&&&&&&&RRC
&&&&&&&&;除32
&&&&&&&&RRC
&&&&&&&&RRC
&&&&&&&&RRC
&&&&&&&&;除64
&&&&&&&&RRC
&&&&&&&&RRC
&&&&&&&&RRC
&&&&&&&&;低位R11是64次平均值
&&&&&&&&LD
&&&&&&&&LD
&&&&&&&&;如果只处理8位AD数据,则需要忽略低2位,则将数据右移2位即可
&&&&&&&&;RRC
&&&&&&&&;RRC
&&&&&&&&;RRC
&&&&&&&&;RRC
&&&&&&&&;ADTL是实际得到的AD测试平均值数据
&&&&&&&&POP
&&&&&&&&POP
R10将暂存器出栈,注意先进先出原则
&&&&&&&&POP
&&&&&&&&POP
&&&&&&&&POP
&&&&&&&&POP
&&&&&&&&POP
&&&&&&&&RET
&&&&&&&&RET
;---------------------------------------------------------
;R0---要发送到164输出的数据
SENDTO164:
&&&&&&&&PUSH
&&&&&&&&CLRBIT
&&&&&&&&CLRBIT
&&&&&&&&LD
;----------
&&&&&&&&;必须先根据数据状态予置好DATA线状态
&&&&&&&&CLRBIT
&&&&&&&&RRC
&&&&&&&&JR
&&&&&&&&CLRBIT
&&&&&&&&JR
&&&&&&&&SETBIT
;---------
;发送一个时钟信号
&&&&&&&&SETBIT
&&&&&&&&NOP
&&&&&&&&NOP
&&&&&&&&NOP
&&&&&&&&CLRBIT
&&&&&&&&DEC
&&&&&&&&JR
NZ,LOOP_164
;---------
SEND_BACK:
&&&&&&&&POP
&&&&&&&&RET
;---------------------------------------------------------
;该进程通过轮询方式来分时扫描数码管的A,B,C,D各位显示
&&&&&&&&INC
&&&&&&&&;注意在每次送数据到LED显示前,必须先关闭全部位线
&&&&&&&&CLRBIT
&&&&&&&&CLRBIT
&&&&&&&&CLRBIT
&&&&&&&&CLRBIT
&&&&&&&&CP
LED_LOOP,#01H
&&&&&&&&JR
&&&&&&&&CP
LED_LOOP,#02H
&&&&&&&&JR
&&&&&&&&CP
LED_LOOP,#03H
&&&&&&&&JR
&&&&&&&&CP
LED_LOOP,#04H
&&&&&&&&JR
&&&&&&&&LD
LED_LOOP,#00H
&&&&&&&&LD
R0,SEG1调入A位显示码
&&&&&&&&CALL
&&&&&&&&SETBIT
SMG_D1打开1位线显示
&&&&&&&&JR
&&&&&&&&LD
R0,SEG2调入B位显示码
&&&&&&&&CALL
&&&&&&&&SETBIT
SMG_D2打开2位线显示
&&&&&&&&JR
&&&&&&&&LD
R0,SEG3调入C位显示码
&&&&&&&&CALL
&&&&&&&&SETBIT
SMG_D3打开3位线显示
&&&&&&&&JR
&&&&&&&&LD
R0,SEG4调入D位显示码
&&&&&&&&CALL
&&&&&&&&SETBIT
SMG_D4打开4位线显示
SCAN_BACK:
&&&&&&&&RET
;---------------------------------------------------------
;TMR0-2MS中断一次
&&&&&&&&AND
T0CON,#0FEH清T0中断标志位
&&&&&&&&OR
T0CON,#08H清T0CNT,这个是芯片手册规定的
&&&&&&&&CALL
LED_SCAN扫描LED显示
&&&&&&&&INC
&&&&&&&&CP
TMR_05S,#50
&&&&&&&&JR
ULT,INT_BACK
&&&&&&&&;定时1S时间到
&&&&&&&&SETBIT
&&&&&&&&CLR
&&&&&&&&IRET
;---------------------------------------------------------------
&&&&&&&&UMUL1608_MACRO
&&&&&&&&RET
&&&&&&&&UDIV1608_MACRO
&&&&&&&&RET
;---------------------------------------------------
;Programer is end共找到 23 个相关产品
报价:2./PCS
报价:4.00元
报价:2.10元
报价:2.20元
报价:0.10元
报价:4.00元
累计询盘:1次
报价:3.00元
报价:3.00元
报价:3.00元
报价:2.20元
报价:4.00元
报价:4.00元
报价:3.00元
报价:3.00元
报价:3.00元
报价:4.00元
报价:4.00元
报价:0.10元
本页是马可波罗为您提供的s3f94c8最新产品供应商、制造商,囊括了s3f94c8产品的参数、型号、图片、价格等信息,是s3f94c8产品的权威数据库。我们会尽全力为您提供准确、全面的信息!
查询利率,并免费获取专业咨询
年&&&&&&&限:
请确认信息无误!
最低月利率:1.10%(实际以审
您还可以找
按排行字母分类: