LED_BIT_1 EQU 30H ; 存放8位数码管的段码
LED_BIT_2 EQU 31H
LED_BIT_3 EQU 32H
LED_BIT_4 EQU 33H
LED_BIT_5 EQU 34H
LED_BIT_6 EQU 35H
LED_BIT_7 EQU 36H
LED_BIT_8 EQU 37H ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AD_CS EQU P3.6 ;;端口设置
AD_RD EQU P3.7
AD_INPUT_PORT EQU P1
SDA EQU P2.6
SCL EQU P2.7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SHEZHI EQU 61H ;;存储区设置
CL EQU 62H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 00H ;初始化程序 ,
SJMP START
START: MOV P3,00h
MOV DPTR,#TABLE
MOV P3,#0FFH
MOV P1,#0FFH
MOV LED_BIT_1,#00H ;段码存储区清0
MOV LED_BIT_2,#00H
MOV LED_BIT_3,#00H
MOV LED_BIT_4,#00H
MOV LED_BIT_5,#00H
MOV LED_BIT_6,#00H
MOV LED_BIT_7,#00H
MOV LED_BIT_8,#00H
MOV P1,#00H ;;端口赋值
A1: ;;主程序
A01: LCALL DISPLAY ;;调用显示
JNB P2.3,S1 ;;判断是否按键按下,调用设置增加
;; jnb p3.0 , s2
mov p3,#00h
CALL ADC_DEmO ;;调用ADC子函数
LCALL DISPLAY
CALL DAC ;;调用数模转换子函数
LJMP A01 ;;循环
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置设定温度;;;;;;;;;;;
S1: LCALL DLY_S ;;设置子程序
LCALL DS2 ;;调用设置显示子函数
;;LCALL DLY_L ;;长延时
JNB P2.3,A1 ;;判断返回
JnB P2.4,S10 ;;判断增加
jnb p3.0 , s11
ljmp s1
s10: INC SHEZHI ;; 加一
ljmp s1
s11: dec shezhi
ljmp s1 ;;循环
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
S2: LCALL DLY_S ;;设置子程序
LCALL DS2 ;;调用设置显示子函数
LCALL DLY_L ;;长延时
JNB P2.3,A1 ;;判断返回
JB P2.4,S1
jb p3.0 , s2
dec SHEZHI ;; 加一
LCALL DLY_L ;;长延时
;;循环
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;测试温度显示
DISPLAY : ;
MOV A,CL ;;送测量值
MOV B,#100
DIV AB ;;取百位
SETB p3.5 ;;送显示地址
CLR p3.4
SETB p3.3
MOVC A,@A+DPTR ;;查表
MOV P0,A ;;送显示数据
LCALL DLY_S
MOV A,B ;;取十位
MOV B,#10
DIV AB
SETB p3.5 ;;送显示地址
SETB p3.4
CLR p3.3
MOVC A,@A+DPTR ;;显示十位
MOV P0,A
LCALL DLY_S
MOV A,B
SETB p3.5
SETB p3.4
SETB p3.3
MOVC A,@A+DPTR
MOV P0,A ;;显示个位
LCALL DLY_S
CLR p3.5
SETB p3.4
SETB p3.3
MOV P0,#0bfH ;;显示间隔符号
LCALL DLY_S
SETB p3.5
CLR p3.4
CLR p3.3
MOV P0,#0bfH ;;显示间隔符号
LCALL DLY_S
CLR p3.5
SETB p3.4
CLR p3.3
MOV P0,#0c6H ;;显示字符C
LCALL DLY_S
CLR p3.5
CLR p3.4
CLR p3.3
MOV P0,#0ceH ;;显示字符I
LCALL DLY_S
CLR p3.5
CLR p3.4
SETB p3.3
MOV P0,#0f9H ;;显示字符F
LCALL DLY_S
RET
TABLE: DB 0C0H, 0F9H, 0A4H ,0B0H ,99H, 92H ,82H, 0F8H, 80H, 90H ;;表格
;;;;************************************** HELP设置显示**********
DS2:
MOV A,SHEZHI ;;送设置值
MOV B,#100 ;;取百位
DIV AB
SETB p3.5
CLR p3.4
SETB p3.3
MOVC A,@A+DPTR
MOV P0,A
LCALL DLY_S
MOV A,B
MOV B,#10
DIV AB
SETB p3.5
SETB p3.4
CLR p3.3
MOVC A,@A+DPTR ;;显示十位
MOV P0,A
LCALL DLY_S
MOV A,B
SETB p3.5
SETB p3.4
SETB p3.3
MOVC A,@A+DPTR ;;显示个位
MOV P0,A
LCALL DLY_S
; SETB p3.5
; CLR p3.4
; SETB p3.3
; MOV P0,#00H
; LCALL DLY_S
SETB p3.5
CLR p3.4
CLR p3.3
MOV P0,#0bfH ;;显示间隔符
LCALL DLY_S
CLR p3.5
SETB p3.4
SETB p3.3
MOV P0,#08cH ;;显示字符P
LCALL DLY_S
CLR p3.5
SETB p3.4
CLR p3.3
MOV P0,#0c7H ;显示字符L
LCALL DLY_S
CLR p3.5
CLR p3.4
CLR p3.3
MOV P0,#89H ;;显示字符H
LCALL DLY_S
CLR p3.5
CLR p3.4
SETB p3.3
MOV P0,#86H ;; 显示字符 E
LCALL DLY_S
RET
;;;;;;;;;;;;;;;;;;;;;;;;AD转换;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADC_START: ClR AD_CS ;;AD开始
NOP
nop ;;延时一个机器周期
SETB AD_CS ;;片选
NOP
nop
RET
ADC_READ: ;;读AD 转换
MOV AD_INPUT_PORT,#0ffh ;;端口地址
ClR AD_CS
NOP
nop
ClR AD_RD
NOP
NOP
MOV A, p1 ;;AD_INPUT_PORT
MOV CL,A ;;把读到的值送CL
NOP
SETB AD_RD
NOP
SETB AD_CS
RET
ADC_DEmO: ;;AD 转换主程序
lCAll ADC_START ;;AD 转换开始
;; LCALL DLY_L ;;延时等待转换
lCAll ADC_READ
LCALL DISPLAY
lCAll ADC_READ
LCALL DISPLAY
LCALL DISPLAY
lCAll ADC_READ
LCALL DISPLAY
LCALL DISPLAY
lCAll ADC_READ
LCALL DISPLAY
LCALL DISPLAY ;;显示
;;LJMP A01 ;;回主函数
RET
;;;;;;;;;;;;;;;;;;;;;;;DAC转换子程序判断;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DAC:
MOV A,SHEZHI
clr c ;;计算设置值测量值的差
SUBB A,CL
MOV P3,A ;;将值送DA
CLR P2.5
jnc dac0
;; CJNE A,#00H,DAC0 ;;相等送报警信号
SETB P2.5
DAC0: ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延时
DLY_S: MOV R6,#5 ;短延时程序
D1: MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
RET
DLY_L: MOV R5,#25 ;长延时程序
D2: MOV R6,#25
D3: MOV R7,#50
DJNZ R7,$
DJNZ R6,D3
DJNZ R5,D2
RET
;;;;;;;;;;;;;;;;;;;;;24064;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
YA24C: MOV A,#0A0H ;写操作命令
LCALL START_SIGNAL
LCALL I2C_WRITE
JB F0,YA24C ;F0中存为应答位状态
; MOV A,C24ADDR ;24C的地址
;; LCALL I2C_WRITE
JB F0,YA24C
MOV A,22h ;24C的值
;;LCALL I2C_WRITE
JB F0,YA24C
LCALL STOP_SIGNAL
DU24C: MOV A,#0A0H
LCALL START_SIGNAL
LCALL I2C_WRITE
JB F0,DU24C ;写操作指令,
;MOV A,C24ADDR ;欲读取地址42h(读之前必须先写,给予其指令及地址)
LCALL I2C_WRITE
JB F0,DU24C
LCALL START_SIGNAL ;重新调用开始
MOV A,#0A1H ;写入读操作命令
LCALL I2C_WRITE
JB F0,DU24C
LCALL I2C_RECEIVE
LCALL STOP_SIGNAL
;; MOV P1,I2C_R_VALE 1口显示
START_SIGNAL: SETB SDA
SETB SDA
SETB SDA
SETB SCL
SETB SCL
SETB SCL
CLR SDA
CLR SDA
CLR SDA
CLR SCL
CLR SCL
CLR SCL
RET
STOP_SIGNAL: CLR SCL
CLR SCL
CLR SCL
CLR SDA
CLR SDA
CLR SDA
SETB SCL
SETB SCL
SETB SCL
SETB SDA
SETB SDA
SETB SDA
RET
I2C_WRITE: CLR C
MOV R6,#08H
I2C_RWRITE: RLC A ;时钟高电平大于4.0US期间
MOV SDA,C ;SDA保持为高电平则表示发
SETB SCL ;0,SDA保持低电平则表示发
NOP ;1
NOP
NOP ;
CLR SCL ;
NOP ;
NOP
DJNZ R6,I2C_RWRITE
SETB SDA ;只要满足在时钟高电平大于
NOP ;4US期间,SDA线上有确定的
NOP ;电平状态即可
;NOP ;
SETB SCL ;
;NOP ;
NOP ;
NOP ;
MOV C,SDA ;
MOV F0,C
CLR SCL ;
NOP ;
NOP
JNC I2C_RET
NOP
NOP
I2C_RET: RET
I2C_RECEIVE: CLR C
MOV R6,#08H
MOV A,#00H
I2C_RRECEIVE: SETB SCL
MOV C,SDA ;
RLC A ;
NOP ;
NOP ;
NOP ;
NOP
CLR SCL ;
NOP ;
NOP
DJNZ R6,I2C_RRECEIVE
;MOV I2C_R_VALE,A
NOP
NOP
NOP
NOP
I2C_RRET: RET
END
;;;;;;;;;;;;;24064;;;;;;;;;;;;;;;;;;;;;;;
|