📄 tem_test.lst
字号:
C51 COMPILER V8.02 TEM_TEST 04/28/2008 19:04:33 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE TEM_TEST
OBJECT MODULE PLACED IN tem_test.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE tem_test.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*---------------------------------------------------------------------------------
2
3 ************************************ 程序功能说明 **********************************************
4 单片机通过温度传感器读取当前温度显示在lcd1602上,lcd1602两位显示整数,两位显示小数;
5 当前温度发生改变,lcd1602显示数值亦随之改变。
6 ********************************************************************************************/
7
8 #include <reg52.h>
9 #include <lcd1602.c>
10 #define uchar unsigned char
11
12 sbit DQ =P0^6; //18B20数据线引脚
13
14
15
16 uchar dispbuf[4]; //显示缓冲区
17 uchar temper[2];//存放温度的数组
18
19
20
21 /*****************************延时函数**************************/
22
23 void delay_us (unsigned int us)
24 {
25 1 while(us--);
26 1 }
27
28 void DS18b20_init(void) //初始化
29 {
30 1 uchar flag=0;
31 1 DQ = 1;
32 1 delay_us(8); //稍做延时
33 1 DQ = 0;
34 1 delay_us(80); //精确延时 大于 480us
35 1 DQ = 1; //拉高总线
36 1 delay_us(14);
37 1 flag=DQ;
38 1 delay_us(20);
39 1 }
40 /**********************从DS18B20读一字节***************/
41 uchar readbyte(void) //读1字节
42 {
43 1 uchar i=0;
44 1 uchar dat=0;
45 1 for (i=8;i>0;i--)
46 1 {
47 2 DQ = 0;
48 2 dat>>=1;
49 2 DQ = 1;
50 2 if(DQ)
51 2 dat|=0x80;
52 2 delay_us(4);
53 2 }
54 1 return(dat);
55 1 }
C51 COMPILER V8.02 TEM_TEST 04/28/2008 19:04:33 PAGE 2
56 /***********************向DS18B20写一字节***********************/
57 void writebyte(unsigned char dat) //写1字节
58 {
59 1 uchar i=0;
60 1 for (i=8; i>0; i--)
61 1 {
62 2 DQ = 0;
63 2 DQ = dat&0x01;
64 2 delay_us(5);
65 2 DQ = 1;
66 2 dat>>=1;
67 2 }
68 1 delay_us(4);
69 1 }
70 /***********************CPU读取温度值***************************/
71 void readtemp(void) //读取温度
72 {
73 1 uchar a=0,b=0;
74 1 DS18b20_init(); //初始化
75 1 writebyte(0xCC); // 跳过序列号
76 1 writebyte(0x44); // 启动温度转换
77 1 DS18b20_init(); //要重新初始化才可以读寄存器
78 1 writebyte(0xCC);
79 1 writebyte(0xBE); //读取温度寄存器等(共可读9个寄存器)
80 1 //前两个就是温度,且第一个寄存器的低4位是小数点部分,
81 1 //高四位和另外一个寄存器的低三位是整数部分,另外那个寄存器剩下的5位是符号位
82 1 a=readbyte(); //低位
83 1 b=readbyte(); //高位
84 1 temper[0]=a&0x0f;
85 1 a=a>>4; //低位右移4位,舍弃小数部分
86 1 temper[1]=b<<4; //高位左移4位,舍弃符号位
87 1 temper[1]=temper[1]|a;
88 1 }
89
90
91 main()
92 { uchar i;
93 1 uchar temp;
94 1
95 1 float backbit;
96 1 lcd_init();
97 1 for(i=0;i<4;i++)
98 1 dispbuf[i] = 0;
99 1 while(1){
100 2 readtemp();//读18B20
101 2 backbit = temper[0];//换成浮点数
102 2 backbit = backbit * 625;//乘以0.0625*100
103 2 temp = backbit;//取低2位整数部分
104 2 lcd_pos(1);
105 2 dispbuf[3] = temp%10 ;
106 2 temp = temp/10;
107 2 dispbuf[2] = temp%10 ;
108 2 temp = temper[1];//取整数部分
109 2 dispbuf[1] = temp%10;
110 2
111 2 temp = temp/10;
112 2 dispbuf[0]= temp%10;
113 2 lcd_write(1,display_code[dispbuf[0]]);
114 2 lcd_write(1,display_code[dispbuf[1]]);
115 2 lcd_write(1,0x2E);
116 2 lcd_write(1,display_code[dispbuf[3]]);
117 2 lcd_write(1,display_code[dispbuf[2]]);
C51 COMPILER V8.02 TEM_TEST 04/28/2008 19:04:33 PAGE 3
118 2
119 2
120 2 //seg_scan(); //显示扫描
121 2 }
122 1 }
123
124 /********************************结束************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 498 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 18 4
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -