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

📄 temp.c

📁 18b20的c程序+串口通讯+595显示温度
💻 C
字号:
#include <reg52.h>
#include <iccard.h>
#include<stdio.h> 
//bit key_flag;
//uchar key_value;
#define uchar unsigned char
#define uint  unsigned int
#define nop() _nop_();_nop_();

uint16 temper;
uchar fuhao;
unsigned char tmp;

sbit key0=P1^0;
//sbit dat_1820=P2^4;
sbit CLK=P0^6;
sbit DAT=P0^4;
sbit DCLK=P0^7;
//sbit CS=P2^3;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9,-,全灭
void send_char(unsigned char txd);

//串口初始化
void initcom(void)
{
	TMOD = 0x20;			// 定时器1工作于8位自动重载模式, 用于产生波特率
	TH1 = 0x0F3;				// 波特率2400
	TL1 = 0x0F3;

	SCON = 0x50;			// 设定串行口工作方式  
	PCON &= 0xef;			// 波特率不倍增

        ES=1;      //允许串行口中断
	TR1 = 1;				// 启动定时器1
	IE = 0x00;				// 禁止任何中断
}

void send_char(unsigned char txd)
// 传送一个字符
{
	SBUF = txd;
	while(!TI);				// 等特数据传送
	TI = 0;					// 清除数据传送标志
}


void delay(uchar x)//系统延时
{
	while(x--);
}


void delayns()//延时
{
	uchar i;
	for(i=0;i<10;i++);
}
void delayms(uint32 x)//长延时
{
	uint32 i;
	for(;x>0;x--)
		for(i=5000;i>0;i--);
}
////--------------------------------------------------
//=====================================================
void sendbyte(uchar byte)
{    
        uchar num,i; 
        num=tab[byte];
        
   for(i=0;i<8;i++)
        {
         CLK=0;
         DAT=num&0x80;
         num=num<<1;
         
         CLK=1;
         }
//         RCLK=0;
//         nop();
//         nop();
//         RCLK=1;
         
}

void out595(void)
{
        DCLK=0;
       delay(29);
       // nop();
        DCLK=1;
}

void display(uchar number)
{
 uchar sw,gw;
 sw=number/10;
 gw=number-10*sw;
 sendbyte(gw);
 sendbyte(sw);
 out595();
}


/*****************LCD程序END****************/ 
 uchar init_1820()//初始化1820
{
	dat_1820=1;
	delay(8);
	dat_1820=0;
	delay(80);
	dat_1820=1;
	delay(14);
	if(dat_1820==0)
	{
		delay(20);
		return(1);
	}
	else return(2);
	dat_1820=1;
	delay(20);

}

void wr_1820(uchar x)//写入1字节数据
{
	uchar i;
	for(i=8;i>0;i--)
	{
		dat_1820=1;
		delay(1);
		dat_1820=0;
		delay(1);
		if(x&0x01)dat_1820=1;
		else dat_1820=0;
		delay(20);

		dat_1820=1;
//		delay(1);
		x>>=1;
	}
	
}

void rd_1820()//读1字节数据
{
	uint16 i;
	uchar j;
	i=0;
	for(j=16;j>0;j--)
	{
		dat_1820=1;
		delay(1);
		dat_1820=0;
		delay(1);
		dat_1820=1;
		if(dat_1820)
		{
			i>>=1;
			i=i|0x8000;	
		}
		else i>>=1;
		delay(20);
		dat_1820=1;

	}
	temper=i;
}


void get_temper()//进行温度测量并取温度数据
{
	uchar i;
	i=init_1820();//
	if(i==1)//判断1820是否存在
	{
		wr_1820(0xcc);//跳过rom
		wr_1820(0x44);//发送温度转换指令
		delayms(3);
		init_1820();
		wr_1820(0xcc);//跳过rom
		wr_1820(0xbe);//去温度数据
		rd_1820();//读出数据
	}

}

void init_sys()//系统初始化设置 
{
//	P0=0;//P0口清零 
	P2=0x86;//屏蔽其它模块
	P1=P1&0X01;;//
}


void main()
{  uchar t;
  uchar sw,gw,k;

    initcom();
	init_sys();

	       
	while(1)
	{//display(11);
		get_temper();
	if(!key0)
		{
		  delayms(5);
		  if(!key0)
		  {
		  t=temper/16; 
		  //k=(t&0xf0)*16+(t&0x0f);
		  k=(temper)/16;
		  /*{
		  if(k>=16)
		  {k+=16;}
		  if(k>=32)
		  {k+=32;}
		  if(k>=48)
		  {k+=48;}
		  if(k>=64)
		  {k+=64;}
		  }*/
		  sw=k/10;
		  gw=k%10;
		  send_char(t);
       display(k);
		  }
		}
	 
	/* if(RI)
	 {RI=0;
	  tmp=SBUF;
	 if(tmp==0x01)
     { get_temper();
	    delay(5);
		t=temper/16;
        send_char(t);
     }

	 }*/
	 else	delayms(5);
	}
}

⌨️ 快捷键说明

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