《单片机实践项目》之《电子DIY》之基于51单片机温度(MAX6675)采集系统设计

程序

//视频教程:B站搜索:“逗比小憨憨”
#include 
#include "intrins.h"			//_nop_();延时函数用

#define uchar unsigned char
#define uint  unsigned int

sbit  SO  = P1^7;  				//P3.6口与SO相连
sbit  SCK = P1^6; 				//P3.4口与SCK相连
sbit  CS  = P1^5;  				//P3.5口与CS相连

sbit wx = P2^7;
sbit dx = P2^6;

#define uchar unsigned char
#define uint  unsigned int
const uchar DevID = 1;		//本机设备ID

uchar buffer;			//串口接收缓冲区
uchar rcv_buffer[20];
uchar send_buffer[20];
uchar flag_ok = 0;		//接收完毕的标识
uint MAX6675_Temp;
uchar Flag_connect;
uchar CRCH,CRCL;
uchar wd[2];	  		//wd[]:BCD码的温度
uchar flag_dis;			//显示刷新的标识

uchar dis[4] = { 0x00, 0x00, 0x00,0x00 };
uchar code SMG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uint MAX6675_ReadReg(void)
{ 
	uchar i;   
	uint dat;	 
	i   = 0;   
	dat = 0;   	
	CS  = 0; 
	SCK = 0;     
	for(i=0; i<16; i++)		//get D15-D0 from 6675  
	{      
		SCK = 1;     
		dat = dat<<1;    
		if( SO==1 )   
			dat = dat|0x01; //0000 0001  
		SCK = 0;    
	} 
	CS = 1;   
	  
	return dat;   
}  
/*
* 功  能:延时,若干毫秒
* 参  数:毫秒数
* 返回值:无
*/
void DelayMs(uint i)	//一个延时函数,这个函数在11.0592M晶振下的延时时间大概为1ms
{
	uint j,k;

	for(j=i; j>0; j--)
		for(k=118; k>0; k--);
}
/*
* 功  能:数码管在指定的位置显示指定的字符
* 参  数:place:要显示的位置,num:要显示的字符
* 返回值:无
*/
void SMG_DisChar(uchar place, uchar num)
{
	P0=0X00;
	dx = 1;
	P0 = SMG[num];	 	//发送要显示的段码
	dx = 0;
	
	P0=0XFF;
	wx = 1;
	P0 = place;		   			//发送要显示的位码,只显示一位数字
	wx = 0;

	DelayMs(1);	
}
 
void Display(uint temp)
{
	if(Flag_connect==0)		  	//Flag_connect为0 表示热电偶已连接,这时显示温度
	{
		if(temp > 999)
		{
			SMG_DisChar(0XFE,temp/1000);
		}
		if(temp > 99)
		{
			SMG_DisChar(0XFD,(temp%1000)/100);
		}
		if(temp > 9)
		{
			SMG_DisChar(0XFB,(temp/10)%10);
		}
		SMG_DisChar(0XF7,temp%10);
	}
	else						//Flag_connect为1表示 热电偶未连接,这时显示FFFF
	{
		SMG_DisChar(3, 0x0F);
		SMG_DisChar(2, 0x0F);
		SMG_DisChar(1, 0x0F);
		SMG_DisChar(0, 0x0F);
		
	}
}

void main(void)
{
	uchar cnt = 11;
	uint t;

	while(1)
	{
		t=MAX6675_ReadReg();
						   //0000 0100
  		Flag_connect=t&0x04;		 	//读出数据的D2位是热电偶掉线标志位,该位为1表示掉线,该位为0表示连接
  		Flag_connect=Flag_connect>>2; 	//MAX6675是否在线

		t = t<<1;//D15-D4  D3-D0					   	//读出来的数据的D3~D14是温度值
		t = t>>4;
		MAX6675_Temp = t/4;				//测得的温度单位是0.25,所以要乘以0.25(即除以4)才能得到以度为单位的温度值
		
		for(t=0; t<200; t++)			//显示温度
		{  
			Display(MAX6675_Temp);
		}

	}
}

你可能感兴趣的:(电子DIY,MAX6675,热电偶,51单片机实践,Proteus仿真,温度采集)