⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tmp_final.c

📁 温度读取和测量。18B20温度计和7219的显示
💻 C
字号:
#include<reg51.h>
#include<intrins.h>

sbit DQ=P1^3; //P1.3口接OUT
sbit T_CON=P1^4;//P1.4口接T_CON
sbit dis_DIN=P1^0; /*显示串行数据输入端*/ 
sbit dis_LOAD=P1^1; /*显示数据锁存端*/ 
sbit dis_CLK=P1^2; /*显示时钟输入端*/

unsigned int Temp;//温度
unsigned char temp_h,temp_l;/*温度值变量*/
unsigned char dispbuf[7]={0,0,0,0,0,0,0};

/*向MAX7219写入字节(8位)*/
void SendChar(unsigned char ch) 
{
unsigned char i,temp; 
_nop_(); 
for (i=0;i<8;i++) 
{
temp=ch&0x80; 
ch=ch<<1; 
  if(temp)
  {dis_DIN=1; dis_CLK=0; dis_CLK=1; } 
  else 
  {dis_DIN=0; dis_CLK=0; dis_CLK=1; } 
} 
}

/*7219显示程序*/
void WriteWord(unsigned char addr,unsigned char num) 
{ 
dis_LOAD=0; 
_nop_(); 
SendChar(addr); 
_nop_(); 
SendChar(num); 
_nop_(); 
dis_LOAD=1; 
}

void InitDis (void) 
{ 
WriteWord (0x0b,0x5); /*设置扫描界限*/ 
WriteWord (0x09,0xff); /*设置译码模式*/ 
WriteWord (0x0a,0x0a); /*设置亮度*/ 
WriteWord (0x0c,0x01); /*设置电源工作模式*/ 
} 

void delay(unsigned int count)
{
	unsigned int i;
	while(count)
	{
		i=200;
		while(i>0)i--;
		count--; 
	}
}

void Delay_us(unsigned char n)
{
	unsigned char i;
	i=0;
	while(i<n)
	{i++;}
	return;
}

void dsreset(void)
{
	unsigned int i;
	DQ=0;
	i=103;
	while(i>0)i--;
	DQ=1;
	i=4;
	while(i>0)i--;
}

unsigned char ReadByte(void){
	unsigned char i,k;
	i=8;
	k=0;
	while(i--)
	{	
		DQ=1;
		Delay_us(1);
		DQ=0;
		k=k>>1;
		DQ=1;
		_nop_();
		if(DQ)k |= 0x80;
		Delay_us(4);
	}
	return(k);
}

void tmpwrite(unsigned char dat)
{	unsigned int i;
	unsigned char j;
	bit testb;
	for(j=1;j<=8;j++)
	{	testb=dat&0x01;
		dat=dat>>1;
		if(testb)
		{	DQ=0;i++;i++;
			DQ=1;
			i=8;while(i>0)i--;
		}
		else
		{
			DQ=0;
			i=8;while(i>0)i--;
			DQ=1;i++;i++;
		}
	}
}

void tmpchange(void)			
{
	dsreset();						/*复位*/
	delay(1);
	tmpwrite(0xcc);					//跳过序列号命令
	tmpwrite(0x44);					//转换命令
}

void ReadWord(void)
{  	temp_l=ReadByte();				//低位在前
	temp_h=ReadByte();				//高位在后
	Temp=temp_h;
	Temp=Temp<<8;
	Temp |= temp_l;
   
}
void tmp(void)
{   long T;
	unsigned char i;
	dsreset();
	delay(1);
	tmpwrite(0xcc);
	tmpwrite(0xbe);
	ReadWord();
	if (Temp&0x8000)
	Temp=(~Temp+1);
	T=(long)Temp*625;
	
	for(i=6;i>0;i--)
	{dispbuf[i]=T%10;
	T=T/10;
	}
	dispbuf[2] |= 0x80;
	if (dispbuf[1]>=5)
	T_CON=0;
	else T_CON=1;
} 

void disp(void)
{unsigned char i;	
for(i=0;i<6;i++)
{WriteWord(i+1,dispbuf[i+1]);
}
}
/*主程序*/
void main()
{unsigned int T=0;
T_CON=0;
 while(1)
	{	
      tmpchange();
	   delay(10);
	   tmp();
	   InitDis();
	   disp();
	   Temp=0;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -