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

📄 18bb20.c

📁 刚通过的1820温度显示程序
💻 C
📖 第 1 页 / 共 3 页
字号:

#include "reg51.h"
#include "intrins.h"

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

//液晶显示功能引脚定义					
sbit A0 = P3^0;//数据1/命令0选择
sbit _WR = P3^7;//读写					
sbit E1 = P3^4;	//片选1(Master)					
sbit E2 = P3^3;//片选2(slave)                 
#define lcd_data P2//数据

//液晶显示常用操作宏定义
#define set_E1() (E1=1)          //1片选M
#define set_E2() (E2=1)          //1片选S
#define set_A0() (A0=1)          //1数据    
#define set_WR() (_WR=1)         //1读

#define clr_E1() (E1=0)          //0
#define clr_E2() (E2=0)          //0
#define clr_A0() (A0=0)          //0命令
#define clr_WR() (_WR=0)         //0写

//液晶显示控制命令表
#define disp_off			0xAE		//显示关闭
#define disp_on 			0xAF		//显示打开
#define disp_start_line  	0xC0		//显示起始地址(后5位-表示0-31行)
#define page_addr_set		0xB8		//页地址设置(0~3)
#define col_addr_set		0x00		//列地址设置(0~61)
#define status_busy			0x80		//0=ready
#define mode_write          0xEE        //写模式
#define dynamic_driver      0xA4        //动态驱动 
#define adc_select			0xA0		//clockwise
#define clk32 	            0xA9		//刷新时钟设置1/32
#define clk16 	            0xA8		//刷新时钟设置1/16
#define reset    			0xE2		//软件复位

//温度显示功能引脚定义
bit flag;//温度标记;1为负温度;0为正温度
sbit DQ = P1^1;
//液晶显示缓存区定义
uchar dot_buffer[32];					//点阵缓存区
uchar disp_buffer[8];   				//ram数据显示缓存区

///////////////////////////////////////////////
//液晶显示的函数
//////////////////////////////////////////////
void lcd_init(void);					//LCD初始化
void lcd_clr(void);                     //LCD清屏
void wait_ready(void);					//等待ready

//点阵码显示输出(用于图片输出);参数为:起始行,起始列,宽度,表格table名称;
void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp); 

//单个ascci码输出(ascii_code为ascii编码)  
////参数为:起始行;起始层:0为下面1为上面;直接给ASCII码如"A";显示模式0正常1反白;                        
void disp_one_ascii(uchar col,uchar layer,uchar ascii_code,uchar mode);

//ram数据(数字)显示输出输出disp_buffer里面的数组; 
//参数为:起始行;起始层:0为下面1为上面;显示个数;显示模式0正常1反白;                                                     
void disp_ram_data(uchar col,uchar layer,uchar n,uchar mode); 
   
//通用混合字串显示 
//参数为:起始行;起始层:0为下面1为上面;要显示的内容如"太川";显示模式0正常1反白;                         
void dprintf(uchar col,uchar layer,uchar *buf,uchar mode);  
   
//////////////////////////////////////////////////////////
//温度测量的函数
/////////////////////////////////////////////////////////
void write_byte(uchar val);  //向DS18B20写入1个字节 
uchar read_byte(void);        //从18b20读一个字节.返回读到的内容
dreset();                //初始化18B20
get_temperature(void);//读取温度子程序并对值保存
///////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////

void delay(uint x)   ////when crystal is 12M ,a*2+5 us  ,子程序调用要5us,while 就等于DJNZ指令
{ 
while (x--);
}
//////////////////////
void write_byte(uchar val)  //向DS18B20写入1个字节 
{
    uchar i;
    for(i=0;i<8;i++)
    {
        DQ=0;
        _nop_();                      //要求>1us,但又不能超过15us
        _nop_();
        if(0x01&val)
             DQ=1;
        delay(20);                  //要求总时间在60-120us
        DQ=1;                  //释放总线
        _nop_();_nop_();                    //要求>1us      
        val=val>>1;
    }  
}
////////////////////
uchar read_byte(void)        //从18b20读一个字节.返回读到的内容
{
    uchar i,j;
    j=0;                              
    for(i=0;i<8;i++)
     {DQ=1;
      DQ=0;  
		j=j>>1;
        
                             //要求>1us,但又不能超过15us
        DQ=1;                  //释放总线
        _nop_();
        _nop_();
        if(DQ)
        j|=0x80;
        delay(30); 
     }
	    return  (j);
 }
 ///////////////////
dreset()                //初始化18B20 
{ 
    bit presence=0;      //定义一个应答信号     
    DQ=1; 
 	 DQ=0;
     delay(80);                 //置总线为低电平并保持至少480us       
    DQ=1;                //等电阻拉高总线并保持15-60us 
   delay(5);     
    presence=DQ;              //接受应答信号 
   delay(13);  //延时60-240us  
   DQ=1;   
	//if (presence) dprintf(0,1,"NO",0);
	  // else dprintf(0,1,"OK!",0);//返回应答信号 
}
//////////////////



/* 读取温度子程序       */
 get_temperature(void)
{
    uchar msb=0;//高8位
    uchar lsb=0;//低8位
    dreset();         /* 发送复位信号     */
    delay(30);
    write_byte(0xcc);          /* 跳过ROM          */
    write_byte(0x44);         /* 发送转换温度命令 */
	 dreset();
    delay(30);
    write_byte(0xcc);
    write_byte(0xBE);         /* 发送读memory命令 */
    lsb =read_byte();
    msb =read_byte();
    dreset();
	 delay(10000);
	if(msb&0xf8)  {  flag=1;msb=~msb; lsb=~lsb+1;  }    //如果为负温度取反加1		   		   			
	else  flag=0; 	
			
	msb=(msb<<4)|(lsb>>4);
	if (flag)      disp_buffer[0]=253;                //负温度指示标号根据自己表格位置修改
	if (msb/100)   disp_buffer[0]=msb/100;            //百位数
   else           disp_buffer[0]=251;               //正温度指示标号根据自己表格位置修改
	disp_buffer[1]=msb%100/10;                       //十位数
	disp_buffer[2]=msb%10;                          //个位数
	disp_buffer[3]=254;                              //小数点指示标号根据自己表格位置修改
	disp_buffer[4]=(lsb&0x0f)*625/1000;            //小数点第一位
   //disp_buffer[5]=(lsb&0x0f)*625%1000/100;        //小数点第二位
	//disp_buffer[6]=(lsb&0x0f)*625%100/10;          //小数点第三位
	//disp_buffer[7]=(lsb&0x0f)*625%10;            //小数点第四位


}

///////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
unsigned char code top[] =                  // 数据表图片上半部分
{
      0x00,0x00,0x00,0x60,0x70,0xF0,0xF8,0xF8,
      0xF8,0x40,0xFC,0x44,0x44,0x44,0x4C,0x78,
      0x60,0x60,0x70,0x58,0x44,0xFC,0xC7,0xFD,
      0x41,0x01,0x01,0x03,0x02,0x06,0x0C,0x18,
      0x04,0x02,0x02,0x02,0xFE,0x40,0x40,0x40,
      0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
      0x01,0x00,0x00,0x01,0x06,0x04,0x08,0x18,
      0x10,0x10,0x10,0x10,0x08,0x0C,0x07,0x03,
      0x02,0x02,0x04,0x04,0x04,0x04,0x04,0x04,
      0x04,0x04,0x06,0x02,0x01,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

unsigned char code bot[] =                  // 数据表图片下半部分
{
      0x00,0x00,0x20,0x20,0x20,0xE0,0x60,0x38,
      0xAC,0xE0,0x20,0x00,0x80,0x80,0x88,0x88,
      0xC8,0xC8,0xF8,0xB0,0x80,0x80,0x80,0x80,
      0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
      0xC0,0x30,0x08,0x80,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,
      0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x20,
      0x3C,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,
      0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x34,0x64,0xC4,0x84,0x04,0x04,
      0xFC,0x04,0x04,0x04,0x84,0xC4,0x74,0x04,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x60,0x30,0x10,0xD0,0x90,0x10,0x10,0x12,
      0x1E,0x10,0x10,0x10,0x90,0x30,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,
      0x06,0x0F,0x19,0x10,0x00,0x00,0x00,0x00,
      0x00,0x08,0x18,0x18,0x0F,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x18,
      0x06,0x03,0x00,0x00,0x00,0x01,0x03,0x06,
      0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
      0x21,0x20,0x30,0x28,0x29,0x25,0x3F,0x25,
      0x25,0x27,0x20,0x20,0x20,0x20,0x20,0x00,
      0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,
      0x02,0x02,0xFF,0x02,0x03,0x03,0x02,0x02,
      0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,
      0x01,0x01,0x01,0x41,0x61,0x21,0x21,0x21,
      0x33,0x17,0x0D,0x15,0x25,0x23,0x41,0x41,
      0x01,0x01,0x00,0x00
};

                                      

typedef struct typFNT_GB16                 // 汉字字模数据结构
{
       signed char Index[2];              
       char Msk[32];                      
};


struct typFNT_GB16 code GB_16[] =          
{
"欢", 0x04,0x34,0xC4,0x04,0xC4,0x3C,0x20,0x10,
      0x0F,0xE8,0x08,0x08,0x28,0x18,0x00,0x00,
      0x10,0x08,0x06,0x01,0x82,0x8C,0x40,0x30,
      0x0C,0x03,0x0C,0x10,0x60,0xC0,0x40,0x00,

"迎", 0x40,0x42,0x44,0xC8,0x00,0xFC,0x04,0x02,
      0x82,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
      0x00,0x40,0x20,0x1F,0x20,0x47,0x42,0x41,
      0x40,0x7F,0x40,0x42,0x44,0x63,0x20,0x00,

"光", 0x40,0x40,0x42,0x44,0x58,0xC0,0x40,0x7F,
      0x40,0xC0,0x50,0x48,0x46,0x64,0x40,0x00,
      0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,
      0x00,0x3F,0x40,0x40,0x40,0x40,0x70,0x00,

"临", 0x00,0xFC,0x00,0xFF,0x40,0x20,0x10,0x0C,
      0x2B,0x48,0xC8,0x08,0x08,0x8C,0x08,0x00,
      0x00,0x1F,0x00,0xFF,0x00,0xFF,0x41,0x41,
      0x41,0x7F,0x41,0x41,0x41,0xFF,0x01,0x00,

⌨️ 快捷键说明

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