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