大家好,又见面了,我是你们的朋友全栈君
(2)这是我的开发板数码管的电路,提供参考。
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
sbit we = P2^7; //位定义数码管位选锁存器接口
sbit du = P2^6; //位定义数码管位选锁存器接口
float frency,Q,F,num;//Q为流量,单位L/min;F为频率,单位HZ
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义
};
//数码管带小数点显示
uchar code leddatapoint[]={
0xBF, //"0"
0x86, //"1"
0xDB, //"2"
0xCF, //"3"
0xE6, //"4"
0xED, //"5"
0xFD, //"6"
0x87, //"7"
0xFF, //"8"
0xEF, //"9"
0x00, //熄灭
0x00 //自定义
};
//毫秒级延时函数
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
//四位数码管动态显示函数
void display(float i)
{
uchar shi, ge,fen,shifen;
float x,y;
shi = i / 10; //显示十位
ge = (int)i % 10;//显示个位
x=i*10;
y=i*100;
fen = (int)x%10;//分位
shifen = (int)y%10;//十分位
P0 = 0xff;//清除断码
we = 1; //打开位选
P0 = 0xef;//1110 1111
we = 0; //关闭位选
du = 1;//打开段选
P0 = leddata[shi];
du = 0; //关闭段选
delay(5);//延时5毫秒
P0 = 0xff;//清除断码
we = 1; //打开位选
P0 = 0xdf;//1101 1111
we = 0; //关闭位选
du = 1;//打开段选
P0 = leddatapoint[ge];
du = 0; //关闭段选
delay(5);//延时5毫秒
P0 = 0xff; //清除断码
we = 1;//打开位选
P0 = 0xbf;//1011 1111
we = 0; //关闭位选
du = 1; //打开段选
P0 = leddata[fen];
du = 0; //关闭段选
delay(5);//延时5毫秒
P0 = 0xff; //清除断码
we = 1;//打开位选
P0 = 0x7f;//0111 1111
we = 0; //关闭位选
du = 1; //打开段选
P0 = leddata[shifen];
du = 0; //关闭段选
delay(5);//延时5毫秒
}
uint read()//得到计数器0当前脉冲次数函数
{
uint tl,th1,th2;//读两次高位,两次高位一样说明没有低位进位,读数更加精确。
uint val;
while(1)
{
th1=TH0;
tl=TL0;
th2=TH0;
if(th1==th2)
break;
}
val=th1*256+tl;
return val;
}
void main()
{
TMOD=0x15;//定时器计数器工作方式配置
TH0=0;
TL0=0;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;//开总中断
ET0=1;//中断允许
ET1=1;
TR0=1;//运行控制位
TR1=1;
while(1)
{
display(Q);
}
}
void T0_time()interrupt 1
{
TH0=0;
TL0=0;
}
void T1_time()interrupt 3
{
TH1=(65536-45872)/256;//50毫秒
TL1=(65536-45872)%256;
num++;
if(num==20) //1s更新一次数据,送至数码管显示
{
num=0;
F=read();//每隔1s读一次计数器0,该值则为频率。计算出Q后立马把计数器0清零重新计数。
if(F>0)
{
Q=(F+3)/8.1;//流量传感器经验公式
TH0=0;
TL0=0;
}
else
{
Q=0;//如果不加这句,当F=0,由公式知道Q!=0。
TH0=0;
TL0=0;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187862.html原文链接:https://javaforall.cn
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有