资源描述
单片机课程设计
题 目 水流量显示器
学 院 电子工程学院
专 业 自动化
班 级
学 号
姓 名
组 员
指导教师
2013年 5 月
引言 3
1. 任务设计 4
2. 系统硬件电路设计 5
2.1主芯片STC89C52 5
2.1.1主要性能 5
2.1.2芯片功能特性简述: 5
2.1.3引脚功能 6
2.2时钟电路 7
2.3复位电路 7
2.4液晶显示电路 8
2.4.1显示特性 8
2.4.2引脚说明 8
2.4.3接口时序 10
2.4.4初始化指令: 12
2.5水流量测量电路 14
2.6按键控制电路 15
3. 软件系统设计 16
3.1软件设计总流程 16
3.2水流量程序模块 16
3.2.1水流量读取程序 17
3.3显示程序 18
4. 总结 19
参考文献 20
附件1. 原理图 21
附件3 仿真图 22
5. 程序 23
引言
随着现代社会进步,经济发展,人们对精神领域追求更高,对生活水平要求更高。现代家居生活是一种高品位、高质量、个性化、智能化方式。本系统就是基于STC89C52单片机控制智能家居系统,可以实际监控室内各种不同家电设备,并能通过液晶屏动态显示当前工作状态。该系统及传统智能家居系统相比,具有功能多样化、成本造价低等优点,且符合当今社会智能、节能、环保发展观念,并在人们享受高品位、高质量、个性化、智能化生活同时提高人们节约意识。由于智能家居系统有众多模块,本课题只采取其中水流量模块进行单独设计。
关键词: 单片机 水流量传感器
1. 任务设计
当打开水龙头时,根据单片机STC89C52指令、水流量计传感器采集水流量状态。当单片机STC89C52扫描到水流量计传感器脉冲数,经过单片机STC89C52处理,计算出所采集水流量后,通过液晶屏LCD1602能动态显示当前水流量。
2. 系统硬件电路设计
2.1主芯片STC89C52
2.1.1主要性能
1)及MCS-52单片机产品兼容 、8K字节在系统可编程Flash存储器
2)1000次擦写周期
3)全静态操作:0Hz~33Hz
4)三级加密程序存储器
5)32个可编程I/O口线
6)三个16位定时器/计数器八个中断源
7)全双工UART串行通道
8)低功耗空闲和掉电模式
9)掉电后中断可唤醒
10)看门狗定时器
11)双数据指针
12)掉电标识符
2.1.2芯片功能特性简述:
STC89C52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用高密度非易失性存储器技术制造,及工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧8 位CPU 和在线系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效解决方案。 STC89C52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。8 位微控制器 8K字节在系统可编程 Flash。
图2-1 单片机引脚
2.1.3引脚功能
表2-1 STC89C52引脚介绍说明
引脚
功能介绍
VCC
+5V电源电压
VSS
电路接地端
P0.0~P0.7
8位漏极开路双向I/O通道
P2.0~P2.7
8位拟双向I/O通道
P3.0
RXD,串行输入口
P3.1
TXD,串行输出口
P3.2
INT0,外部中断0输入口
P3.3
INT1,外部中断1输入口
P3.4
定时器/计数器0外部事件脉冲输入端
P3.5
定时器/计数器1外部事件脉冲输入端
P3.6
外部数据存贮器写脉冲
P3.7
外部数据存贮器读脉冲
RST/VpD
复位输入信号
ALE/PROG
地址锁存有效信号
PSEN
程序选通有效信号
EA/VPP
当保持TTL高电平,执行内部EPROM指令,当使TTL为低电平, 从外部程序存贮器取出所有指令,在内EPROM编程时,此端为21V编程电源输入端
XTAL1
内部振荡器外接晶振一个输入端
XTAL2
内部振荡器外接晶振一个输入端
2.2时钟电路
单片机最小系统有三部分组成,即电源,时钟电路和复位电路。其中单片机电源引脚及5V电源连通即可,而时钟电路和复位电路还需接口扩展,这也是单片机基本电路操作。
时钟电路用于产生单片机工作所需时钟信号,时序是指令执行中各信号之间相互关系。单片机本身就如同一个复杂同步时序电路,为了保证同步工作方式实现,电路应在唯一时钟信号控制下严格地按时序进行工作。在STC89C52单片机内部带有时钟电路,因此,只需要在片外通过XTAL1和XTAL2引脚接入定时控制元件(晶体振荡器和电容),即可构成一个稳定自激振荡器。在STC89C52芯片内部有一个高增益反相放大器,而在芯片外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容。在单片机XTAL1脚和XTAL2脚之间并接一个晶体振荡器就构成了内部振荡方式。STC89C52单片机内部有一个高增益反相放大器,XTAL1为内部反相放大器输入端,XTAL2为内部反相放大器输出端,在其两端接上晶振后,就构成了自激振荡电路,并产生振荡脉冲,振荡电路输出脉冲信号频率就是晶振固有频率。在实际应用中通常还需要在晶振两端和地之间各并上一个小电容。
图2-2 时钟电路
用晶振和电容构成谐振电路。电容大小及晶振频率和工作电压有关。但电容大小影响振荡器稳定性和起振快速性,为了提高精度,本实验板采用20pF电容作为微调电容。在设计电路板时,晶振、电容等均应尽可能靠近芯片,减小分布电容,以保证振荡器振荡稳定性。
2.3复位电路
复位是单片机初始化操作,其目是使CPU和系统中各部分处于一个确定状态,并从这一状态开始工作。系统上电路或死机后都要进行复位操作。单片机RST引脚为复位引脚,振荡电路正常工作后,RST端加上持续两个机器周期高电平后,单片机就被复位。复位电路有3种基本方式:上电复位,开关复位和看门狗复位。
图2-3 复位电路
本课题采用按键开关复位是指通过接通按钮开关,使单片机进入复位状态。开关复位电路一般不单独使用。在应用系统设计中,若需使用开关复位电路,一般做法是将开关复位及上电复位组合在一起形成组合复位电路,上电复位电路完成上电复位功能,开关复位电路完成人工复位。
图2-3中C7及R1构成了上电复位电路。上电复位后,电源经R1对C7充满电源,C7等效于开路,RST端为低电平;单片机正常工作。按开关K1后,C7两端电荷经R1迅速放电,K1断开后,由C7、R1及电源完成对单片机复位操作。在上述电路中C7、R1按上电复位电路设计而取值。
复位电路作用非常重要,能否成功复位关系但单片机系统能否正常运行问题。如果振荡电路正常而单片机系统不能正常运行,其主要原因是单片机没有完成正常复位,程序计数器值没有回0,特殊功能寄存器没有回到初始状态。这时可以适当地调整上电复位电路阻容值,增加其充电时间常数来解决问题。
2.4液晶显示电路
课题任务要求以LCD1602芯片显示单片机处理后温度、水费和水流量,在此有必要详尽介绍LCD1602特性和用法。
2.4.1显示特性
只需5V 电源电压,低功耗、长寿命、高可靠性
内置 192 种字符(160个 5×7 点阵字符和 32 个5×10 点阵字符)
具有 64 个字节自定义字符 RAM
显示方式:STN、半透、正显
驱动方式:1/16DUTY,1/5BIAS
视角方向:6点
背光方式:底部 LED
通讯方式:4位或 8 位并口可选
标准接口特性:适配 MC51 和M6800 系列 MPU操作时序。
2.4.2引脚说明
表2-2 液晶1602引脚说明
管脚号
符号
功 能
1
Vss
电源地(GND)
2
Vdd
电源电压(+5V)
3
V0
LCD驱动电压(可调) 寄存器选择输入端,输入MPU 选择模块内部寄存器类型信号:RS=0,当MPU 进行写模块操作,指向指令寄存器;
4
RS
当MPU 进行读模块操作,指向地址计数器;RS=1,无论MPU 读操作还是写操作,均指向数据寄存器
5
R/W
R/W=0 读操作;R/W=1 写操作
6
E
使能信号输入端,输入MPU 读/写模块操作使能信号:
4位方式通讯时,不使用DB0-DB3
7
DB0
数据输入/输出口,MPU 及模块之间数据传送通道
8
DB1
数据输入/输出口,MPU 及模块之间数据传送通道
9
DB2
数据输入/输出口,MPU 及模块之间数据传送通道
10
DB3
数据输入/输出口,MPU 及模块之间数据传送通道
11
DB4
数据输入/输出口,MPU 及模块之间数据传送通道
12
DB5
数据输入/输出口,MPU 及模块之间数据传送通道
13
DB6
数据输入/输出口,MPU 及模块之间数据传送通道
14
DB7
数据输入/输出口,MPU 及模块之间数据传送通道
15
A
背光正端+5V
16
K
背光负端0V
16
K
背光负端0V
2.4.3接口时序
图2-5 时序图
表2-3 液晶1602时序图标号说明
时序参数
符号
极限值
单位
测试条件
最小值
典型值
最大值
E信号周期
tc
400
ns
引脚E
E脉冲宽度
Tpm
150
ns
E上升沿/下降沿时间
Tr,tf
25
ns
地址建立时间
Tsp1
30
ns
引脚E、RS、R\W
地址保持时间
Thd1
10
ns
数据建立时间(读操作)
Td
100
ns
引脚DB0~DB7
数据保持时间(读操作)
Thd2
20
ns
数据建立时间(写操作)
Tsp2
40
ns
数据保持时间(写操作)
Thd2
10
ns
程序实现如下:
/************************写指令程序************************/
void wr_com(unsigned char com) //写指令
{
delay(1); //延时1ms
RS=0; //写命令设置
RW=0; //并行数据读写
EN=0; //使能为0
P2=com; //输入命令
delay(1); //延时1ms
EN=1; //使能为1
delay(1); //延时1ms
EN=0; //使能为0
}
/**********************写数据程序***********************/
void wr_dat(unsigned char dat)// 写数据
{
delay(1); //延时1ms
RS=1; //写数据设置
RW=0; //并行数据读写
EN=0; //使能为0
P2=dat; //输入数据
delay(1); //延时1ms
EN=1; //使能为1
delay(1); //延时1ms
EN=0; //使能为0
}
2.4.4初始化指令:
表2-4 清屏指令
指令功能
指令编码
执行时间/ms
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
清屏
0
0
0
0
0
0
0
0
0
1
1.64
功能:
清除液晶显示器,即将DDRAM内容全部填入"空白"ASCII码20H;
光标归位,即将光标撤回液晶显示屏左上方;
将地址计数器(AC)值设为0。
表2-5 光标归位指令
指令功能
指令编码
执行时间/ms
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
光标归位
0
0
0
0
0
0
0
0
1
X
1.64
功能:
把光标撤回到显示器左上方;
把地址计数器(AC)值设置为0;
保持DDRAM内容不变
表2-6 进入模式设置指令
指令功能
指令编码
执行时间/ms
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
进入模式设置
0
0
0
0
0
0
0
1
I/D
S
1.64
功能:设定每次定入1位数据后光标移位方向,并且设定每次写入一个字符是否移动。
表2-7 显示开关控制指令
指令功能
指令编码
执行时间/us
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
显示开关控制
0
0
0
0
0
0
1
D
C
B
40
功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。
表2-8 设定显示屏或光标移动方向指令
指令功能
指令编码
执行时间/us
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
设定显示屏或光标移动方向
0
0
0
0
0
1
S/C
R/L
X
X
40
功能:使光标移位或使整个显示屏幕移位。
表2-9 功能设定指令
指令功能
指令编码
执行时间/us
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
功能设定
0
0
0
0
1
DL
S/C
R/L
X
X
40
功能:设定数据总线位数、显示行数及字型。参数设定情况如下:
表2-10 设定CGRAM地址指令
指令功能
指令编码
执行时间/us
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
设定CGRAM地址
0
0
0
1
CGRAM地址(6位)
功能:设定下一个要存入数据CGRAM地址。
表2-11 设定DDRAM地址指令
指令功能
指令编码
执行时间/us
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
设定DDRAM地址
0
0
1
CGRAM地址(7位)
40
功能:设定下一个要存入数据CGRAM地址。
(注意这里我们送地址时候应该是0x80+Address,这也是前面说到写地址命令时候要加上0x80原因)
表2-12 读取忙信号或AC地址指令
指令功能
指令编码
执行时间/us
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
读取忙碌信号或AC地址
0
1
FB
AC内容(7位)
40
功能:
读取忙碌信号BF内容,BF=1表示液晶显示器忙,暂时无法接收单片机送来数据或指令;当BF=0时,液晶显示器可以接收单片机送来数据或指令;
读取地址计数器(AC)内容。
表2-13 数据写入DDRAM或CGRAM指令一览
指令功能
指令编码
执行时间/us
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
写数据到DDRAM或CGRAM
1
0
要写数据D7~D0
40
功能:
将字符码写入DDRAM,以使液晶显示屏显示出相对应字符;
将使用者自己设计图形存入CGRAM。
表2-14 从CGRAM或DDRAM读出数据指令一览
指令功能
指令编码
执行时间/us
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
从CGRAM或DDRAM中读数据
1
1
要读数据D7~D0
40
功能:读取DDRAM或CGRAM中内容。
单片机和LCD液晶显示器连接
图2-6 液晶显示电路
2.5水流量测量电路
课题任务中最重要是水流量测量。通过水流量传感器数据采集,根据商家水流量传感器参数可以得出单片机在运算时数据。
水流量传感器参数:
环境温度:-10~55℃
流量计算在流量为:0.2~0.4L/Min时,1L=2100次;0.5~0.8L/Min时,1L=2280次;0.9~1.2L/Min时,1L=2350次;1.2~2.5L/Min时,1L=2460次; (脉冲次数在流量变化时有一定程度变动)
接线方法 白线:信号输出;黑线:电源负(也可按客户要求定做)
测量精度:±5%(在流量稳定系统,精度可达±2%)
工作电压:DC0~~24V
工作压力:≤100PSI(7kg/cm)
耐湿性能:在环境湿度为90%以下时性能保持稳定
寿命测试:本产品用进口干簧管作感应元件,在负荷小于24V 1mA前提下,
开关寿命大于3亿次。
图2-15 水流量测量电路
2.6按键控制电路
课题设计之初,要求基本实现功能有水流量控制、水价改变。由于液晶显示屏不能够完全实现其显示,故又增加了换页功能,共三个控制键。
图2-16 按键电路
3. 软件系统设计
3.1软件设计总流程
程序要求液晶显示有当前水流量,总流量。水流量测量由开关控制。由于LCD1602显示屏幕有限,所以又把程序设计成可以翻页形式。翻页也用开关控制。由于在两个界面里面都显示水温,故在显示程序里加入测量水温程序也未尝不可。整个程序中结构较为简单,但其中也有几个重要而且比较费脑筋子程序,包括水测量程序、水流量数据计算转换程序。
在程序中可以分为2个主要模块:水流量模块,显示模块如图3-1所示:
图3-1 总流程图
3.2水流量程序模块
水流量测量主要依靠对得到频率处理,由流量计在一段时间下产生高电平个数决定,即Q(流量)=F(频率)/R(商家设定值)所以只要在单片机中设定一定时间,并在该时间之下计算出得到高电平即可。在本程序中STC89C52两个定时器T0为计数状态,T1 为计时状态,这样方可测量流量。
3.2.1水流量读取程序
中断程序运行时间到,就可以读取计数器中数值,将下数值读出后把计数器赋值为0,等待下一次取出,然后进入对读出数据处理程序。如图3-4所示:
图3-2 水流量数据处理程序
在预定时间到,即已经取出了定时器数值。我们计算水流量最大是以每吨来计算并显示,故一个整形或长整型数不够,故先把它放在了一个int变量存储空间内,做水流量前三位,在定义一个长整型数,把它作为水流量后六位,这样计算起来也比较容易,数据也不会起冲突,也是为将要计算水价做准备。设定该水流量最大计数为250吨,超过了定值,则会从0开始。如图3-5所示:
图3-3 水流量数据处理流程图
3.3显示程序
在程序中只是计算出流量值,温度值以及和资源分配情况,一些字母显示,都要另加,这样才能尽善尽美表达出显示出来意思。所以在主程序中不必再测量温度。在第一页主要显示是总水流量后三位,最后以t结尾。第二页主要当前水流量前三位,最后以kg结尾。4. 总结
在为期两周实训中,我学到了很多,在整个过程中,包括最开始课题设计、焊接、程序编写,到最后调试我都参及其中。可以这么说,在这两个星期中学到东西比我两个月学到还要多。
在最开始设计课题时,查了很多资料,经过组员讨论,最终确定了现在这个方案。在焊接过程中,基本上没出什么问题,一切都很顺利进行着。在编写程序以及调试过程中出现了一些问题,比如:当有水流过时,传感器多计数脉冲达不到我们设计时要求,所以经过了多次修改,最终实现了功能。
在整个过程中要特别感谢丁文斌老师指导,没有他耐心指导,我们是不会做这么好。参考文献
[1] 张菁,基于单片机水流量控制系统方案研究。2007(9)。
[2] 楼然苗,51系列单片机设计实例. 北京航空航天大学出版社,2003。
[3] 苏铁力、关振海等.传感器及其接口技术[M].中国石化出版社,1998.
[4] 肖晴,液晶显示流量控制,2005(2)。
[5] 谭浩强,C程序设计(第二版). 清华大学出版社. 1999年12月第2版
附件1. 原理图
附件2 实物图
附件3 仿真图
附件4 元器件清单
元器件名称
型号
数量(个)
单片机
STC89C51
1
水流传感器探头
DS18B20
1
液晶显示器
LCD1602
1
晶振
11.0596MHZ
1
电阻
500欧
2
电阻
1K
1
电阻
4.7K
1
电阻
10K
1
瓷片电容
22pF
2
瓷片电容
0.1uF
2
电解电容
20uF
2
电解电容
100uF
1
发光二极管
红色
1
发光二极管
黄色
2
发光二极管
绿色
1
电源接口
5V
1
拨头开关
1
按键
3
总计
25
5. 程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^0; //ds18b20及单片机连接口
sbit RS=P1^1;
sbit RW=P1^2;
sbit EN=P1^3;
sbit p37=P3^6; //流量正常运行接口
sbit p36=P3^7; //温度报警接口
sbit p14=P1^4; //功能按键接口
sbit p15=P1^5;
sbit p16=P1^6;
uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20}; //0-9数字和显示无
unsigned long int a;
float f,zong;
uint tvalue;
uchar n1,n2,n3,n4,n5,n6,n7,n8,n9;
uchar tflag,d,g,kai,j,j1,j2,b;
/************************延时子程序**************************/
void delay (uint z)
{ int x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
/***************延时1us子程序**********************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
/***************液晶显示写指令*******************************/
void wr_com(unsigned char com) //写指令
{
delay(1); //延时1ms
RS=0; //写命令设置
RW=0; //并行数据读写
EN=0; //使能为0
P2=com; //输入命令
delay(1); //延时1ms
EN=1; //使能为1
delay(1); //延时1ms
EN=0; //使能为0
}
/************液晶显示写数据**************************/
void wr_dat(unsigned char dat)//写数据
{
delay(1); //延时1ms
RS=1; //写数据设置
RW=0; //并行数据读写
EN=0; //使能为0
P2=dat; //输入数据
delay(1); //延时1ms
EN=1; //使能为1
delay(1); //延时1ms
EN=0; //使能为0
}
/***********水流量计算程序及数据转换程序******************/
void loop ()
{
uint zong1;
if(g==0) //判断时间是否到
{
zong=(b/0.1)+zong; //得出总流量后三位
}
g=1; //将标志为为1
if(zong>=1000) //判断总流量后三位是否大于1000
{
a++; //总流量前六位加1
zong=0; //后三位清零
}
if(a>=1000000) //总流量前六位大于1百万
{
a=0; //总流量前六位清零
}
zong1=(int)zong ; //总流量后三位转换为整形
n9=a/100000; //总流量9位全部分配
n8=a%100000/10000;
n7=a%10000/1000;
n6=a%1000/100;
n5=a%100/10;
n4=a%10;
n3=zong1%1000/100;
n2=zong1%100/10;
n1=zong1%10;
}
/**********************流量程序*******************************/
void liuliang()
{
while(d>=2) //时间到?
{
d=0; //d清零
b=TH0*256+TL0; //读取频率
TH0=0x00; //计数器清零
TL0=0x00;
g=0; //时间标志位
}
loop(); //水流量计算程序及数据转换程序
}
/**************第一页显示子程序***************************/
void display1()
{
wr_dat(0x3a); //显示:
wr_com(0x80+0x40); //水流量(t)显示
wr_dat(0x46);
wr_dat(0x4c);
wr_dat(0x4f);
wr_dat(0x57);
wr_dat(0x3a);
wr_dat(0x20);
wr_dat(table[n9]);
wr_dat(table[n8]);
wr_dat(table[n7]);
wr_dat(0x2e); //显示小数点
wr_dat(table[n6]);
wr_dat(table[n5]);
wr_dat(table[n4]);
wr_dat(0x20); //显示小数点
wr_dat(0x74);
wr_dat(0x20);
}
/**************第二页显示子程序**********************/
void display2()
{
wr_dat(0x3a); //显示:
wr_dat(table[j2]);
wr_dat(0x2e);
wr_dat(table[j1]);
wr_dat(0x5c);
wr_dat(0x2f);
wr_dat(0x74);
wr_dat(0x20);
wr_com(0x80+0x40+5);//水流量(kg)显示
wr_dat(0x20);
wr_dat(0x20);
wr_dat(table[n4]);
wr_dat(0x2e); //显示小数点
wr_dat(table[n3]);
wr_dat(table[n2]);
wr_dat(table[n1]);
wr_dat(0x20);
wr_dat(0x6b);
wr_dat(0x67);
}
/*****************控制流量测量开关程序***********************/
void kaiguan1()
{
if(p14==0) //按键按下?
{delay(2);
if(p14==0)
{ delay(2);
p36=~p36; //P3.6取反
TR0=~TR0; //TR0取反
while(p14==0);//按键松开
}
}
}
/**************界面切换开关程序********************/
void kaiguan2()
{
if(p15==0) //按键按下?
{
delay(2);
if(p15==0)
{ delay(2);
kai=~kai; //P3.6取反
while(p15==0);//按键松开?
}
}
}
/**********************程序初始化******************************/
void lcd_init ()
{
TMOD=0x15; //设定定时器0为计数功能,定时器为1为定时功能
TH1=(65536-50000)/256;//定时器1赋出值50ms
TL1=(65536-50000)%256;
TH0=0x00; //定时器0赋初值0次
TL0=0x00;
EN=0; //液晶使能端为0
wr_com(0x38); //液晶初始设置
wr_com(0x0c);
wr_com(0x06);
wr_com(0x01);
wr_com(0x40);
wr_dat(0x06); //写CGRAM写字模
wr_dat(0x09);
wr_dat(0x09);
wr_dat(0x06);
wr_dat(0x00);
wr_dat(0x00);
wr_dat(0x00);
wr_dat(0x00);
zong=0; //总流量(带小数点)
EA=1; //开启总中断
ET1=1; //开启定时器1中断
TR1=1; //开启定时器1
TR0=0; //开启计数器0
p16=1; //p16为1
p15=1 ; //p15为1
p14=1; //p14为1
zong=0; //总流量后三位赋初值
a=0; //总流量前六位赋初值
j=20; //水价赋初值
j2=2; //水价个位赋初值
j1=0; //水价小数位赋初值
kai=0;
}
/********************主程序****************************/
void main()
{
lcd_init(); //初始化显示
while(1)
{
kaiguan1(); //控制水流量测量
kaiguan2(); //控制显示界面
liuliang(); //流量测量
if(kai==0) //判断界面开关是否按下
display1(); //显示第一页界面
else
{
//kaiguan3(); //判断水价开关是否按下
display2(); //显示第二页界面
}
} }
/******************定时器1中断**********************/
void time1() interrupt 3
{
TH1=(65536-50000)/256;//定时器1初值定时50ms
TL1=(65536-50000)%256;
d++; //20ms后d加1
}
44 / 44
展开阅读全文