资源描述
学号:
课程设计汇报
基于AT89C52单片机数字频率计系统设计
院 系 电子信息工程学院
专 业 电气工程及其自动化
班 级 ( 2 )
姓 名 华 杰
摘 要
在电子技术中,频率是最基础参数之一,同时也是一个很关键参数,而且和很多电参量测量方案、测量结果全部有十分亲密关系,所以,频率测量就显得更为关键。数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺乏测量仪器。它是一个用十进制数字显示被测信号频率数字测量仪器。频率测量是电子学测量中最为基础测量之一。本文中具体介绍了频率计仿真及设计过程。本文设计了一个以单片机STC89C52为关键数字频率计。介绍了单片机、放大整形模块、分频模块和LCD1602显示模块等各个模块组成和工作原理。测量时,将被测输入信号送给单片机,经过程序控制计数,结果送LCD1602显示频率值。
此次设计是以单片机STC89C52为控制关键,利用它内部定时/计数器完成待测信号频率测量。应用单片机控制功效和数学运算能力,实现计数功效和频率换算,最终显示测量频率值。此次设计所制作频率计外围电路简单,大部分功效全部经过软件编程实现,利用单片机控制实现频率计自动换挡功效;用单片机中止控制端口实现频率测量功效;经过分频电路实现对频率档位控制。此次设计频率计含有测量正确度高,响应速度快,体积小等优点。实现了1Hz~4MHz范围频率测量,而且能够实现量程自动切换。
关键词:AT89C52;数字频率计;分频;放大电路
目 录
摘 要 I
目 录 II
1 引言 1
1.1 研究背景及意义 1
1.2 中国外研究现实状况 1
2 总体方案设计 2
2.1 数字频率计设计内容 2
2.2 总体思绪 2
2.3 具体模块 2
3 硬件设计 4
3.1 电路设计步骤 4
3.2 STC89C52介绍 4
3.2.1STC89C52RC引脚功效说明 6
3.2.2 单片机引脚分配 8
3.3 信号调理及放大整形模块 8
3.3.1 LM318介绍 9
3.2.2 1N4733及74LS14介绍 9
3.4 分频模块 9
3.4.1 74LS161介绍 10
3.4.2 74LS153介绍 11
3.5 LCD显示和键盘 11
3.5.1 LCD1602介绍 11
3.5.2 1602LCD基础参数及引脚功效 12
3.5.3 1602LCD指令说明立即序 13
4 软件设计 14
4.1主程序步骤图设计 14
4.2 子程序步骤图设计 14
4.3 程序编写及仿真图设计 16
5 系统调试和试验 18
6 总结 19
参考文件 20
附录 21
1 引言
1.1 研究背景及意义
频率计是我们在电子电路试验中常常会用到测量仪器之一,它能将频率用液晶显示器或数码管直接显示出来,给测试带来很大方便,使结果愈加直接;且频率计还能对其它多个物理量进行测量,如声音频率、机械振动频率等,全部能够先转变成电信号,然后用频率计来测量。研究频率计设计和制作将会对我们生活有很大意义。现代频率计多是用LED数码管显示,其结果不明确,表示也不直接,研究液晶显示频率计发展很有意义。
数字频率计是一个用十进制数显示被测信号频率数字测量仪器,被测信号能够是方波,三角波,正弦波或其它周期性信号。假如配上合适传感器,还能够对多个物理量进行测量,比如转速,声音频率,机械振动频率和产品计件等等。所以,数字频率计是一个应用很广泛仪器,它基础功效是测量方波信号、三角波信号、正弦信号和其它多种单位时间内改变物理量。它被广泛应用于航天、电子、测控等领域。
1.2 中国外研究现实状况
纵观现在数字频率计,其基础原理全部是一样,频率是单位时间(1s) 内信号发生周期改变次数,假如我们能够在给定1s时间内对信号波形进行计数,并将计数结果显示出来,就能读取被测信号频率。数字频率计首先必需取得相对稳定和正确时间,同时将被测信号转换成幅度和波形均能被数字电路识别脉冲信号,然后经过计算这一段时间间隔内脉冲数,将其换算后显示出来。这就是数字频率计基础原理。但现在频率计显示部分全部是LED数码管,显示内容是BCD码,不直观,假如用LCD液晶来显示,会使输出结果更直接,更便于观察。正因如此,所以未来数字频率计发展肯定会向液晶显示方向发展。伴随数字电子技术发展,频率测量成为一项越来越普遍工作,测频原理和测频方法研究正受到越来越多关注。
2 总体方案设计
2.1 数字频率计设计内容
本题关键研究以单片机为关键辅以信号处理电路实现对输入信号频率进行测量。经过对信号预处理电路,包含信号放大电路、信号变换电路、信号整形电路和分频电路相关理论知识,和单片机工作原理、接口技术和编程命令及方法等知识深入学习了解,在多个方案中选择并确定一个不管是硬件实现还是测量精度和测量范围指标较适宜方案,实现基于单片机数字频率计设计。该设备经过信号预处理电路,将多种输入信号进行处理,使信号变成高低电平形式矩形波信号,再和单片机进行接口,再经过单片机中止和多种程序进行运算,最终显示出计算结果,得到输入信号频率值。经过此次课题设计,使学生愈加巩固所学理论知识,并经过查阅、消化相关资料,自学相关设计硬件,完成设计方案理论分析,并深入设计、制作实际电路,从而达成理论和实践相结合效果。培养分析问题、处理实际问题能力,并含有一定硬件电路设计、调试能力。参数要求以下:
1、装置测量频率范围在1HZ-4MHZ之间;
2、测量误差为0.1%;
3、用LCD1602液晶显示器显示结果;
4、能够测量方波、三角波及正弦波等多个波形周期信号。
2.2 总体思绪
频率计是我们常常会用到试验仪器之一,频率测量实际上就是在单位时间内对信号脉冲进行计数,计数值就是信号频率。本文介绍了一个基于单片机STC89C52频率计设计方法,所制作频率计测量比较高频率时采取外部分频,测量较低频率值时采取单片机直接计数,不进行外部分频。该频率计实现100HZ-4MHZ频率测量,LCD1602液晶显示器显示测量结果,能够测量正弦波、三角波及方波等多种波形频率值。该设备经过信号预处理电路,将多种输入信号进行处理,使信号变成高低电平形式矩形波信号,经过分频模块,再和单片机进行接口,再经过单片机中止和计数多种程序进行运算,最终显示出计算结果,得到输入信号频率值。
2.3 具体模块
此次设计包含硬件设计和软件设计两部分。依据上述系统分析,数字频率计硬件系统设计共包含五大模块:放大整形模块、分频模块、单片机控制模块、键盘模块及显示模块。各模块作用以下:
(1)放大整形模块:放大电路是对待测信号放大,降低对待测信号幅度要求。整形电路是对部分不是方波待测信号转化成方波信号,便于测量。
(2)分频模块:考虑单片机外部计数,使用12 MHz时钟时,最大计数速率为500 kHz,因为此次设计要求测量最高频率是4MHz,所以需要进行外部分频。分频电路用于扩展单片机频率测量范围,并实现单片机频率测量使用统一信号,可使单片机测频更易于实现,同时也降低了系统测频误差。
(3)单片机控制模块:以STC89C52单片机为控制关键,用它来完成待测信号计数和显示和对分频控制。利用其内部定时/计数器完成待测信号周期/频率测量。单片机STC89C52内部含有2个16位定时/计数器,定时/计数器工作能够由编程来实现定时、计数和产生计数溢出时中止要求功效。(因为STC89C52所需外围元件少,扩展性强,测试正确度高。
(4)按键模块:包含三个按键,S1、S2为频率/周期、闸门时间加/减按键,还有一个是确定键,在测量较低频率时,能够改变闸门时间,提升测量精度,也能够选择频率或周期来显示测量结果。
(5)显示模块:显示电路采取LCD1602液晶显示器显示,使测量结果更直观显示出来。
综合以上分析,频率计硬件系统设计有单片机控制模块、放大整形模块、分频模块、键盘模块及显示模块等组成,频率计硬件总体设计框图图2.2所表示。
图2.1 硬件总体框图
简单说来,本系统实际用LM318对待测信号进行放大,再用稳压二极管1N4733对信号进行限幅,然后经过74LS14反相器整形得到方波信号,接着送74LS161进行分频,最终送单片机P3.5内部计数器进行计数,单片机处理数据后送LCD1602显示。下面一章将介绍整个电路设计过程。
电路基础功效是实现电子产品开发设计技术和功效,使电路含有某种特定功效,必需进行电路设计和制作。设计是使某一电路含有某种功效,制作则是设计过程电路实物化。
3 硬件设计
3.1 电路设计步骤
(1)课题分析
依据此次设计要求,先搞清楚立即设计系统要实现功效和原理,再确定电路基础形式,依据设计可行性做出估量和判定,确定设计技术关键处理问题。
(2)设计方案论证
选题不管哪种(除了调查研究之外)全部要论证它可行性。论证分为立论和驳论两种。
(3)总体方案选择
依据任务书提出任务、要求和性能指标,用含有一定功效单元电路组成一个整体,来实现各项功效,满足设计题目提出要求和技术指标。
(4)单元电路设计和确定
在确定总体方案、画出具体框图以后,便可进行单元电路设计。
①在电路结构简单,成本低,性能强基础上,依据设计要求和总体方案原理框图来确定各单元电路。
②设计每一个单元电路图。
③依据相关资料确定单元电路结构形式。
④依据设计要求,调整元件,估算参数来选择元器件。
(5)总电路图画法
总电路图通常绘制方法以下:
①依据信号流向,从左到右或从上到下按信号流向依次画出各单元电路。
②尽可能把总电路图画在一张图样上
③电路中全部连线全部要表示清楚,各元件间绝大多数连线应在图样上直接画出。
④符号应标准化。
⑤先画草图,调整好布局和连线后,再画出正式总电路图。
(6)审图
因为有些问题考虑不周,多种计算可能出现错误,所以,在画出总电路图并计算全部参数以后,要进行全方面审查。
3.2 STC89C52介绍
STC89C52RC是一个带8K字节闪烁可编程可擦除只读存放器(FPEROM-Flash Programmable and Erasable Read Only Memory )低电压,高性能COMOS8微处理器,俗称单片机。该器件采取ATMEL搞密度非易失存放器制造技术制造,和工业标准MCS-51指令集和输出管脚相兼容。
STC89C52RC单片机是宏晶科技推出新一代高速/低功耗/超强抗干扰单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期能够任意选择。
图3.1 STC89C52RC引脚图
3.2.1STC89C52RC引脚功效说明
VCC(40引脚):电源输入,接+5V电源
VSS(20引脚):接地线
P0端口(P0.0~P0.7,39~32引脚):P0口是一个漏极开路8位双向I/O口。作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,能够作为高阻抗输入。在访问外部程序和数据存放器时,P0口也能够提供低8位地址和8位数据复用总线。此时,P0口内部上拉电阻有效。在Flash ROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。验证时,要求外接上拉电阻。
P1端口(P1.0~P1.7,1~8引脚):P1口是一个带内部上拉电阻8位双向I/O口。P1输出缓冲器可驱动(吸收或输出电流方法)4个TTL输入。对端口写入1时,经过内部上拉电阻把端口拉到高电位,这是可用作输入口。P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低引脚会输出一个电流(IIL)。
STC89C52关键功效如表3.3所表示。
表3.3 STC89C52关键功效
关键功效特征
兼容MCS51指令系统
8K可反复擦写Flash ROM
32个双向I/O口
256x8bit内部RAM
3个16位可编程定时/计数器中止
时钟频率0-24MHz
2个串行中止
可编程UART串行通道
2个外部中止源
共6个中止源
2个读写中止口线
3级加密位
低功耗空闲和掉电模式
软件设置睡眠和唤醒功效
3.2.2 单片机引脚分配
依据此次系统设计及各模块需要分析,单片机引脚分配如表3.4所表示。
表 3.4 单片机端口分配表
模 块
端口
功效
显示模块
P0.0-P0.7
LCD频率值显示
分频模块
P3.1-P3.2
通道选择
P3.5
被测信号输出
按键
P1.6-P1.7
键盘设置
3.3 信号调理及放大整形模块
前置放大整形模块包含放大器LM318、稳压管1N4733A,施密特触发器74LS14。反相输入运算放大器放大倍数为RL2/RL1,系统整形电路由施密特触发器组成,信号经过放大后,要进行稳压,预防烧坏后面芯片,整形后方波送到74LS161分频,然后送单片机方便计数。
因为输入信号幅度是不确定、可能很大也有可能很小,这么对于输入信号测量就不方便了,过大可能会把器件烧毁,过小可能器件检测不到,所以在设计中放大限幅和整形,信号调理部分电路具体实现电路原理图和参数以下图3.5所表示:
图3.2 信号整形放大原理图
3.3.1 LM318介绍
3.4 分频模块
前面已经提过,因为测量频率范围比较宽,而且最高测量值要求要达成4MHz,为了达成测量要求和提升测量精度,这里我用74LS161作为一个4分频和16分频电路。
分频器可用来降低信号频率,是数字系统中常见电路。分频器输入信号频率和输出信号频率之比称为分频比N。N进制计数器可实现N分频器。74HC161和74LS161功效兼容,是常见四位二进制可预置同时加法计数器,它能够灵活利用在多种数字电路,和单片机系统中实现分频器等很多关键功效。
74LS161对整形后方波信号进行分频,Q1为四分频输出,Q3为十六分频输出。未经分频、经过四分频和经过十六分频三路信号作为74LS153一个4选1数据选择器低三位输入,由单片机控制选择分频系数,然后再送单片机内部计数器T1,其原理图图3.6所表示:
图3.3 分频模块
3.4.1 74LS161介绍
74LS161是常见四位二进制可预置同时加法计数器,它能够灵活利用在多种数字电路,和单片机系统中实现分频器等很多关键功效,时钟CP和四个数据输入端P0~P3,清零/MR,使能CEP,CET,置数PE,数据输出端Q0~Q3,和进位输出TC (TC=Q0·Q1·Q2·Q3·CET)。表3.5为74161功效表。
表3.5 74161功效表
清零
RD
预置
LD
使能
EP ET
时钟
CP
预置数据输入
A B C D
输出
Q0 Q1 Q2 Q3
L
×
× ×
×
× × × ×
L L L L
H
L
× ×
上升沿
A B C D
A B C D
H
H
L ×
×
× × × ×
保 持
H
H
× L
×
× × × ×
保 持
H
H
H H
上升沿
× × × ×
计 数
其中RD是异步清零端,LD是预置数控制端,A、B、C、D是预置数据输入端,EP和ET是计数使能端,RCO(=ET.QA.QB.QC.QD)是进位输出端,它设置为多片集成计数器级联提供了方便。计数过程中,首先加入一清零信号RD=0,使各触发器状态为0,即计数器清零。RD变为1后,加入一个置数信号LD=0,即信号需要维持到下一个时钟脉冲正跳变到来后。在这个置数信号和时钟脉冲上升共同作用下,各触发器输出状态和预置输入数据相同,这就是预置操作。接着EP=ET=1,在此期间74161一直处于计数状态。一直到EP=0,ET=1,计数器计数状态结束。
从74LS161功效表功效表中能够知道,当清零端CR=“0”,计数器输出Q3、Q2、Q1、Q0立即为全“0”,这个时候为异步复位功效。当CR=“1”且LD=“0”时,在CP信号上升沿作用后,74LS161输出端Q3、Q2、Q1、Q0状态分别和并行数据输入端D3,D2,D1,D0状态一样,为同时置数功效。而只有当CR=LD=EP=ET=“1”、CP脉冲上升沿作用后,计数器加1。74LS161还有一个进位输出端CO,其逻辑关系是CO= Q0·Q1·Q2·Q3·CET。合理应用计数器清零功效和置数功效,一片74LS161能够组成16进制以下任意进制分频器。
管脚图介绍:时钟CP和四个数据输入端P0~P3;清零/MR;使能CEP,CET;置数PE;数据输出端Q0~Q3。其管脚图图3.7所表示。
图3.4 74LS161管脚图 图3.5 74LS153管脚图
3.4.2 74LS153介绍
74LS153是一个双4选1数据选择器,数据选择端(AB)为两组共用,按二进制译码,以供两组从各自4个数据输入端(1C0--1C3,2C0--2C3)中分别选择一个所需数据,只有在两组各自选通端(1G、2G)为低电平时才可选择数据,1Y、2Y分别为两个输出端。其管脚图图3.8所表示。
3.5 LCD显示和键盘
LCD1602显示部分,经过调整变阻器调整LCD背光亮度,八位数据端口接单片机P0口,读写控制端接P2.0-P2.2。三个按键中,设置键接P3.2单片机按外部中止0接口,当按键按下后,置P3.2口低电平,单片机中止。S1、S2为频率/周期、闸门时间加/减 选择按键,按键部分工作原理是,依据按下设置键时间长短,能够设置闸门时间或选择测量结果显示方法,闸门时间能够加也能够减,显示方法有频率和周期两种,按键部分也是单片机控制,原理图图3.9所表示:
图3.6 显示及按键部分
3.5.1 LCD1602介绍
字符型液晶显示模块是一个专门用于显示字母、数字、符号等点阵式LCD,现在常见16*1,16*2,20*2和40*2行等模块。下面以长沙太阳人电子1602字符型液晶显示器为例,介绍其使用方法。通常1602字符型液晶显示器实物图3.10所表示:
图3.7 1602字符型液晶显示器实物图
3.5.2 1602LCD基础参数及引脚功效
1、1602LCD关键技术参数:
显示容量:16×2个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最好工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
2、引脚功效说明:
1602LCD采取标准14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表3.6所表示:
表3.6 引脚接口说明表
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
3.5.3 1602LCD指令说明立即序
1602液晶模块内部控制器共有11条控制指令,如表3.7所表示:
表3.7 1602控制指令
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功效
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写数据内容
11
从CGRAM或DDRAM读数
1
1
读出数据内容
4 软件设计
4.1主程序步骤图设计
依据此次设计要求,主程序关键包含单片机和LCD1602初始化,频率测量,量程自动转换和显示多个方面,主程序步骤图图4.1所表示:
图4.1 主程序步骤图
4.2 子程序步骤图设计
(1)显示程序
LCD显示程序设计步骤图以下图所表示:
图4.2 显示程序步骤图
(2)频率测量程序框图
频率测量程序整体架构图所表示:
频率测量程序
加按键、减按键
显示闸门时间
判定频率
测试频率
周期显示
频率显示
定时中止
计数中止
89
C
52
初始化
延时子程序
图4.3 频率测量框架图
(3)中止服务步骤图
这是按键部分程序步骤图,按键有三个,期望能够经过设置键能够选择闸门时间设置或选择显示方法,工作过程以下,设置键按下时间长短判定,长按就选择显示方法,假如按下时间短,则选择闸门时间设置,设置后再按下设置键退出中止,返回测量结果显示。INT0中止步骤图图所表示:
图4.4 INT0中止步骤图
(4) 判定频率,选择分频步骤图
此次设计,分频系数有两个,100kHz<f<500kHz时选择4分频,f>500kHz时选择16分频,分频数选择程序步骤图图4.5所表示:
图4.5 分频数选择程序步骤图
因为此次设计要求测量频率范围是100Hz—4MHz,可见测量范围比较宽,为提升精度和测量达成最高测量要求4MHz,所以要进行外部分频,分频系数有1,4,16.即不分频,4分频和16分频。程序中设计是先估计输入频率,若是频率范围在100KHz—500KHz,选择4分频,高于500KHz则选择16分频,小于100KHz则不用分频,直接测量。由此设计程序步骤图图4.5所表示。
4.3 程序编写及仿真图设计
依据前面程序步骤框图,分模块编写C语言程序,因为在用C语言编写程序方面学艺不精,此次程序编写是在网上搜索相关资料然后在多位同学和老师指导下完成,过程坎坷而且很揪心,相对后面调试,这算是好了。之前学过Proteus,而且比较熟悉,所以仿真图设计是在Proteus完成,设计之前了解要用元器件特征和各个元器件之间连接方法,而且之前课程设计数次用过,所以在此次设计中,没碰到多大问题,相对顺利很多。总体仿真图图4.6所表示:
图4.6 频率计Proteus仿真图
5 系统调试和试验
单片机软件调试关键是调试此次设计主程序。依据系统设计要求,进行Keil和Proteus系统仿真,不停调试程序,修改电路图,直到符合功效要求。此次设计Proteus仿真结果图5.1所表示。
图5.1 部分仿真图
6 总结
单片机因其功效独特和价格廉价在全球范围内得到了广泛应用,此次我们利用了基于
AT89C52单片机对数字频率计进行了系统设计。在这次小组协作完成中,我本人负责部分是分频模块,开始还是有点力不从心,学过只是全部已经忘记了差不多了,我又查阅了相关资料,尤其是数字逻辑电路,所以我们经过权衡在硬件方面采取了74LS161和74LS153两个模块74LS161是常见四位二进制可预置同时加法计数器,它能够灵活利用在多种数字电路,74LS153是一个双4选1数据选择器,功耗较低。在仿真中74LS161对整形后方波信号进行分频,Q1为四分频输出,Q3为十六分频输出。未经分频、经过四分频和经过十六分频三路信号作为74LS153一个4选1数据选择器低三位输入,由单片机控制选择分频系数,然后再送单片机内部计数器T1.在软件编程方面,分频编程程序是由三个人完成,我也是关键负责检验犯错情况,在之前还特意对C语言方面只是进行了补充学习,在部分细节方面特变死格式我还是检验了很多错误情况,同时对于负责分频程序两个人编程能力我还是很佩服。在这一次合作小组工作中,大家分工明确,各自抽出时间下功夫,在协调合作方面即使是出现了部分情况,不过还是很好地完成了,小组组长分配和统筹能力很好,从硬件设计步骤到信号放大处理,到分频最终LED显示和键盘全部是组长统一协调,调试,使各个模块紧密组合在一起,完成了我们数字频率计系统设计。从这次实践情况来看,我们动手能力还是有待加强,毕竟理论和实践还是有相当大差距。我想假如一个人在这么短时间里还是极难完成。这次设计还是很很多不足和漏洞,还是有很大进步空间,期望在以后学习和工作中愈加完善自己,做足功课,争取做到愈加好。
参考文件
[1] 王辛之等.AT89系列单片机原理和接口技术[M].北京:北京航天大学出版社,.
[4] 辛友顺.单片机应用系统设计和实现[M].福建:福建科学技术出版社,.
[5] 张鑫.单片机原理及应用[M].北京:电子工业出版社,.
[7] 卢艳军.单片机基础原理及应用系统[M].北京:机械工业出版社,.
[8] 张毅刚.MCS-51单片机应用设计[M]. 哈尔滨:哈尔滨工业大学出版社,1996
[9] 陈西文,吴燕军.I/O接口程序设计入门和应用[M].北京:机械工业出版社,1996.
附录
程序清单:
#include <reg52.h>
#include <stdio.h>
#include <math.h>
#include <intrins.h>
float f; //频率
float T; //周期
float Tz; //闸门时间
char idata buff[20];
char flag=0; //频率\周期选择标志位
char xs=0; //设置闸门时间结束后是否显示结果标志位
unsigned char m=0,n=0,yichu=0,fenpin; //m定时中止次数 n计数中止次数 yichu判定是定时器还是计数器溢出
#define Key_Set P1
#define K1 0xbf
#define K2 0x7f
#define NO_Set 0xff
#define Fre 0
#define Peri 1
sbit B1=P2^6;
sbit A=P2^5;
sbit P17=P1^7;
sbit P16=P1^6;
sbit P35=P3^5;
sbit Set=P3^2;
unsigned char LCD_Wait(void);
void LCD_Write(bit style, unsigned char input);
void LCD_SetDisplay(unsigned char DisplayMode);
void LCD_SetInput(unsigned char InputMode);
void LCD_Initial();
void GotoXY(unsigned char x, unsigned char y);
void Print(unsigned char *str);
void C52_Initial();
void Delay(unsigned int t);
void display(float f);
void cep();
void pand();
void timedisplay(float Tz);
void Time_Set1();
void Time_Set2();
void t0();
void t1();
/***********************引脚定义***********************************/
sbit LcdRs= P2^0;
sbit LcdRw= P2^1;
sbit LcdEn= P2^2;
sfr DBPort= 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
void lcm_delay(int x)
{
int i;
for(i=0;i<x;i++)
_nop_();
}
/************************内部等候函数***************************************/
unsigned char LCD_Wait(void)
{
LcdRs=0; //寄存器选择输入端 1:数据 0:指令
LcdRw=1; _nop_(); //RW:为0:写状态;为1:读状态;
LcdEn=1; _nop_(); //使能输入端,读状态,高电平有效;写状态,下降沿有效
LcdEn=0;
return DBPort;
}
/***********************向LCD写入命令或数据*********************************/
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; lcm_delay(100);
DBPort=input; lcm_delay(100);//注意次序
LcdEn=1; lcm_delay(100);//注意次序
LcdEn=0; lcm_delay(100);
LCD_Wait();
}
/********************设置显示模式****************************************/
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
void LCD_SetDisplay(unsigned char DisplayMode) //显示模式设定
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
/*********************设置输入模式***************************************/
#define LCD_AC_UP 0x02 //读入一个字符后地址指针加一
#define LCD_AC_DOWN 0x00 //读入一个字符后地址指针减一
#define LCD_MOVE 0x01 //写一个字符后W左移
#define LCD_NO_MOVE 0x00 //写一个字符后不移动
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
/******************初始化LCD******************************************/
void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
}
//************************************************************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
/*************************89c52初始化********************************/
void C52_Initial()
{
Tz=1000000.00;
Key_Set=0xff;
TMOD=0x51; // 01010001 T1为计数器,T0为定时器
EA=1;
展开阅读全文