原本要写一篇DS18B20测温LCD1602显示的实验,应关注者的要求先写了一篇DS18B20测温与数码管显示的实验。DS18B20测温与数码管显示是通过51单片机读取DS18B20的温度值,然后实时的通过数码管显示当前温度值。
1.系统原理图(回复关键字DS18B20,自动获取原理图代码下载连接)
数码管采用的共阳极数码管,数据口段码接单片机的P0口,位选信号接的单片机的P2.0、P2.1、P2.2、P2.3。其中P2.0控制百位显示,P2.1控制十位显示,P2.2控制各位及小数点显示,P2.3为小数位显示控制端。共阳数码管与单片相连时单片机的灌电流极小,不能用来驱动数码管,需要接三极管放大电流来点亮数码管,三极管采用NPN型的接法如图所示。
2.系统主程序
void main()
{
float tmp=0.0;
int count = 0;
unsigned int temp=0;
P2=0X00;
dsInit();
while(1)
{
if(count >= 100)
{
sendChangeCmd();
tmp=getTmpValue();
temp=(unsigned int)(tmp*10.0);
count = 0;
}
LEDdisplay(temp);
count++;
}
}
3.数码管显示代码
/*******************************************************************************
* 函 数 名 :LEDdisplay
* 函数功能 :循环显示各个位上的数据
* 输 入 :num要显示的数据
* 输 出 :无
*******************************************************************************/
void LEDdisplay(unsigned int num)
{
unsigned char qian,bai,shi,ge;
qian=num/1000;
bai=num%1000/100;
shi=num%100/10;
ge=num%10;
wela_1 = 0; //关闭所有数码管
wela_2 = 0;
wela_3 = 0;
wela_4 = 0;
wela_3=1; //显示百位
LED_PORT=table[bai];
Delay_ms(1);
LED_PORT = 0xff;
wela_3=0;
wela_2=1; //显示十位
LED_PORT=table[shi];
xiaoshudian=0;
Delay_ms(1);
LED_PORT = 0xff;
wela_2=0;
wela_1=1; //显示个位
LED_PORT=table[ge];
Delay_ms(1);
LED_PORT = 0xff;
}
4.仿真运行视频见链接:DS18B20测温与数码管显示(回复关键字DS18B20,自动获取原理图代码下载连接)。