📄 ds1820_show.lst
字号:
C51 COMPILER V7.06 DS1820_SHOW 10/27/2008 22:55:09 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DS1820_SHOW
OBJECT MODULE PLACED IN DS1820_show.OBJ
COMPILER INVOKED BY: D:\Cs1.6中文版\C51\BIN\C51.EXE DS1820_show.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /**********************************************************
2 *采用DS1820+1602精确到4位小数的温度计
3 *编程:沈阳
4 *版本:V1.0
5 *DS1820设置为12位精度
6 **********************************************************/
7 #include <reg52.h>
8 #include "temp.h"
9 sbit RW =P1^1;//定义引脚
10 sbit RS= P1^0;
11 sbit E= P1^2;
12 sbit light= P1^3;
13 //声明外部温度读数数组
14 extern unsigned char data temperature[2];
15 //存放分解的7个ASCII码温度数据
16 unsigned char temp[7];
17 unsigned char code string[16]={"TEMP: 28.5\'c"};
18 unsigned char code DispStr[16]={"SN:12345678"};
19 unsigned char fCode[8]; //存放序列号,CRC
20 /**********************************************************
21 *主程序
22 **********************************************************/
23 void main()
24 {
25 1 unsigned char i;
26 1 delayms(255);//等待电源稳定,液晶复位完成
27 1 DS1820_Reset();//DS1820复位
28 1 DS1820_WriteData(0x33);//读ROM指令
29 1 for (i=0;i<8;i++)
30 1 {//读取64位系列号
31 2 fCode[i] = DS1820_ReadData();
32 2 }
33 1 DS1820_Reset();//DS1820复位
34 1 delayms(250);
35 1 delayms(250);
36 1 LCDInit(); //1602液晶初始化
37 1 delayms(10);
38 1 SetLight(1);
39 1 DisplayStr(0,0,string);//显示"温度:"
40 1 delayms(1);
41 1 DisplayStr(0,1,DispStr);//显示"系列号"
42 1 delayms(50);
43 1 DispCode();
44 1 RW=1;
45 1 RS=1;
46 1 light=0;
47 1 //当1602的E和DB18B20共用一个端口时 必须使用以上两条语句隔离
48 1 //当EW,RS,E=1时 1602为读数据 当E=0时 不会改变1602的数据 这样可以使1602的E和DB18B20可以共用
49 1 do{
50 2 read_temp(); //读取温度值
51 2 delayms(50);
52 2 display(); //显示温度值
53 2 delayms(50);
54 2 RW=1;
55 2 RS=1;
C51 COMPILER V7.06 DS1820_SHOW 10/27/2008 22:55:09 PAGE 2
56 2 //当1602的E和DB18B20共用一个端口时 必须使用以上两条语句隔离
57 2 //当EW,RS,E=1时 1602为读数据 当E=0时 不会改变1602的数据 这样可以使1602的E和DB18B20可以共用
58 2 delayms(1);
59 2 }while (1); //无限循环
60 1 }
61 /**********************************************************
62 *系列号显示子程序
63 *显示顺序(从左到右)8位CRC编码->48位序列号->8位产品系列编码
64 **********************************************************/
65 void DispCode()
66 {
67 1 unsigned char i,temp;
68 1 for (i=8;i>0;i--)
69 1 {
70 2 //显示高4位
71 2 temp = fCode[i-1]>>4;
72 2 if (temp<10) //ASCII码转换
73 2 DisplayChar(3+8-i,1,temp += 0x30);
74 2 else
75 2 DisplayChar(3+8-i,1,temp += 0x37);
76 2 //显示低4位
77 2 temp = fCode[i-1]&0x0f;
78 2 if (temp<10) //ASCII码转换
79 2 DisplayChar(4+8-i,1,temp += 0x30);
80 2 else
81 2 DisplayChar(4+8-i,1,temp += 0x37);
82 2 i--;
83 2 }
84 1 }
85 /**********************************************************
86 *转换显示子程序
87 **********************************************************/
88 void display()
89 {
90 1 unsigned char temp_data,temp_data_2;
91 1 unsigned int TempDec; //用来存放4位小数
92 1 temp_data = temperature[1];
93 1 temp_data &= 0xf0; //取高4位
94 1 if (temp_data==0xf0) //判断是正温度还是负温度读数
95 1 {
96 2 //负温度读数求补,取反加1,判断低8位是否有进位
97 2 if (temperature[0]==0)
98 2 { //有进位,高8位取反加1
99 3 temperature[0]=~temperature[0]+1;
100 3 temperature[1]=~temperature[1]+1;
101 3 }
102 2 else
103 2 { //没进位,高8位不加1
104 3 temperature[0]=~temperature[0]+1;
105 3 temperature[1]=~temperature[1];
106 3 }
107 2 }
108 1 temp_data = temperature[1]<<4; //取高字节低4位(温度读数高4位)
109 1 temp_data_2 = temperature[0]>>4; //取低字节高4位(温度读数低4位)
110 1 temp_data = temp_data|temp_data_2; //组合成完整数据
111 1 temp[0] = temp_data/100+0x30; //取百位转换为ASCII码
112 1 temp[1] = (temp_data%100)/10+0x30; //取十位转换为ASCII码
113 1 temp[2] = (temp_data%100)%10+0x30; //取个位转换为ASCII码
114 1 temperature[0]&=0x0f; //取小数位转换为ASCII码
115 1 TempDec = ((temperature[0]&0x0f)*0.0625)*10000;//小数部分,扩大1万倍
116 1 temp[3] = TempDec/1000+0x30; //取小数个位转换为ASCII码
117 1 temp[4] = (TempDec%1000)/100+0x30; //取小数十位转换为ASCII码
C51 COMPILER V7.06 DS1820_SHOW 10/27/2008 22:55:09 PAGE 3
118 1 temp[5] = ((TempDec%1000)%100)/10+0x30;//取小数百位转换为ASCII码
119 1 temp[6] = ((TempDec%1000)%100)%10+0x30;//取小数千位转换为ASCII码
120 1 if(temp[0]==0x30) DisplayChar(5,0,' ');//百位
121 1 else DisplayChar(5,0,temp[0]);//百位
122 1 DisplayChar(6,0,temp[1]);//十位
123 1 DisplayChar(7,0,temp[2]);//个位
124 1 DisplayChar(8,0,0x2e);//小数点 .
125 1 DisplayChar(9,0,temp[3]);
126 1 DisplayChar(10,0,temp[4]);
127 1 DisplayChar(11,0,temp[5]);
128 1 DisplayChar(12,0,temp[6]);
129 1 DisplayChar(13,0,'\'');//显示'
130 1 DisplayChar(14,0,'C');
131 1 }
132
133
134
135
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 578 ----
CONSTANT SIZE = 32 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 15 3
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -