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

📄 com.c

📁 18b20的c程序+串口通讯+595显示温度
💻 C
字号:
/*******************************************************************************
********************************************************************************
*  描述:                                                                       *
*         单片机接收主机的数据,然后将数据传送到P0口, 并传回给主机;             *
*         当按下K1时, 单片机发送字串"welcome! www.willar.com\n\r" 给主机       * 
*                                                                              *
* 
*******************************************************************************/   

#include <reg51.h>
#include <intrins.h>
#include <iccard.h>
unsigned char key_s, key_v, tmp;

char code str[] = "I am a good boy!!! \n";

#define uint unsigned int
#define uchar unsigned char
#define nop() _nop_();_nop_();

sbit key0=P1^0;
uint16 temper;
sbit CLK=P0^6;
sbit DAT=P0^4;
sbit RCLK=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_str();
bit	scan_key();
void key_pro();
void delayms(unsigned char ms);
void send_char(unsigned char txd);

sbit	K1 = P1^0;
void delay(uint j)//延时
{ uchar m;
for(;j>0;j--)
{
for(m=0;m<=60;m++)
 {;}
}
}
//=====================================================
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)
{
        RCLK=1;
        nop();
        RCLK=0;
}

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

//=====================================================================
//=====================================================
//串口初始化
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 send_str()
// 传送字串
{
	unsigned char i = 0;
	while(str[i] != '\0')
	{
		SBUF = str[i];
		while(!TI);				// 等特数据传送
		TI = 0;					// 清除数据传送标志
		i++;					// 下一个字符
	}	
}

void delayms(unsigned char ms)	
// 延时子程序
{						
	unsigned char i;
	while(ms--)
	{
		for(i = 0; i < 120; i++);
	}
}



bit scan_key()	
// 扫描按键
{
	key_s = 0x00;
	key_s |= K1;
	return(key_s ^ key_v);	
}
void key_pro()
{
 if ((key_v&0x01)==0)
{ send_str();}

}


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;
  uint sw,gw,k;

    initcom();
	init_sys();


	       
	while(1)
	{
		get_temper();
		if(!key0)
		{
		  delayms(5);
		  if(!key0)
		  {
		  t=temper/16; 
		  k=(temper*10/100);
		  sw=k/10;
		  gw=k%10;
		  send_char(t);
		  
		  WriData(sw+0x30);WriData(gw+0x30);
		  }
		}
	 	delayms(5);
	}
}

⌨️ 快捷键说明

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