单片机课程设计(模版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
成都理工大学工程
技术学院
单片机课程设计报告
数字温度计设计
指导教师:
学生:
学号:
2013年12月25 日
摘要
在这个信息化高速发展的时代,单片机作为一种最经典的微控制器,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,作为自动化专业的学生,我们学习了单片机,就应该把它熟练应用到生活之中来。
本文将介绍一种基于单片机控制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。
本文设计的数字温度计具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。
关键词:单片机,数字控制,数码管显示,温度计,DS18B20,AT89S52。
目录
1概述 (4)
1.1设计目的 (4)
1.2设计原理 (4)
1.3设计难点 (4)
2 系统总体方案及硬件设计 (4)
2.1数字温度计设计方案论证 (5)
2.2.1 主控制器 (5)
2.4 系统整体硬件电路设计 (7)
3系统软件设计 (8)
3.1初始化程序 (8)
3.2读出温度子程序 (9)
3.3读、写时序子程序 (10)
3.4 温度处理子程序 (11)
3.5 显示程序 (12)
4 Proteus软件仿真 (113)
5硬件实物 (13)
6课程设计体会 (14)
附录1: (14)
1概述
1.1设计目的随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,可广泛用于食品库、冷库、粮库、温室大棚等需要控制温度的地方。
目前,该产品已在温控系统中得到广泛的应用。
1.2设计原理本系统是一个基于单片机AT89S52的数字温度计的设计,用来测量环境温度,测量范围为-50℃—110℃度。
整个设计系统分为4部分:单片机控制、温度传感器、数码显示以及键盘控制电路。
整个设计是以AT89S52为核心,通过数字温度传感器DS18B20来实现环境温度的采集和A/D转换,同时因其输出为数字形式,且为串行输出,这就方便了单片机进行数据处理,但同时也对编程提出了更高的要求。
单片机把采集到的温度进行相应的转换后,使之能够方便地在数码管上输出。
LED采用三位一体共阳的数码管。
1.3设计难点此设计的重点在于编程,程序要实现温度的采集、转换、显示和上下限温度报警,其外围电路所用器件较少,相对简单,实现容易。
2 系统总体方案及硬件设计
2.1数字温度计设计方案论证
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D 转换电路,感温电路比较麻烦。
进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
2.2总体设计框图
温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89S52,温度传感器采用DS18B20,用4位共阴LED数码管以串口传送数据实现温度显示。
图1 总体设计框图
2.2.1 主控制器
单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,适合便携手持式产品的设计使用。
AT89S52单片机芯片具有以下特性:
1)指令集合芯片引脚与Intel公司的8052兼容;
2)4KB片内在系统可编程FLASH程序存储器;
3)时钟频率为0~33MHZ;
4)128字节片内随机读写存储器(RAM);
5)6个中断源,2级优先级;
6)2个16位定时/记数器;
7)全双工串行通信接口;
8)监视定时器;
9)两个数据指针;
2.2.2 显示电路
2.2.3温度传感器
DS18B20温度传感器是美国DALLAS半导体公司推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。
DS18B20的性能特点如下:
1.全数字温度转换及输出。
2.先进的单总线数据通信。
3.最高12为\位分辨率,精度可达±0.5摄氏度。
4.12位分辨率时的最大工作周期为750毫秒。
5.可选择寄生工作方式。
6.检测温度范围为+55℃~+125℃(-67℉~+257℉)。
7.内置EEPROM,限温报警功能。
8.64位光刻ROM,内置产品序列号,方便多机链接。
9.多样封装形式,便于不同硬件系统。
2.3 DS18B20温度传感器与单片机的接口电路
2.4 系统整体硬件电路设计
2.4.1 主板电路
系统整体硬件电路包括,传感器数据采集电路,温度显示电路,上下限报警调整电路,单片机主板电路等,单片机主板电路如图5 所示:
图5 单片机主板电路
2.4.2 显示电路
图6 温度显示电路
3 系统软件设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
3.1初始化程序
图7 初始化程序流程图
3.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的2字节,读出温度的低八位和高八位,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图8示
延时
调用时序初始化
判断F0=1
EA=1
调用读写指令读温度
图8 读温度程序流程图
3.3读、写时序子程序
读写的程序是本次设计中的重点和难点,通过我们对其时序的分析,从而写出高效的程序。
写1,0时序
读0,1时序
图9 写时序子程序流程图 图10 读时序子程序流程图
3.4 温度处理子程序
计算温度子程序将RAM 中读取值进行BCD 码的转换运算,并进行温度值正负的判定,其程序流程图如图11所示
所写位送到总线 延时15-60us 判断总线=0
写入位=0 第二次写
写入位=1
将总线拉低
延时1.7us
将总线拉高 开始读位
延时60-120us
释放总线
图11 温度处理程序流程图
3.5 显示程序
此函数实现的对数码管显示的处理,其亮点在于可以直接对数码管进行操作,其本身是个两变量函数,第一个变量是要开通的位选,第二个变量是要显示的数据,这样我们可以直接方便而又简单直观的对数码管进行操作。
程序流程图如图12。
4 Proteus软件仿真
5 硬件实物
6 课程设计体会
这次课程设计虽然只有短短的两周时间,但我受益匪浅。
刚开始时觉得自己
的课题无处入手,但通过老师的讲解和查询资料,开始有了自己的思路,整理出了总体方案,然后设计出硬件原理图,源程序等。
在这次设计中困难最大的就是调试,收获最多的也是调试,因为调试的时候你必须对程序相当的熟悉,对每一条指令相当了解,并且硬件的连接也要清晰的印在脑海里,只有这样你才能让软件和硬件结合在一起,实现预期功能。
在编程结束时需要编写END指令,这也
是初学者编程时经常忘记的。
总之,在课程设计中遇到了不少的困难,在老师的细心讲解和辅导下,最终完成了本次设计。
在此,由衷感谢老师的指导和帮助。
参考文献
[1]DS18b20数据手册。
[2] 求是科技编著8051系列单片机C程序设计完全手册北京: 人民邮电出版社, 2006
[3]余发山,王福忠.单片机原理及应用技术.徐州:中国矿业大学出版社,200
附录1:
DQ BIT P3.7 ; 定义p3.7为ds18b20的地址总线
swpH equ 0d2H ; 定义swph=0d2h
swpL equ 0ffH ; 定义swpL=0ffh 初始化
WDLSB DATA 30H ; 定义wdlsb=30h
WDMSB DA TA 31H ; 定义wdmsb=31h
;*************************************************************** ORG 0000H ;主程序入口地址
LJMP MAIN ;跳转到main
ORG 000BH ;timer0的入口地址
LJMP TMR0 ; 跳到Timer0
;********************************************************
; Timer0 Interrupt Service Routine
TMR0: MOV TH0,#swpH ;轮流送温度值的高低两位到数码管高位MOV TL0,#swpL ;温度值的低位
JB 21H,DSL
JB 22H,DSL1
; JB 23H,DSL2
MOV P0,43H
ORL P0,#01000000B ; 十位位选为1
SETB P2.0;小数点不亮
SJMP EXIT
DSL:
MOV P0,42H
ORL P0,#00100000B ; 个位位选
CPL P2.0 ;个位后面小数位亮
SJMP EXIT1
DSL1:
MOV P0,41H
ORL P0,#00010000B ;小数位位选
SETB P2.0 ;小数点不亮
SJMP EXIT2
;DSL2:
; MOV P0,40H
;ORL P0,#10000000B
;SETB P2.0
;SJMP EXIT3
EXIT:
CPL 21H ; 21h取反,即21h=1
RETI
EXIT1:
CPL 22H ; 22h=1
CPL 21H ;21h=0
RETI
EXIT2:
; CPL 23H ;
CPL 22H ;22h=0
RETI
;EXIT3:
; CPL 23H ;
; RETI
; Main program
MAIN:
TOINIT:
CLR EA
MOV TMOD,#01H ;定义timer0的工作方式为1
MOV TH0,#swpH ;装初始值
MOV TL0,#swpL
SETB EA ;开总中断
SETB ET0 ;开中断允许
SETB TR0 ;开定时器中断
;*********************************************************** ; 地址清零,腾出地址空间
MOV R2,#3 ;R2里放循环次数为2次
MOV R0,#41H ; R0=42H
OVER:
MOV @R0,#00H; 42H=00H
INC R0 ; R0=43H
DJNZ R2,OVER ; 判断2次循环是否结束
LOOP:
LCALL DSWD ;
SJMP LOOP ;
;********************************************************** ; Read a temperature from the DS18B20
DSWD:
LCALL RSTSNR ; Init of the DS18B20
JNB F0,KEND ; F0=0则转移
MOV R0,#0CCH ;R0=0cch
LCALL SEND_BYTE ; Send a byte to the 1 wire line
MOV R0,#44H
LCALL SEND_BYTE ; Send a Convert Command
SETB EA ;
MOV 48H,#1 ;
SS2:
MOV 49H,#255 ;
SS1:
MOV 4AH,#255 ;
SS0:
DJNZ 4AH,SS0 ;
DJNZ 49H,SS1 ;
DJNZ 48H,SS2 ;
CLR EA ;进入读时序禁用任何中断
LCALL RSTSNR ;
JNB F0,KEND ;
MOV R0,#0CCH ;
LCALL SEND_BYTE ;
MOV R0,#0BEH ; 读命令
LCALL SEND_BYTE ; Send Read Scratchpad command
LCALL READ_BYTE ; Read the low byte from scratchpad
MOV WDLSB,A ; Save the temperature (low byte)
LCALL READ_BYTE ; Read the high byte from scratchpad
MOV WDMSB,A ; Save the temperature (high byte)
LCALL TRANS12 ; 读取温度值的10进制数
KEND:
SETB EA ;
RET
;**********************************************************
; 从1820读取温度并转换为10进制
TRANS12:
MOV A,30H ;30H存从1820取的温度值的低位
ANL A,#0F0H ; 选取读取温度值低位中的高4位储存温度
MOV 3AH,A ; 储存至3AH
MOV A,31H ; 31h存从1820读取温度的高位
ANL A,#0FH ; 保存温度值高位中的低4位
ORL A,3AH ; A中为温度值
SWAP A ;半字节交换
MOV B,#10 ; 转换为10进制
DIV AB
;MOV 42H,A
MOV 42H,B ; 除10 取余数,42H即个位
MOV B,#10
DIV AB
MOV 43H,B ; 43H放十3位
MOV A,30H
ANL A,#0FH ;1820中读取的温度值低位中的低4位,即小数位
MOV DPTR,#tab1 ;查表小数位
MOVC A,@A+DPTR
MOV 41H,A ;41H中为小数位
RET
;*************************************************
; Send a byte to the 1 wire line
SEND_BYTE:
MOV A,R0 ; 保存数值A=0CCH
MOV R5,#8 ;发送次数为8次
SEN3: CLR C ; 清零
RRC A ; 循环右移送值
JC SEN1 ; 判断写0还是写1
LCALL WRITE_0
SJMP SEN2
SEN1: LCALL WRITE_1
SEN2: DJNZ R5,SEN3 ; 判断是否写完
RET
;*************************************************
; Read a byte from the 1 wire line 读时序
READ_BYTE:
MOV R5,#8 ; 8次
READ1: LCALL READ ; 跳转到读时序
RRC A ;把读的的值右循环给A
DJNZ R5,READ1 ;判断是否读完
MOV R0,A
RET
;*************************************************
; Reset 1 wire line 时序初始化
RSTSNR: SETB DQ ; P3.7=1
NOP ;延时
NOP
CLR DQ ; P3.7=0发出复位脉冲
MOV R6,#250
DJNZ R6,$ ; 保持500us
MOV R6,#50
DJNZ R6,$ ; 100us
SETB DQ ; 释放总线
MOV R6,#15
DJNZ R6,$ ; 30us
CALL CHCK ;判断p3.7位是否被拉高,如已经拉高,则low,否则,将其拉高
MOV R6,#60
DJNZ R6,$ ; 120us
SETB DQ ;
;*************************************************
; low level subroutines 判断p3.7位是否被拉高,如已经拉高,则low,否则,将其拉高CHCK: MOV C,DQ ; C=P3.7
JC RST0 ; 进位标志位P3.7=1则转移RST0
SETB F0 ; 标志位F0=1
SJMP CHCK0
RST0: CLR F0 ; FO=0
CHCK0: RET
;*************************************************
WRITE_0: ;写0时序
CLR DQ ;开始写p3.7=0,拉低
MOV R6,#30 ; 延时60us
DJNZ R6,$ ; 60us
SETB DQ ; p3.7=1
RET ;
;*************************************************
WRITE_1: ;写1时序
CLR DQ ; 拉低
NOP ;延时
NOP
NOP
NOP
NOP
SETB DQ ; 释放总线
MOV R6,#30
DJNZ R6,$ ; 延时60us
RET
;*************************************************
READ: ;读时序
SETB DQ ; 拉高
NOP ;延时
NOP
CLR DQ ;拉低
NOP ;延时
NOP
SETB DQ ; 拉高
NOP ;1us
NOP
NOP
NOP
NOP
NOP
MOV C,DQ
MOV R6,#23
DJNZ R6,$ ;等待46us
RET
;**********************************************
;DELAY10: MOV R4,#20 此段程序未用到
;D2: MOV R5,#30
; DJNZ R5,$ ; 60us
; DJNZ R4,D2 ; 40us
; RET
tab1: DB 00H,01H,01H,02H,02H,03H,03H,04H
DB 05H,06H,06H,07H,07H,08H,08H,09H
END
数字电子钟设计
目录
1.实验目的 (2)
2.实验题目描述和要求 (2)
3.设计报告内容 (2)
3.1实验名称 (2)
3.2实验目的 (2)
3.3实验器材及主要器件 (2)
3.4数字电子钟基本原理 (3)
3.6数字电子钟电路图 (4)
3.7数字电子钟的组装与调试 (4)
4.实验结论 (5)
5.实物效果图 (5)
6、实验心得 (5)
参考文献 (5)
附录 (6)
1.实验目的
(1).掌握组合逻辑电路、时序逻辑电路及数字逻辑电路系统的设计、安装、测试方法;
(2).进一步巩固所学的理论知识,提高运用所学知识分析和解决实际问题的能力;
(3).提高电路布局﹑布线及检查和排除故障的能力;
(4).培养书写综合实验报告的能力。
2.实验题目描述和要求
(1)设计一个有“时”、“分”、“秒”(23小时59分59秒)显示的电子钟;(2)用中小规模集成电路组成电子钟,并在实验电路板上进行组装、调试;(3)画出框图和逻辑电路图,写出设计、实验总结报告;
3.设计报告内容
3.1实验名称
数字电子钟
3.2实验目的
·掌握数字电子钟的设计、组装与调试方法;
·熟悉集成电路的使用方法。
3.3实验器材及主要器件
(1)2N5551( 6片)
(2)AT89S52(1片)
(3)共阴七段三位显示器(2片)
(4)电阻、电容、导线等(若干)
3.4数字电子钟基本原理
数字电子钟的逻辑框图如图3-4所示。
它由计数器、显示器。
晶振的振荡电路产生的信号经过AT89S52的P3.4口为秒脉冲,秒脉冲送入计数器,计数结果通过“时”、“分”、“秒”显示时间。
图3-4
3.5数字电子钟单元电路设计、参数计算和器件选择
(一)计数器
秒脉冲信号经过AT89S52,分别得到“秒”个位、十位、“分”个位、十位以及“时”个位、十位的计时。
“秒”“分”计数器为六十进制,小时为二十四进制。
(1)六十进制计数
由分频器来的秒脉冲信号,首先送到“秒”计数器进行累加计数,秒计数器应完成一分钟之内秒数目累加,并达到60秒时,进行分钟累加
(2)二十四进制计数
“12翻1”小时计数器是按照“01——02——03——……——22——23——00——01——02——……”规律计数的,这与日常生活中的计时规律相同。
利用清零端实现起从23——00的翻转,其中“24”为过渡状态不显示。
其中,“时”十位是3进制,“时”个位是十进制和四进制。
(二)显示器
本系统用七段发光二极管来显示输出的数字,显示器有两种:共阳极显示器或共阴极显示器。
对应8031的显示器是共阳极显示器。
3.6数字电子钟电路图
图3.6
3.7数字电子钟的组装与调试
由图中所示的数字中系统组成框图按照信号的流向分级安装,逐级级联。
这
里的每一级是指组成数字中的各个功能电路。
4.实验结论
通过运用数字集成电路设计的24小时制的数字电子时钟,经过试验,成功实现了一下基本功能:
能准确计时,以数字形式显示时、分、秒的时间。
5、实物效果图
6.实验心得
通过这次数字电子钟的课程设计,我们才把学到的东西与实践相结合。
从中对我们学的知识有了更进一步的理解,而且更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法。
也锻炼了自己独立思考问题的能力和通过查看相关资料来解决问题的习惯。
虽然这只是一次简单的课程设计,但通过这次课程设计我们了解了课程设计的一般步骤,和设计中应注意的问题。
设计本身并不是有很重要的意义,而是同学们对待问题时的态度和处理事情的能力。
各个芯片能够完成什么样的功能,使用芯片时应该注意那些要点。
同一个电路可以用那些芯片实现,各个芯片实现同一个功能的区别。
另外,我还渐渐熟悉了proteus这个仿真软件的各个功能,让我体会到了期中的乐趣,还在电脑制作文档的过程中,使我对办公软件有了更进一步的了解和掌握。
课程设计是一个学习新知识、巩固加深所学课本理论知识的过程,它培养了我们综合运用知识的能力,独立思考和解决问题的能力。
它不仅加深了我对单片机课程的理解,还让我感受到了设计电路的乐趣。
在这次设计中,我一点也不怕麻烦,反复设计、绘图与修改,就是希望能把这次课程设计做好。
因此这次课程设计非常有意义。
参考文献:
【1】. 现代数字电路与逻辑设计清华大学出版社北京交通大学出版社. 【2】. 模拟电子技术(修订版)清华大学出版社北京交通大学出版社【3】. 模拟电子技术教程电子工业出版社
【4】. 朱定华主编.电子电路测试与实验.北京:清华大学出版社,2004.
附录:
ORG 0000H
LJMP MAIN ;上电,跳向主程序
ORG 000BH ;T0的中断入口
LJMP IT0P
ORG 1000H
MAIN: MOV TMOD,#01H ;设T0为方式1
MOV 20H,#14H ;装入中断次数,20次即为1s钟
了
CLR A ; A清0
MOV 40H,A ;"时“单元清0
MOV 41H,A ;"分”单元清0
MOV 42H,A ;“秒”单元清0
SETB ET0 ;允许T0申请中断
SETB EA ;总中断允许
MOV TH0,#3CH ;给T0装入计数初值
MOV TL0,#0B0H
SETB TR0 ;启动T0
MOV 40H,#23H
MOV 41H,#59H
MOV 42H,#40H
// MOV R2,#3 ; 清除地址空间
// MOV R0,#60H
//OVER:
// MOV @R0,#00H
// INC R0
// DJNZ R2,OVER
HERE:
LCALL DISPLAY
SJMP HERE
RETI
IT0P: PUSH PSW ;T0中断服务子程序入口,保护现场
PUSH Acc
MOV TH0,#3CH ;重新装入初值(方式1不带自动重装的) MOV TL0,#0B0H
DJNZ 20H,RETURN ;1S时间未到,返回
MOV 20H,#14H ;重置中断次数
MOV A,#01H ;“秒”单元曾1
ADD A,42H
DA A ;“秒"单元十进制调整
MOV 42H,A ;“秒”的BCD码存回“秒”单元
CJNE A,#60H,RETURN ;是否到60s,未到则返回
MOV 42H,#00H ;计满60s,“秒”单元清0
MOV A,#01H ;“分”单元曾1
ADD A,41H
DA A ;“分”单元十进制调整
MOV 41H,A ;“分”的BCD码存回“分”单元
CJNE A,#60H,RETURN ;是否到60分,未到则返回
MOV 41H,#00H ;计满60分,“分”单元清0
MOV A,#01H ;"时“单元曾1
ADD A,40H
DA A ;”时“单元十进制调整
MOV 40H,A
CJNE A,#24H,RETURN ;是否到24小时,未到则返回
MOV 40H,#00H ;到24小时,”时“单元清0
LCALL DISPLAY
RETURN: POP Acc ;恢复现场
POP PSW ;中断返回
RETI
DISPLAY: ;显示程序
MIAO: ;秒的显示程序
MOV A,42H
ANL A,#0FH ;取秒的低位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A ;段码送p0口
//MOV P2,#00100000B
MOV P2,#0
ORL P2,#00100000B ;开秒低位位选
SETB P0.7 ;该位小数点屏蔽
LCALL DELAY ;延时
MOV P0,#0FFH ;关闭p0口,等待下一个段码
MOV A,42H
//MOV A,60H
SWAP A ;交换秒位的高低位
ANL A,#0FH ;取秒的高位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
//MOV P2,#00010000B ;秒的位选
MOV P2,#0
ORL P2,#00010000B ;秒高位
SETB P0.7 ;小数点BU亮
LCALL DELAY
MOV P0,#0FFH
FEN: ;分钟的显示程序
MOV A,41H
ANL A,#0FH
//MOV B,#10
// DIV AB
// MOV 61H,B
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#00001000B ;分低位
CLR P0.7 ;分钟后面小数位亮;
LCALL DELAY
MOV P0,#0FFH
MOV A,41H
SWAP A
ANL A,#0FH
//MOV A,61H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#00000100B ; 分高位
SETB P0.7 ;个位后面小数位亮
LCALL DELAY
MOV P0,#0FFH
SHI: ;小时的显示程序
MOV A,40H
ANL A,#0FH
//MOV B,#10
//DIV AB
// MOV 62H,B
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#00000010B ; 小时低位 CLR P0.7 ;小数点不亮
LCALL DELAY
MOV P0,#0FFH
// MOV A,62H
//ADD A,#10
MOV A,40H
SWAP A
ANL A,#0FH
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#00000001B ;小时高位
SETB P0.7 ;小数点不亮
LCALL DELAY
MOV P0,#0FFH
RET
DELAY: ;延时程序
MOV R4,#30
D1: MOV R5,#20
DJNZ R5,$
DJNZ R4,D1
RET
TAB: ;共阳极段码表
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
//DB 040H,079H,024H,030H,019H,012H,002H,078H,000H,010H END。