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

📄 text1.c

📁 单片机开发
💻 C
📖 第 1 页 / 共 2 页
字号:

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P1^0;
sbit rw=P1^1;
sbit en=P1^2;
sbit DQ=P2^3;
sbit spk=P3^7;
sbit a0=ACC^0;
sbit a1=ACC^1;
sbit a2=ACC^2;
sbit a3=ACC^3;
sbit a4=ACC^4;
sbit a5=ACC^5;
sbit a6=ACC^6;
sbit a7=ACC^7;
sbit k1=P2^7;	//调整模式		
sbit k2=P2^6;	//+按钮
sbit k3=P2^5;	//-按钮
sbit k4=P2^4;
sbit clock_clk = P2 ^ 2;//ds1302_clk(时钟线)
sbit clock_dat = P2 ^ 1;//ds1302_dat(数据线)
sbit clock_Rst = P2 ^ 0;//ds1302_Rst(复位线)
uint  idata tdat;		//温度值变量
char idata sett;		//模式计数变量
char tflag;			//温度正负标志
char idata disp_buf1[16];//1602显示缓冲区1(即上排16个字符)
char idata disp_buf2[16];//1602显示缓冲区2(即下排16个字符)
char idata timedata[7];//存放时间值变量
uchar code table[]="Temperature ok !";
char idata temdata[5];	//存放温度值变量
uchar i;
uchar code self_dat[]={					
	
    0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,        //一,代码 0x04
    0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00,        //二,代码 0x05
    0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00,        //三,代码 0x06
    0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,         //四,代码 0x07
    0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00,        //五,代码 0x08
    0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00,        //六,代码 0x09
    0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00};        //日,代码 0x0a};//自定义字符
//*********************************************************//
//************LCD相关函数**********************************//
void delay(uint n)        //延时时间为n*1ms
{	uchar x=0;
	for(;n>0;n--)
	{
		for(;x<250;x++)
		{
			_nop_();
			_nop_();
			_nop_();
			_nop_();
		}
	}
}

void check_busy()	//LCD忙检测函数
{
	P0=0xff;
	rs=0;
	rw=1;
	en=1;
	while(P0&0x80);
	en=0;
}

void lcd_wcom(uchar com)     //写命令
{	check_busy();
	rw=0;
	rs=0;
	P0=com;
	en=1;
	en=0;
}

void lcd_wdat(uchar dat)    //写数据
{	check_busy();
	rw=0;
	rs=1;
	P0=dat;
	en=1;
	en=0;
}
void self_data()				//写入自定义字符
{
	uchar i=0;
	lcd_wcom(0x06);//设定地址指针加一
	lcd_wcom(0x48);//装入自定义字符的起始地址(CGRAM)
	for(;i<64;i++)		
		lcd_wdat(self_dat[i]);
}
void lcd_init()                     //初始化
{
	lcd_wcom(0x38);             //8位,双列,5*7
	lcd_wcom(0x0c);  	    //开显示,关光标,光标所在字符不闪烁
	lcd_wcom(0x06);		    //显示地址递增
	lcd_wcom(0x01);		    //清屏,光标移到左上角
	self_data();
}


//*********************************************//
//***********DS18B20相关函数*******************//
void delay_18b20(uint sum)
{
	while(sum--);
}

void rst_18b20()                 //复位
{	//uchar flag;
	DQ=1;
	delay_18b20(8);
	DQ=0;
	delay_18b20(80);
	DQ=1;
	delay_18b20(13);
	//flag=DQ;
	//return(flag);
//	delay_18b20(20);
}	


void wr_18b20(uchar dat)	//写一个字节的数据
{
	uchar i=8;
	for(;i>0;i--)
	{
		DQ=0;
		DQ=dat&0x01;
		delay_18b20(5);
		DQ=1;
		dat>>=1;
	}	
}

uchar rd_18b20()		//读一个字节的数据
{
	uchar dat=0,i=8;
	for(;i>0;i--)
	{
		DQ=0;
		dat>>=1;
		DQ=1;
		if(DQ)
		dat|=0x80;
		delay_18b20(4);
	}
	return(dat);
}
uint rd_temperature()		//读取温度值,返回值为uint型,占两个字节
{	
	uchar a=0,b=0;
	uint t=0;
	float tt=0;
	rst_18b20();		//复位
	wr_18b20(0xcc);		//跳过ROM
	wr_18b20(0x44);		//启动温度转换
	rst_18b20();		//再次对18B20操作时,需要重新复位一次
	wr_18b20(0xcc);		//跳过ROM
	wr_18b20(0xbe);		//读取内部RAM的内容
	a=rd_18b20();		//读温度值低位(内部RAM的第0个字节)
	b=rd_18b20();		//读温度值高位(内部RAM的第1个字节)
	t=b;
	t<<=8;				//温度值高位放在t的高8位
	t=t|a;				//温度值低位放在t的低8位
	if(t<0x0fff)		//判断温度值为正还是负
   		tflag=0;		//tflag=0温度值为正
    else
   {
		t=~t+1;			//温度值为负,负值以补码存放,这里要将其还原为原码
		tflag=1;		//tflag=1温度值为负
   }
	tt=t*0.0625;
	t= tt*10;			//放大10倍精确到一位小数
	return(t);
	
}
//***********************************************//

uchar disp_self(uchar i)         //判断自定义字符是第几个
{	
	
	switch(i)
	{
		case 1:i=1;break;
		case 2:i=2;break;
		case 3:i=3;break;
		case 4:i=4;break;
		case 5:i=5;break;
		case 6:i=6;break;
		case 7:i=7;break;
		default : break;
	}
	return(i);
}

void tem_conv()
			{		
				uchar flagdat ;//定义温度值符号
				if(tflag==0)
				temdata[4]=flagdat=0x20;//正温度不显示符号
				   else
				 temdata[4]=flagdat=0x2d;//负温度显示负号:-
				 temdata[0]=tdat/1000+0x30;//温度百位值
			     temdata[1]=tdat%1000/100+0x30;//温度十位值
			     temdata[2]=tdat%100/10+0x30;//温度个位值
			     temdata[3]=tdat%10+0x30;//温度小数位值
				if(temdata[0]==0x30)
				    {temdata[0]=0x20;//如果百位为0,不显示
				   		if(temdata[1]==0x30)
					    {
							temdata[1]=0x20;//如果百位为0,十位为0也不显示
					    }
				   	}
				
			  }
			

void beeper(uchar i) 	//蜂鸣器
{
	uchar j;
	for(j=i;j>0;j--)
	{	
		
		spk=0;
		delay(200);
		spk=~spk;
		delay(200);
		
	}
}
void int_display()  //初始显示
{
	uchar m=0;
	lcd_init();
	lcd_wcom(0x80);              //显示地址
	for(m=0;m<16;m++)
		{
			lcd_wdat(table[m]); //将数组中字符显示出来
			delay(1000);          
		}
		
		delay(10);	
		beeper(2);
		lcd_wcom(0x01);
		
}
//********************************************//
//********************************************//
void updata_disp()				//更新缓冲区数据程序
{
	disp_buf1[0]='2';
	disp_buf1[1]='0';
	disp_buf1[2]=timedata[6]/16+0x30;
	disp_buf1[3]=timedata[6]%16+0x30;
	disp_buf1[4]='/';
	disp_buf1[5]=timedata[4]/16+0x30;
	disp_buf1[6]=timedata[4]%16+0x30;
	disp_buf1[7]='/';
	disp_buf1[8]=timedata[3]/16+0x30;
	disp_buf1[9]=timedata[3]%16+0x30;
	disp_buf1[10]=0x20;
	disp_buf1[11]='[';
	disp_buf1[12]=disp_self(timedata[5]%16);
	disp_buf1[13]=']';
	disp_buf1[14]=0x20;
	disp_buf1[15]=0x20;
	
	disp_buf2[0]=timedata[2]/16+0x30;
	disp_buf2[1]=timedata[2]%16+0x30;
	disp_buf2[2]=':';
	disp_buf2[3]=timedata[1]/16+0x30;
	disp_buf2[4]=timedata[1]%16+0x30;
	disp_buf2[5]=':';
	disp_buf2[6]=timedata[0]/16+0x30;
	disp_buf2[7]=timedata[0]%16+0x30;
	disp_buf2[8]=temdata[4];
	disp_buf2[9]=temdata[0];
	disp_buf2[10]=temdata[1];
	disp_buf2[11]=temdata[2];
	disp_buf2[12]='.';
	disp_buf2[13]=temdata[3];
	disp_buf2[14]=0xdf;
	disp_buf2[15]='C';
}
void display()   //显示缓冲区数据函数
{
	uchar i;
	lcd_wcom(0x80);
	for(i=0;i<16;i++)
	lcd_wdat(disp_buf1[i]);
	lcd_wcom(0xc0);
	for(i=0;i<16;i++)
	lcd_wdat(disp_buf2[i]);
}
//**************DS1302相关子函数**************//
//DS1302写入字节(底层协议)
uchar clock_in(){
	clock_dat=1;
	a0=clock_dat;
	clock_clk=1; clock_clk=0; a1=clock_dat;
	clock_clk=1; clock_clk=0; a2=clock_dat;
	clock_clk=1; clock_clk=0; a3=clock_dat;
	clock_clk=1; clock_clk=0; a4=clock_dat;
	clock_clk=1; clock_clk=0; a5=clock_dat;
	clock_clk=1; clock_clk=0; a6=clock_dat;
	clock_clk=1; clock_clk=0; a7=clock_dat;
	return(ACC);
}

//1302驱动程序(底层协议)
void clock_out(uchar dd){
	ACC=dd;
	clock_dat=a0; clock_clk=1; clock_clk=0;
	clock_dat=a1; clock_clk=1; clock_clk=0;
	clock_dat=a2; clock_clk=1; clock_clk=0;
	clock_dat=a3; clock_clk=1; clock_clk=0;
	clock_dat=a4; clock_clk=1; clock_clk=0;
	clock_dat=a5; clock_clk=1; clock_clk=0;
	clock_dat=a6; clock_clk=1; clock_clk=0;
	clock_dat=a7; clock_clk=1; clock_clk=0;
}
//DS1302读数据(底层协议)
uchar read_clock(uchar ord){
	uchar dd=0;
	clock_clk=0;
	clock_Rst=0;
	clock_Rst=1;
	clock_out(ord);
	dd=clock_in();
	clock_Rst=0;
	clock_clk=1;
	return(dd);
}
//DS1302写数据(底层协议)
void write_clock(uchar ord, uchar dd){
	clock_clk=0;
	clock_Rst=0;
	clock_Rst=1;

⌨️ 快捷键说明

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