关于蓝桥杯ds18b20在数码管上显示

最近这两天一直在研究一个问题,就是将ds18b20这个温度芯片实时的传送到数码管上,这个与我之前写的有点差别。以前的方法笨是笨了一点,但好在可以直接显示,没有一点毛病让你挑剔,但这次的就有点不一样。废了好大的劲与同学才搞出来。不多说,先上源码。
#include<reg51.h>
#include<stdio.h>
#include<math.h>
//#include"onewire.c"
//#include"onewire.h"
#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe

//IC引脚定义
sbit DQ = P1^4;

//函数声明
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
bit Init_DS18B20(void);
unsigned char Read_DS18B20(void);
code unsigned char tab[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xc6};//0~9 灭 横杠
unsigned char dspbuft[]={10,10,10,10,10,10,10,12};
//unsigned char dspcom=0;
//单总线延时函数
void Delay_OneWire(unsigned int t)
{
	char z;
  while(t--)
  for(z=0;z<6;z++);
}

//DS18B20芯片初始化
bit Init_DS18B20(void)
{
	bit initflag = 0;
	DQ = 1;
	Delay_OneWire(12);
	DQ = 0;
	Delay_OneWire(80); 
	DQ = 1;
	Delay_OneWire(10); 
	initflag = DQ;    
	Delay_OneWire(5);
  
	return initflag;
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}


int read()
{	
	unsigned char low,high;
	int temp;
	Init_DS18B20();
	Write_DS18B20(OW_SKIP_ROM);
	Write_DS18B20(DS18B20_CONVERT);
	Delay_OneWire(200);
	
	Init_DS18B20();
	Write_DS18B20(OW_SKIP_ROM);
	Write_DS18B20(DS18B20_READ);
	
	low=Read_DS18B20();
	high=Read_DS18B20();
	
	temp=(high&0x0f)<<8|low;
	temp=temp*0.0625*10+0.5;
	return temp;
}

void Delay5ms()		//@12.000MHz
{
	unsigned char a,b;
	for(a=19;a>0;a--)
		for(b=130;b>0;b--);
}

void display(int date)
{	
	unsigned char dspcom;
	dspbuft[4]=date/100;
	dspbuft[5]=date%100/10;
	dspbuft[6]=date%10;
	for(dspcom=4;dspcom<8;dspcom++)
	{
		P0=0xff;
		P2=(P2&0x1f)|0xe0;
		if(dspcom==5)P0=(tab[dspbuft[dspcom]]&0x7f);
		else P0=tab[dspbuft[dspcom]];
		P2&=0x1f;
		
		P0=0x00;
		P2=(P2&0x1f)|0xc0;
		P0=1<<dspcom;
		P2&=0x1f;
		Delay5ms();
		if(dspcom==7)
		{
			P2=(P2&0x1f)|0xc0;
			P0=0;
			P2&=0x1f;
		}
		
	}
	

}
void NO_buzzrelay()
{
	P2&=0x1f;	
	P2|=0xa0;	
	P0&=0xaf;	
	P2&=0x1f;		
}

void main()
{
	NO_buzzrelay();
	while(1)
	{
		display(read());
	}
}

这次的这个就是将温度先放进一个教全局变量的缓冲区,然后在通过自己写的显示函数,显示在数码管上。为了保险起见,我还是稍微加一个关闭蜂鸣器的函数。延时五毫秒是我自己通过软件生成的。这样显示出来比较稳定,我以前写的程序效果不是太暗就是会不停地闪动,这让我很苦恼,原来结果是函数在调用的过程中耗费的时间太长,所以就用一个for循环作为弥补,每次显示就是将后四位一次性的全部显示出来,避免在函数调用过程中耗时太长的问题。



附:由于暂时还没有学会调用函数,所以我就先将给的底层驱动直接粘贴上来,一个叫read()函数是ds18b20这个芯片的协议,是我自己写出来的。就先到这儿吧!

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DS18B20是一种数字温度传感器,Verilog是一种硬件描述语言,而数码管是一种用于数字显示的装置。 要使用Verilog来实现DS18B20数码管显示,首先需要通过FPGA或其他逻辑电路将DS18B20与Verilog代码进行连接。然后,可以按照以下步骤来实现数码管显示: 1. 首先,需要在Verilog代码中定义一个寄存器来存储从DS18B20读取到的温度数据。 2. 接下来,可以编一个数据处理模块,来处理从DS18B20读取到的温度数据。这个模块需要对温度数据进行格式化,并将其转换为数码管可以显示的格式。 3. 在Verilog代码中,可以使用一个显示模块,来控制数码管显示。这个模块可以根据温度数据的格式化结果,逐个驱动数码管的段选择和段使能信号,从而实现数码管显示。 4. 最后,需要在主控制模块中,将以上几个模块进行实例化,并按照需要的时序来控制数据的读取和显示操作。 需要注意的是,实现DS18B20数码管显示,除了Verilog代码的编之外,还需要一些硬件电路的支持。例如,需要使用定时器来控制数据的读取频率,或者使用数码管驱动芯片来驱动实际的数码管。因此,在完成Verilog代码的编之后,还需要将代码烧录到FPGA或其他逻辑电路中,并进行仿真和调试,以确保代码的正确性和可靠性。 综上所述,实现DS18B20数码管显示需要通过Verilog代码来实现数据的读取和显示控制,并配合其他硬件电路来完成。通过合理的设计和调试,可以实现准确和稳定的温度显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值