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

📄 ledls.c

📁 单片机应用
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char   //8位

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ; 

sbit rs	= P2^0;		//寄存器选择
sbit rw = P2^1;     //读写控制
sbit ep = P2^2;     //使能端,由高电平跳变到低电平时,液晶执行命令
sbit right = P2^6;
BYTE dis1[];    //unsigned char code 放一些固定的数据,一般查表用,这样可以少占用ram
BYTE code dis2[] = {"0x0179"};

BYTE k,n;

sbit TMDAT = P3^3; //根据实实际情况设定,对应1820的DQ引脚
uchar TMP;  //读取后温度值存于TMP中,将其除以2即可得出实际温度;
uchar f;  //结果是否为负温,“0”为正温,“1”为负温。  

////////////////////////////////////////延时部分//////////////////////////
void dmsec (unsigned int count)       //
{         //
 unsigned int i;              // 
 while (count)       //
 {        //
  i = 115;      //
  while (i>0) i--;     //
  count--;      //
    }         //
}         //
//////////////////////////////////////////////////////////////////////////

 

/////////////////////////////////////// 发送复位//////////////////////////
void tmreset (void)       //    初始化1820
{                          //
 unsigned int i;       //
 TMDAT = 0;       //
 i = 103;       //
 while (i>0) i--;          // 将信号线置为低电平,延时 900 uS(11.0592Mhz时) //
 TMDAT = 1;       //
 i = 4;        //       将信号线置为高电平,延时 35 uS
 while (i>0) i--;      //
}         //
//////////////////////////////////////////////////////////////////////////

 

//判断DS1820是否存在的子程序。最好不要用,因为当器件不存在时将会进入死循环

////////////////////////////////////// 等待存在脉冲///////////////////////
void tmpre (void)   //判断器件是否存在  //
{                            //
 unsigned int i;       //
 while (TMDAT);       //
 while (~TMDAT);       //
 i = 4; while (i>0) i--;      //
}         //
//////////////////////////////////////////////////////////////////////////


///////////////////////////////////// 读一位//////////////////////////////
bit tmrbit (void)       //
{                          //  
 unsigned int i;       //
 bit dat;       //
 TMDAT = 0; i++;       //
 TMDAT = 1; i++; i++;  //微量延时   //
 dat = TMDAT;       //
 i = 8; while (i>0) i--;  // 延时    //
 return (dat);       //
}         //
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////// 读一个字节///////////////////////
unsigned char tmrbyte (void)        //
{                 //
 unsigned char i,j,dat;      //
 dat = 0;       //
 for (i=1;i<=8;i++)      //
 {        //
  j = tmrbit ();      //
  dat = (j << 7) | (dat >> 1);    //
 }        //
 return (dat);       //
}         //
//////////////////////////////////////////////////////////////////////////


/////////////////////////////////////// 写一个字节////////////////////////
void tmwbyte (unsigned char dat)     //
{                       //
 unsigned int i;       //
 unsigned char j;      //
 bit testb;       //
 for (j=1;j<=8;j++)      //
 {        //
  testb = dat & 0x01;     //  检测最低位是1还是0
  dat = dat >> 1;      //   并转串,共8位
  if (testb)      //    如果是1
  {       //
   TMDAT = 0;                           // 写0  //
   i++; i++;                              //
   TMDAT = 1;     //
   i = 8; while (i>0) i--;                //
  }       //
  else       //
  {       //
   TMDAT = 0;                           // 写0  //
   i = 8; while (i>0) i--;                //
   TMDAT = 1;     //
   i++; i++;                              //
  }       //
 }        //
}         //
//////////////////////////////////////////////////////////////////////////

/////////////////////////////////发送ds1820 开始转换//////////////////////
void tmstart (void)       //
{                          //
 tmreset ();  //复位     //
 //tmpre ();  //等待存在脉冲    //
 dmsec (1);  //延时     //
 tmwbyte (0xcc);  //跳过序列号命令   //
 tmwbyte (0x44);  //发转换命令 44H,   //
}         //
//////////////////////////////////////////////////////////////////////////


/////////////////////////////////// 读取温度//////////////////////////////
void tmrtemp (void)       //
{                          //
 unsigned char a,b;      //
 tmreset ();  //复位     //
 //tmpre ();  //等待存在脉冲    //
 dmsec (1);  //延时     //
 tmwbyte (0xcc);  //跳过序列号命令   //
 tmwbyte (0xbe);  //发送读取命令     //
 a = tmrbyte ();  //读取低位温度    //
 b = tmrbyte ();   //读取高位温度    //
 f=b;   //若b为1则为负温   //
 if(f)        //
 {        //
  TMP=~a+1; //如果为负温则去除其补码  //
 }        //
 else        //
 {        //
  TMP=a;       //
 }        //
}         //
//////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////



delay(BYTE ms)
{							// 延时子程序
	BYTE k;
	while(ms--)
	{
		for(k = 0; k< 250; k++)
		{
			_nop_();   //NOP不执行任何操作,但占用一个字节存储单元,空耗一个指令执行周期
			_nop_();
			_nop_();
			_nop_();
		}
	}
}

BOOL lcd_bz()
{							// 测试LCD忙碌状态
	BOOL result;
	rs = 0;
	rw = 1;
	ep = 1;                 //读数据口状态字
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	result = (BOOL)(P0 & 0x80);   //D7为0才能进行读写操作
	ep = 0;
	return result;	
}

lcd_wcmd(BYTE cmd)
{							// 写入指令数据到LCD
	while(lcd_bz());
	rs = 0;
	rw = 0;
	ep = 0;
	_nop_();
	_nop_();	
	P0 = cmd;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 1;            //////
	_nop_();
	_nop_();
	_nop_();          //高变低,液晶模块执行命令
	_nop_();
	ep = 0;		      //////
}

lcd_pos(BYTE pos)
{							//设定显示位置
	lcd_wcmd(pos | 0x80);
}

lcd_wdat(BYTE dat)	
{							//写入字符显示数据到LCD
	while(lcd_bz());
	rs = 1;
	rw = 0;
	ep = 0;
	P0 = dat;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 0;	
}

lcd_init()
{							//LCD初始化设定
	lcd_wcmd(0x38);			//显示模式设定 00111000(0x38),设置16*2显示,5*7点阵,8位数据接口
	delay(1);
	lcd_wcmd(0x0c);			//显示开关及光标位置 0000 1100(0x0c),开显示,不显示光标
	delay(1);
	lcd_wcmd(0x06);			// 0000 0110(0x06),当读写一个字符后,地址指针加1,且光标加1
	delay(1);
	lcd_wcmd(0x01);			//清除LCD的显示内容
	delay(1);
}




//////////////////////////////////////////////////////////////////////////
main()         //
{         //
 do{        //
  tmstart();      //
  dmsec(1000); //如果是不断地读取的话可以不延时 //
  tmrtemp(); //读取温度,执行完毕温度将存于TMP中 //
  //P0=TMP;
 //right=0;
	lcd_init();				// 初始化LCD			
	delay(10);
//    dis1=TMP;
    for (n=1;n<=8;n++)      //
    {        //
     dis1[n] = TMP & 0x01;     //  
     TMP = TMP >> 1;    
    } 
	lcd_pos(4);				// 设置显示位置为第一行的第5个字符
	k = 0;
//	while(dis1[k] != '\0')  // 显示第一句话 "hificat.com"
    for (k=1;k<=8;k++)
	{						// 显示字符
		lcd_wdat(dis1[k]);
		k++;

    }

lcd_pos(0x41);			// 设置显示位置为第二行第二个字符
	k = 0;
	while(dis2[k] != '\0')  // 显示第二句话 "0571-85956028"
	{
		lcd_wdat(dis2[k]);	// 显示字符
		k++;
	}
   
	
 }while(1);       //
}         //
//////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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