本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
#include <reg52.h>
#include <intrins.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit rs = P2^0; //
sbit rw = P2^1;
sbit ep = P2^2;
BYTE code dis1[] ={"."};
BYTE code dis2[] ;
unsigned char s1[]={"0123.5678"};
unsigned char s2[]= {"1234.6789"};
unsigned char s3[]={"00:00"};
int plush_nums=0; //实时的脉冲计数,
int n_ms=0; //经过的ms数,
int k=470;
int miao=0,fen=0;time=0;
float f=0; //频率
float inst_flow=0; //瞬时流量
float cumu_flow=0; //累积流量
int inst_flow1=0,inst_flow2=0; //瞬时流量的整数部分和小数部分
int cumu_flow1=0,cumu_flow2=0; //累积流量的整数部分和小数部分
float price=0.8; //水的单价
float cost; //费用
int cost1; //费用的整数部分
int cost2;
//费用的小数部分
void delay1ms(unsigned int i)
{
unsigned char j;
while(i--)
{
for(j=0;j<115;j++) //1ms基准延时程序
{
;
}
}
}
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
ep = 0;
return result;
}
lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //
delay1ms(1);
lcd_wcmd(0x0c); //
delay1ms(1);
lcd_wcmd(0x06); //
delay1ms(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay1ms(1);
}
void main(void)
{
BYTE i;
lcd_init(); // 初始化LCD
delay1ms(10);
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
f=0;
delay1ms(1);
EA=1; //中断使能, EA中断总开关。
IT1=1; //下降沿触发
EX1=1; //外部中断使能
ET0=1; //时钟0中断使能,用以计算1s内的脉冲数。
TMOD=0x01; //工作于方式1(十六位计数)
TH0=0xFC; //计数初值
TL0=0x66;
TR0=1; //TR0为T0运行控制位。
delay1ms(1);
while(1) //死循环语句,程序进入死循环等待中断。
{
cumu_flow1=(int)cumu_flow;
cumu_flow2=(cumu_flow-cumu_flow1)*1000;
s1[0]=cumu_flow1/1000 +0x30 ;
s1[1]=cumu_flow1%1000/100+0x30 ;
s1[2]=cumu_flow1%100/10 +0x30 ;
s1[3]=cumu_flow1%10 +0x30;
s1[5]=cumu_flow2/1000 +0x30 ;
s1[6]=cumu_flow2%1000/100+0x30 ;
s1[7]=cumu_flow2%100/10 +0x30 ;
s1[8]=cumu_flow2%10 +0x30;
lcd_pos(0); // 设置显示位置为第一行的第1个字符
for(i=0;i<9;i++)
{
lcd_wdat(s1[i]); // 显示字符" "
}
s3[0]=fen/10+0x30;
s3[1]=fen%10+0x30;
s3[3]=miao/10+0x30;
s3[4]=miao%10+0x30;
lcd_pos(0x0a); // 设置显示位置为第一行的第10个字符
for(i=0;i<5;i++)
{
lcd_wdat(s3[i]); // 显示字符" "
}
inst_flow1=(int)inst_flow;
inst_flow2=(inst_flow-inst_flow1)*1000;
s2[0]=inst_flow1/1000 +0x30 ;
s2[1]=inst_flow1%1000/100+0x30 ;
s2[2]=inst_flow1%100/10 +0x30 ;
s2[3]=inst_flow1%10 +0x30;
s2[5]=inst_flow2/1000 +0x30 ;
s2[6]=inst_flow2%1000/100+0x30 ;
s2[7]=inst_flow2%100/10 +0x30 ;
s2[8]=inst_flow2%10 +0x30;
lcd_pos(0x40); // 设置显示位置为第二行第二个字符
for(i=0;i<9;i++)
{
lcd_wdat(s2[i]); // 显示字符"
}
}
}
void GetFrequency(void) interrupt 1 //时钟0中断
{
TH0=0xFC;
TL0=0x66;
TR0=1;
n_ms++;
time++ ;
if(time==1000)
{
miao++;
time=0;
}
if(miao==60)
{ fen++ ;
miao=0;
}
if(n_ms==1000) //Nms==1000,即1s。
{
f=plush_nums;
inst_flow=f/k; //流量
cumu_flow=cumu_flow+inst_flow; //计算累积流量。
cost=cumu_flow*price; //计算费用。
n_ms=0;
plush_nums=0;
}
}
void GetPlush(void) interrupt 2 //外部中断1
{
plush_nums++;
} |