📄 temperature.lst
字号:
C51 COMPILER V7.50 TEMPERATURE 10/04/2007 11:52:12 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TEMPERATURE
OBJECT MODULE PLACED IN temperature.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE temperature.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include "temp.h"
3
4 /**********************************************************
5 *采用DS1820+YM12864R精确到4位小数的温度计
6
7
8 *版本:V0.3
9 *DS1820设置为12位精度
10 **********************************************************/
11
12 //声明外部温度读数数组
13 extern unsigned char data temperature[2];
14 //存放分解的7个ASCII码温度数据
15 unsigned char temp[7];
16 unsigned char code string[6]={"温度:"};
17 unsigned char code DispStr[7]={"系列号"};
18 unsigned char fCode[8]; //存放序列号,CRC
19
20 /**********************************************************
21 *主程序
22 **********************************************************/
23 void main()
24 {
25 1 unsigned char i;
26 1 delay100us();//等待电源稳定,液晶复位完成
27 1 delay100us();
28 1 LCD_INIT(); //液晶初始化
29 1 DS1820_Reset();//DS1820复位
30 1 DS1820_WriteData(0x33);//读ROM指令
31 1 for (i=0;i<8;i++)
32 1 {//读取64位系列号
33 2 fCode[i] = DS1820_ReadData();
34 2 }
35 1 DS1820_Reset();//DS1820复位
36 1 LCD_WRITE_IR(0x80);//在第一行显示
37 1 for (i=0;i<5;i++)
38 1 {
39 2 LCD_WRITE_DR(string[i]);//显示"温度:"
40 2 }
41 1 LCD_WRITE_IR(0x88);//在第3行显示
42 1 for (i=0;i<6;i++)
43 1 {
44 2 LCD_WRITE_DR(DispStr[i]);//显示"系列号"
45 2 }
46 1 DispCode();//在第4行显示序列号
47 1 do{
48 2 read_temp(); //读取温度值
49 2 delay100us();
50 2 display(); //显示温度值
51 2 delay100us();
52 2 }while (1); //无限循环
53 1 }
54
55 /**********************************************************
C51 COMPILER V7.50 TEMPERATURE 10/04/2007 11:52:12 PAGE 2
56 *系列号显示子程序
57 *显示顺序(从左到右)8位CRC编码->48位序列号->8位产品系列编码
58 **********************************************************/
59 void DispCode()
60 {
61 1 unsigned char i,temp;
62 1 LCD_WRITE_IR(0x98); //在第4行显示
63 1 for (i=8;i>0;i--)
64 1 {
65 2 //显示高4位
66 2 temp = fCode[i-1]>>4;
67 2 if (temp<10) //ASCII码转换
68 2 LCD_WRITE_DR(temp += 0x30);
69 2 else
70 2 LCD_WRITE_DR(temp += 0x37);
71 2 //显示低4位
72 2 temp = fCode[i-1]&0x0f;
73 2 if (temp<10) //ASCII码转换
74 2 LCD_WRITE_DR(temp += 0x30);
75 2 else
76 2 LCD_WRITE_DR(temp += 0x37);
77 2 }
78 1 }
79 /**********************************************************
80 *延时子程序
81 **********************************************************/
82 void delay100us()
83 {
84 1 unsigned char i;
85 1 for (i=49;i>0;i--);
86 1 }
87 /**********************************************************
88 *转换显示子程序
89 **********************************************************/
90 void display()
91 {
92 1 unsigned char temp_data,temp_data_2;
93 1 unsigned int TempDec; //用来存放4位小数
94 1 temp_data = temperature[1];
95 1 temp_data &= 0xf0; //取高4位
96 1 if (temp_data==0xf0) //判断是正温度还是负温度读数
97 1 {
98 2 //负温度读数求补,取反加1,判断低8位是否有进位
99 2 if (temperature[0]==0)
100 2 { //有进位,高8位取反加1
101 3 temperature[0]=~temperature[0]+1;
102 3 temperature[1]=~temperature[1]+1;
103 3 }
104 2 else
105 2 { //没进位,高8位不加1
106 3 temperature[0]=~temperature[0]+1;
107 3 temperature[1]=~temperature[1];
108 3 }
109 2 }
110 1 temp_data = temperature[1]<<4; //取高字节低4位(温度读数高4位)
111 1 temp_data_2 = temperature[0]>>4; //取低字节高4位(温度读数低4位)
112 1 temp_data = temp_data|temp_data_2; //组合成完整数据
113 1 temp[0] = temp_data/100+0x30; //取百位转换为ASCII码
114 1 temp[1] = (temp_data%100)/10+0x30; //取十位转换为ASCII码
115 1 temp[2] = (temp_data%100)%10+0x30; //取个位转换为ASCII码
116 1 temperature[0]&=0x0f; //取小数位转换为ASCII码
117 1 TempDec = ((temperature[0]&0x0f)*0.0625)*10000;//小数部分,扩大1万倍
C51 COMPILER V7.50 TEMPERATURE 10/04/2007 11:52:12 PAGE 3
118 1 temp[3] = TempDec/1000+0x30; //取小数个位转换为ASCII码
119 1 temp[4] = (TempDec%1000)/100+0x30; //取小数十位转换为ASCII码
120 1 temp[5] = ((TempDec%1000)%100)/10+0x30;//取小数百位转换为ASCII码
121 1 temp[6] = ((TempDec%1000)%100)%10+0x30;//取小数千位转换为ASCII码
122 1 LCD_WRITE_IR(0x91);//在LCD第2行显示
123 1 LCD_WRITE_DR(temp[0]); //显示百位
124 1 LCD_WRITE_DR(temp[1]); //显示十位
125 1 LCD_WRITE_DR(temp[2]); //显示个位
126 1 LCD_WRITE_DR(0x2e); //显示"."
127 1 LCD_WRITE_DR(temp[3]); //显示小数位
128 1 LCD_WRITE_DR(temp[4]); //显示小数位
129 1 LCD_WRITE_DR(temp[5]); //显示小数位
130 1 LCD_WRITE_DR(temp[6]); //显示小数位
131 1 LCD_WRITE_DR(0xa1); //显示"℃"
132 1 LCD_WRITE_DR(0xe6);
133 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 491 ----
CONSTANT SIZE = 13 ----
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 + -