一、原理图如下,由于LED显示屏上的驱动集成电路使用了74HC245集成电路(前面的例子是使用74HC244),使能端并取消了74LS04,所以驱动电路有所变化,相应的程序也有所改变。原来74LS138使能端经74LS04反相是低电平,现在取消了74LS04就变为高电平了 。
http://s5/mw690/0068KRmqzy6YVkd0oVCe4&690
二、显示效果如下:2个画面交替显示。
http://s13/mw690/0068KRmqzy6YVkkZveQ2c&690
三、STC12C5A60S2单片机简介
STC12C5A60S2是STC生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。
1、增强型8051CPU,单时钟/机器周期,stc12c5a60s2的运行速度比at89s52要快12倍
2、工作电压 5.5-3.5V
3、60K字节ROM,1280字节数据RAM
4、通用I/O口,复位后为:准双向口/弱上拉
可设置成四种模式:准双向口/弱上拉,强推挽/强上拉,仅为输入/高阻,开漏
每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过120mA
5、有1K字节的EEPROM,擦写次数在10万次以上
6、看门狗
7、内部集成MAX810专用复位电路
8、外部掉电检测电路
9、时钟源:外部高精度晶体/时钟,内部R/C振荡器
常温下内部R/C振荡器频率为:5.0V单片机为:11~17MHz,3.3V
单片机为:8~12MHz
10、4个16位定时器,两个与传统8051兼容的定时器/计数器,16位定时器T0和T1
11、3个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟,独立波特率发生器可以在P1.0口输出时钟
12、外部中断I/O口7路,传统的下降沿中断或电平触发中断,并新增支持上升沿中断的PCA模块,Power
Down模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4,T1/P3.5,RxD/P3.0,CCP0/P1.3,CCP0/P1.3
13、2路PWM
14、A/D转换,10位精度ADC,共8路,转换速度可达250K/S
15、通用全双工异步串行口(UART)
16、双串口,RxD2/P1.2,TxD2/P1.3
17、工作范围:-40~85
18、封装:LQFP-48,LQFP-44,PDIP-40,PLCC
四、温度测量原理:采用NTC热敏电阻器与一个固定电阻分压,如下图随着温度的变化,分压值也会变化,用STC12C5A60S2单片机的A/D转换器采集这个分压值,在单片机中设置一个电压与温度的对应表(这个表通过实验获得),根据采集的电压值获取对应的温度值,显示出来并保存在单片机内存中。
http://s7/mw690/0068KRmqzy6YVknPOOWb6&690
五、显示程序
ORG 0000H
AJMP
KS
;显示xx月xx日 室温xx度,11.0592MHZ,STC12C5A60S2单片机 ,带时钟,可交替显示温度。88命令修改时间日期,99命令查询日期时间2016-01-27 通过
ORG
0003H
;XXXXXXXX-X
RETI
ORG 000BH
LJMP CT
RETI
ORG 001BH
RETI
ORG 0023H
AJMP
S
;接收数据转S
A1
EQU
P0.0
;P1.0=A
接2针
B1 EQU
P0.1
;P1.1=B
接4针
C1 EQU
P0.2
;P1.2=C
接6针
D1 EQU
P0.3
;P1.3=D
接8针
G1 EQU
P2.6
;数据输出G1=B4
G2 EQU
P2.7 ;数据输出 G2=B5
STB EQU
P2.5
;595数据锁存脉冲=L
12脚
SCK EQU
P2.4
;595时钟输入=S
11脚
R11 EQU
P2.3 ;改为81,R22改为80,上下显示颠倒
R22 EQU P2.2
EN EQU
P2.1
;138片选,行输出使NENG
ADC_Channel_1_Result EQU 2FH
DBUF EQU 60H
ZS EQU 61H
HM
EQU
1EH
;定时器毫秒存储
WDT_CONTR EQU 0C1H
AUX1
EQU
0A2H
;AUXR1寄存器的ADRJ位是A/D转换结果寄存器(ADC_RES,ADC_RESL)的数据格式调整控制位.
;当ADRJ=0时,..............................................10位A/D转换结果的高8位存放在ADC_RES中,低2位存放在ADC_RESL的低2位中.
;AUR EQU 8EH; Internal/External RAM access 内部/外部RAM存取= 0:
内部扩展的EXT_RAM可以存取.
FLAG_1
EQU
20H.1
;
FLAG_2
EQU
20H.1
;
FLAG_3
EQU
20H.1
;
YEAR
EQU
28H
;年
MONTH
EQU
29H
;月
DAY
EQU
2AH
;日
WEEK
EQU
2BH
;星期
HOUR
EQU
2CH
;小时
MINUTE
EQU
2DH
;分钟
SECOND
EQU
2EH
;秒
FLAG
EQU
27H
;通用标志寄存器
;BIT0=1, ACK ERR
;BIT0=0,ACK OK
;BIT1=1,TEST MODE
;BIT1=0,NORMAL MODE
P1M0 DATA 92H
P1M1 DATA 91H
P0M0 DATA 94H
P0M1 DATA 93H
P2M0 DATA 96H
P2M1 DATA 95H
TIMETEMP
EQU
27H
;时间数据缓存器
TIMETX
EQU
59H
;时间数据发送寄存器
TIMERX
EQU
5AH
;时间数据接收寄存器
SDA
EQU
0b5h
;IIC的SDA口线
15脚
SCL
EQU
0b7h
;IIC的SCL口线
13脚
LED
EQU
0B6H
;声明与IAP/ISP/EEPROM有关的特殊功能寄存器的地址
IAP_DATA
EQU 0C2H
IAP_ADDRH
EQU 0C3H
IAP_ADDRL
EQU 0C4H
IAP_CMD
EQU 0C5H
IAP_TRIG
EQU 0C6H
IAP_CONTR
EQU 0C7H
;定义ISP/IAP命令
ISP_IAP_BYTE_READ
EQU
1H
;字节读
ISP_IAP_BYTE_PROGRAM
EQU 2H ;字节编程,可以将1写成0,要将1变成0,必须执行字节编程
ISP_IAP_SECTOR_ERASE
EQU 3H ;扇区擦除,可以将0擦成1,要将0变成1,必须擦除整个扇区
;定义Flash 操作等待时间及允许IAP/ISP/EEPROM操作的常数
ENABLE_IAP
EQU
84H
;系统工作时钟<6MHz时,对IAP_CONTR寄存器设置此值
;
AD转换设置
ADC_CONTR EQU 0BCH ;ADC control register
; SFR name Address bit B7
B6
B5
B4
B3
B2
B1 B0
;ADC_CONTR BCH name ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2
CHS1 CHS0
ADC_RES EQU 0BDH ;ADC high 8-bit result register
ADC_LOW2 EQU 0BEH ;ADC low 8-bit result register
P1ASF EQU 09DH ;P1 secondary function control register
ADC_FLAG EQU 10H ;ADC complete flag
ADC_Power_On_Speed_Channel_1
EQU 11100000B
;
;B7=power,B6B5=speed,B4=flag,B3=start;B2B1B0=ch0-ch7,001是P1.1作为A/D输入,000是P1.0输入
KS: MOV
SP,#65H
;设堆栈指针
MOV SCon,#50h; 方式1,REN=1.SM0,SM1,SM2,REN,TB8,RB8,TI,RI
MOV TMOD,#21H;波特率发生器T1工作在模式2上
MOV
TH1,#0FDH;预置初值(按照波特率9600BPS预置初值)
11.0592=9600=FD
MOV TL1,#0FDH;
MOV TH0,
#0DCH;88H
;8800=12t,7000=stc1t
MOV TL0, #00H
ORL IE, #92H ;EA=1,ES=1;ET0=1
SETB
PS
;串口中断优先
SETB
TR1
;启动定时器1
SETB EN
MOV
P0M0,#00000000b
; P1M0=0 P1M1=0双向口
P1M0=1 P1M1=0输入口
P1M0=0 P1M1=1推挽输出20ma
MOV P0M1,#00000000b
MOV
P2M0,#00000000b
; P1M0=0 P1M1=0双向口
P1M0=1 P1M1=0输入口
P1M0=0 P1M1=1推挽输出20ma
MOV
P2M1,#00000000b
MOV ADC_CONTR,
#ADC_Power_On_Speed_Channel_1;AD转换设置
;ANL AUX1,#11111011B ;ADRJ =
0
LCALL INIT_ADC
MOV WDT_CONTR ,#27H;;;;;;看门狗设置使能
Q:
MOV A,#0;FFH
MOV
R2,#64D
;清数据区
MOV R0,#20H
QING: MOV
@R0,A
;清数据区
INC R0
DJNZ R2,QING
LCALL
TIMESTATUS_INT12
;24小时制
LCALL READ_TIME ;
MOV WDT_CONTR ,#17H;喂狗CLR EN
SETB
TR0
;启动定时器0
Q1:
SETB G1
SETB
G2
;G1,G2送数显示绿色
SETB
R11
SETB
R22
;R11R22送数显示红色
CLR LED
T1:
MOV
R3,#00H
;行扫描R3控制行数从00000000到00010000,ABCD的变化给138译码0F扫描16行,当10时扫描结束
MOV DPTR ,
#TABSZ
;取数字
MOV R2,#160
CLR
EN
;138片选,行输出使能
MOV A,SECOND;根据秒数据交替显示
ANL A,#0FH
SUBB A,#5
JNC ZJ1
AJMP ZJ2
ZJ1: MOV
A,R2
;取“温“字数据首址+1
ADD A,#96
INC DPH
ACALL YUE
DEC DPH
ACALL
HOU
;取时数据首址 1调显示
MOV
A,R2
;取“温“字数据首址+1
ADD A,#97
INC DPH
ACALL YUE
DEC DPH
MOV
A,HOUR
;取时数据首址低字节
ANL A,#0FH
ACALL
HOU1
;2
调显示
MOV
A,R2
;取"度"字数据首址
ADD A,#128
INC DPH
ACALL YUE
DEC DPH
MOV
A,MINUTE
;取分数据首址
ACALL
HOU2
;3调显示
MOV
A,R2
;取"度"字数据首址+1
ADD A,#129
INC DPH
ACALL YUE
DEC DPH
MOV
A,MINUTE
;取"分"数据首址+1
ANL A,#0FH
ACALL
HOU3
;4调显示
MOV A,ADC_Channel_1_Result
MOV
R5,A
;取A/D结果送R5
LCALL HEX2BCD ;影响单元:R0,R1,R6 ,R1存A/D结果转换成BCD的十位和个位
ACALL MON0
MOV
A,SECOND
;取秒数据首址
ACALL
HOU0
; 5调显示
MOV A,ADC_Channel_1_Result
MOV
R5,A
;取A/D结果送R5
LCALL HEX2BCD ;影响单元:R0,R1,R6 ,R1存A/D结果转换成BCD的十位和个位
ANL A,#0FH
ACALL
MON1
;
MOV
A,SECOND
;取秒数据首址+1
ANL A,#0FH
ACALL
HOU1
;6
调显示
MOV
A,R2
;取"度"字数据首址+1
ADD A,#128
INC DPH
ACALL YUE
DEC DPH
MOV
A,R2
;取"-"字数据首址
ADD A,#64
ACALL
SHI
;7
调显示
MOV
A,R2
;取"度"字数据首址+1
ADD A,#129
INC DPH
ACALL YUE
DEC DPH
MOV
A,WEEK
;取星期数据首址+1
ANL A,#0FH
ACALL
HOU3
;8
调显示
INC R2
INC DPTR
SETB
STB
NOP
CLR
STB
MOV A,R3
;送138地址ABCD
MOV
P0,A
;P2.0-P2.3=ABCD
INC R3
MOV A,R3
XRL
A,#10H
;00-08是前8行,08-10H是后8行;
JNZ
ZJ1
;送前16行
MOV WDT_CONTR ,#17H;喂狗CLR EN
JNB FLAG_1,TZ0
CALL FS1
TZ0:
AJMP T1
ZJ2: ACALL
MON
;取月数据首址
ACALL
HOU
;取时数据首址 调显示
MOV
A,MONTH
;取月数据首址+1,第二位
ANL A,#0FH
ACALL MON1
MOV A,HOUR
;取时数据首址+1
ANL A,#0FH
ACALL
HOU1
;2
调显示
MOV A,R2;#160
ACALL
YUE
;取“月”字数据首址
MOV
A,MINUTE
;取分数据首址
ACALL
HOU2;0
;调显示
MOV
A,R2
;取“月”字数据首址+1
ADD A,#01H
ACALL YUE
MOV
A,MINUTE
;取"分"数据首址+1
ANL A,#0FH
ACALL
HOU3;1
;6
调显示
MOV
A,DAY
;取日数据首址
ACALL
MON0
;5
MOV
A,SECOND
;取秒数据首址
ACALL
HOU0
; 调显示
MOV
A,DAY
;取日数据首址+1
ANL A,#0FH
ACALL MON1
MOV
A,SECOND
;取秒数据首址+1
ANL A,#0FH
ACALL
HOU1
;8
调显示
MOV
A,#32
;取日字的汉字点阵首址
ADD A,R2
ACALL YUE
; MOV
A,WEEK
;取星期数据首址
;ACALL
HOU2;0
; 调显示
MOV
A,R2
;取"-"字数据首址
ADD A,#64
ACALL
SHI
;7
调显示
MOV
A,#33
;取日字的汉字点阵首址+1
ADD A,R2
ACALL YUE
MOV
A,WEEK
;取星期数据首址+1
ANL A,#0FH
ACALL HOU3
;1
;8
调显示
INC R2
;DEC DPH
INC DPTR
SETB
STB
NOP
CLR
STB
MOV
A,R3
;送138地址ABCD
MOV
P0,A
;P2.0-P2.3=ABCD
INC R3
MOV A,R3
XRL
A,#10H
;00-08是前8行,08-10H是后8行;
JNZ
ZJ2
;送前16行
MOV WDT_CONTR ,#17H;喂狗CLR EN
JNB FLAG_1,TZ3
CALL FS1
TZ3:
AJMP T1
MON:
MOV A,MONTH
MON0:
ANL A,#0F0H
SWAP A
MON1:
MOV B,#10H
MUL
AB
;B放结果高8位,A放结果低8位
MOVC A, @A+DPTR ;16*16点阵,每行显示4个汉字,32条水平线,(1个汉字占16条水平线)2行显示8个汉字,所以先取第一行的一个字节,显示半个汉字(牡)
CPL
A
;再跳过8个字节(4个汉字)取第二行1个字节数据(校)
MOV R6,A
RET
HOU:
MOV A,HOUR
HOU0:
ANL A,#0F0H
SWAP A
HOU1:
MOV B,#10H
MUL AB
MOVC A, @A+DPTR ;16*16点阵,每行显示4个汉字,32条水平线,(1个汉字占16条水平线)2行显示8个汉字,所以先取第一行的一个字节,显示半个汉字(牡)
CPL
A
;再跳过8个字节(4个汉字)取第二行1个字节数据(校)
MOV R4,A
ACALL
BIN
;BIN2显示绿色
RET
HOU2:
ANL A,#0F0H
SWAP A
HOU3:
MOV B,#10H
MUL AB
SHI:
MOVC A, @A+DPTR ;16*16点阵,每行显示4个汉字,32条水平线,(1个汉字占16条水平线)2行显示8个汉字,所以先取第一行的一个字节,显示半个汉字(牡)
CPL
A
;再跳过8个字节(4个汉字)取第二行1个字节数据(校)
MOV R4,A
ACALL
BIN2
;BIN2显示绿色
RET
YUE:
;MOV A,R2
MOVC A, @A+DPTR ;
CPL A
MOV R6,A
RET
BIN:
MOV R5, #08H
;往G1G2,或R11R22中写一个字节数据
BIN1:
RLC A
; MOV R11, C
;写上半屏红色
MOV G1,
C
;写上半屏红色
MOV R4,A
MOV A,R6
RLC A
; MOV R22,C
;下半屏红色
MOV R22,
C
;下半屏绿色
MOV R6,A
MOV A,R4
SETB SCK
NOP;CALL SDELAY
NOP
NOP
CLR SCK
DJNZ R5, BIN1
RET
BIN2:
MOV R5, #08H
;往G1G2,或R11R22中写一个字节数据
BIN3:
RLC A
MOV G1,
C
;G1
MOV R4,A
MOV A,R6
RLC A
MOV R22,C
;下半屏红色G1 R22 红色的日
MOV R6,A
MOV A,R4
SETB SCK
NOP
NOP
CLR SCK
DJNZ R5, BIN3
RET