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

📄 tem2.lst

📁 51单片机实现的温度测量、报警程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.12  TEM2                                                                   11/30/2008 00:03:30 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE TEM2
OBJECT MODULE PLACED IN .\tem2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\tem2.c DEBUG OBJECTEXTEND

stmt level    source

   1          #include <reg51.h>
   2          #include <intrins.h>
   3          
   4          sbit K1=P1^4;
   5          sbit K2=P1^5;
   6          sbit K3=P1^6;
   7          sbit K4=P1^7;
   8          sbit BUZZER=P3^7;
   9          
  10          //延时函数
  11          void delay(unsigned int i)
  12          {
  13   1      while(i--);
  14   1      }
  15          /****************DS18B20驱动程序********************/
  16          sbit DQ=P3^3;
  17          //初始化函数
  18          Init_DS18B20(void)
  19          {
  20   1      	unsigned char x=0;
  21   1      	DQ = 1; //DQ复位
  22   1      	delay(8); //稍做延时
  23   1      	DQ = 0; //单片机将DQ拉低
  24   1      	delay(80); //精确延时 大于 480us
  25   1      	DQ = 1; //拉高总线
  26   1      	delay(14);
  27   1      	x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  28   1      	delay(20);
  29   1      }
  30          
  31          //读一个字节
  32          ReadOneChar(void)
  33          {
  34   1      	unsigned char i=0;
  35   1      	unsigned char dat = 0;
  36   1      	for (i=8;i>0;i--)
  37   1      	{
  38   2      		DQ = 0; // 给脉冲信号
  39   2      		dat>>=1;
  40   2      		DQ = 1; // 给脉冲信号
  41   2      		if(DQ)
  42   2      		dat|=0x80;
  43   2      		delay(4);
  44   2      	}
  45   1      	return(dat);
  46   1      }
  47          
  48          //写一个字节
  49          WriteOneChar(unsigned char dat)
  50          {
  51   1      	unsigned char i=0;
  52   1      	for (i=8; i>0; i--)
  53   1      	{
  54   2      		DQ = 0;
  55   2      		DQ = dat&0x01;
C51 COMPILER V6.12  TEM2                                                                   11/30/2008 00:03:30 PAGE 2   

  56   2      		delay(5);
  57   2      		DQ = 1;
  58   2      		dat>>=1;
  59   2      	}
  60   1      }
  61          
  62          //读取温度
  63          ReadTemperature(void)
  64          {
  65   1      	unsigned char a=0;
  66   1      	unsigned char b=0;
  67   1      	unsigned int t=0;
  68   1      	float tt=0;
  69   1      	Init_DS18B20();
  70   1      	WriteOneChar(0xCC); // 跳过读序号列号的操作
  71   1      	WriteOneChar(0x44); // 启动温度转换
  72   1      	Init_DS18B20();
  73   1      	WriteOneChar(0xCC); //跳过读序号列号的操作
  74   1      	WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  75   1      	a=ReadOneChar();
  76   1      	b=ReadOneChar();
  77   1      	t=b;
  78   1      	t<<=8;
  79   1      	t=t|a;
  80   1      	tt=t*0.0625; //将温度的高位与低位合并
  81   1      	t= tt*10+0.5; //对结果进行4舍5入
  82   1      	return(t);
  83   1      }
  84          
  85          ReadTH(void)        //读最高的温度
  86          {
  87   1      	unsigned int th=0;
  88   1      	Init_DS18B20();
  89   1      	WriteOneChar(0xCC); // 跳过读序号列号的操作
  90   1      	WriteOneChar(0xBE);
  91   1      	ReadOneChar();
  92   1      	ReadOneChar();
  93   1      	th=ReadOneChar();
  94   1      	return(th);
  95   1      }
  96          
  97          ReadTL(void)        //读最高的温度
  98          {
  99   1      	unsigned int tl=0;
 100   1      	Init_DS18B20();
 101   1      	WriteOneChar(0xCC); // 跳过读序号列号的操作
 102   1      	WriteOneChar(0xBE);
 103   1      	ReadOneChar();
 104   1      	ReadOneChar();
 105   1      	ReadOneChar();
 106   1      	tl=ReadOneChar();
 107   1      	return(tl);
 108   1      }
 109          /********有关DS18B20的函数初始化完毕********************/
 110          
 111          /**********LCD驱动函数**********************************/
 112          typedef unsigned char BYTE;
 113          typedef unsigned int WORD;
 114          typedef bit BOOL ; 
 115          sbit rs	= P2^0;		//
 116          sbit rw = P2^1;
 117          sbit ep = P2^2;
C51 COMPILER V6.12  TEM2                                                                   11/30/2008 00:03:30 PAGE 3   

 118          sbit right = P2^6;
 119          
 120          delayms(BYTE ms)
 121          {							// 延时子程序
 122   1      	BYTE i;
 123   1      	while(ms--)
 124   1      	{
 125   2      		for(i = 0; i< 250; i++)
 126   2      		{
 127   3      			_nop_();
 128   3      			_nop_();
 129   3      			_nop_();
 130   3      			_nop_();
 131   3      		}
 132   2      	}
 133   1      }
 134          
 135          BOOL lcd_bz()
 136          {							// 测试LCD忙碌状态
 137   1      	BOOL result;
 138   1      	rs = 0;
 139   1      	rw = 1;
 140   1      	ep = 1;
 141   1      	_nop_();
 142   1      	_nop_();
 143   1      	_nop_();
 144   1      	_nop_();
 145   1      	result = (BOOL)(P0 & 0x80);
 146   1      	ep = 0;
 147   1      	return result;	
 148   1      }
 149          
 150          lcd_wcmd(BYTE cmd)
 151          {							// 写入指令数据到LCD
 152   1      	while(lcd_bz());
 153   1      	rs = 0;
 154   1      	rw = 0;
 155   1      	ep = 0;
 156   1      	_nop_();
 157   1      	_nop_();	
 158   1      	P0 = cmd;
 159   1      	_nop_();
 160   1      	_nop_();
 161   1      	_nop_();
 162   1      	_nop_();
 163   1      	ep = 1;
 164   1      	_nop_();
 165   1      	_nop_();
 166   1      	_nop_();
 167   1      	_nop_();
 168   1      	ep = 0;		
 169   1      }
 170          
 171          lcd_pos(BYTE pos)
 172          {							//设定显示位置
 173   1      	lcd_wcmd(pos | 0x80);
 174   1      }
 175          
 176          lcd_wdat(BYTE dat)	
 177          {							//写入字符显示数据到LCD
 178   1      	while(lcd_bz());
 179   1      	rs = 1;
C51 COMPILER V6.12  TEM2                                                                   11/30/2008 00:03:30 PAGE 4   

 180   1      	rw = 0;
 181   1      	ep = 0;
 182   1      	P0 = dat;
 183   1      	_nop_();
 184   1      	_nop_();
 185   1      	_nop_();
 186   1      	_nop_();
 187   1      	ep = 1;
 188   1      	_nop_();
 189   1      	_nop_();
 190   1      	_nop_();
 191   1      	_nop_();
 192   1      	ep = 0;	
 193   1      }
 194          
 195          lcd_init()
 196          {							//LCD初始化设定
 197   1      	lcd_wcmd(0x38);			//
 198   1      	delayms(1);
 199   1      	lcd_wcmd(0x0c);			//
 200   1      	delayms(1);
 201   1      	lcd_wcmd(0x06);			//
 202   1      	delayms(1);
 203   1      	lcd_wcmd(0x01);			//清除LCD的显示内容
 204   1      	delayms(1);
 205   1      }
 206          /******************LCD驱动到此结束*********************/
 207          
 208          /******************按键扫描程序开始********************/
 209          unsigned char Read_keyboard()
 210          {
 211   1      	unsigned char Keys_Value;
 212   1      	unsigned char Keys_Temp;
 213   1      	P1=0XFF;
 214   1      	Keys_Temp = P1;
 215   1      	delay(150);
 216   1      	P1=0XFF;
 217   1      	Keys_Value = P1;
 218   1      	if(Keys_Temp != Keys_Value)
 219   1      	return(Keys_Value);
 220   1      }
 221          /****************按键扫描程序结束***********************/			
 222          
 223          main()
 224          {
 225   1      
 226   1      	typedef unsigned char BYTE;
 227   1      	BYTE code dis1[] = {"TEMP:"};
 228   1      	BYTE code dis2[] = {"SET"};
 229   1      	BYTE code dis3[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
 230   1      	BYTE code dis4[] = {"TH:"};
 231   1      	BYTE code dis5[] = {"     TH  TL  ESC"};
 232   1      	BYTE code dis6[] = {"TH:"};
 233   1      	BYTE code dis7[] = {"SET UP DOWN ESC"};
 234   1      	BYTE code dis8[] = {"TL:"};
 235   1      	BYTE i;
 236   1      	unsigned int temp=0,th=0,tl=0;
 237   1        	unsigned char key;
 238   1      
 239   1         lcd_init();// 初始化LCD
 240   1      	delayms(100);
 241   1      	while(1)
C51 COMPILER V6.12  TEM2                                                                   11/30/2008 00:03:30 PAGE 5   

 242   1      	{
 243   2      		lcd_pos(0x01);				
 244   2      		i = 0;
 245   2      		while(dis1[i] != '\0')
 246   2      		{						// 显示字符"TEMP:"

⌨️ 快捷键说明

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