📄 程序.lst
字号:
C51 COMPILER V8.02 程序 05/20/2009 22:04:56 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 程序
OBJECT MODULE PLACED IN 程序.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 程序.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2
3 #define uchar unsigned char
4 #define uint unsigned int
5 /*******************************DS18B20模块****************************************/
6 sbit DQ=P3^7;
7
8
9 /***********ds18b20延迟子函数(晶振12MHz )*******/
10 void delay_18B20(unsigned int i){
11 1 while(i--);
12 1 }
13
14 /**********ds18b20初始化函数**********************/
15 void reset() {
16 1 uchar x=0;
17 1 DQ = 1; //DQ复位
18 1 delay_18B20(8); //稍做延时
19 1 DQ = 0; //单片机将DQ拉低
20 1 delay_18B20(80); //精确延时 大于 480us
21 1 DQ = 1; //拉高总线
22 1 delay_18B20(14);
23 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
24 1 delay_18B20(20);
25 1 }
26
27 /***********ds18b20读一个字节**************/
28 unsigned char rbyte(){
29 1 uchar i=0;
30 1 uchar dat = 0;
31 1 for (i=8;i>0;i--){
32 2 DQ = 0; // 给脉冲信号
33 2 dat>>=1;
34 2 DQ = 1; // 给脉冲信号
35 2 if(DQ)
36 2 dat|=0x80;
37 2 delay_18B20(4);
38 2 }
39 1 return(dat);
40 1 }
41
42 /*************ds18b20写一个字节****************/
43 void wbyte(uchar dat){
44 1 uchar i=0;
45 1 for (i=8; i>0; i--){
46 2 DQ = 0;
47 2 DQ = dat&0x01;
48 2 delay_18B20(5);
49 2 DQ = 1;
50 2 dat>>=1;
51 2 }
52 1 }
53
54 /**************读取ds18b20当前温度************/
55 void rTempetuare(uchar tmp[]){
C51 COMPILER V8.02 程序 05/20/2009 22:04:56 PAGE 2
56 1 uchar a=0,b=0,temp;
57 1
58 1 reset();
59 1 wbyte(0xCC); //跳过读序号列号的操作
60 1 wbyte(0x44); //启动温度转?
61 1
62 1 reset();
63 1 wbyte(0xCC); //跳过读序号列号的操作
64 1 wbyte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
65 1 a=rbyte(); //读取温度值低位
66 1 b=rbyte(); //读取温度值高位
67 1 temp=b;
68 1 temp&=0xf0;
69 1 if(temp){ //负温
70 2 if(a==0){
71 3 a=~a+1; //bit7向bit8位产生进位
72 3 b=~b+1;
73 3 }
74 2 else{
75 3 a=~a+1;
76 3 b=~b;
77 3 }
78 2 tmp[0]='-';
79 2 }
80 1 else
81 1 tmp[0]=' ';
82 1
83 1 temp=(b<<4)|(a>>4); //组合
84 1
85 1 //tmp[0]=temp/100 | 0x30; //取百位
86 1 tmp[1]=temp%100/10 | 0x30; //取十位
87 1 tmp[2]=temp%100%10 | 0x30; //取个位
88 1 tmp[3]=0x01; //字符℃
89 1 tmp[4]='\0';
90 1 }
91
92 /************************************LCD1602模块**********************************************/
93 sbit rs=P2^0;
94 sbit rw=P2^1;
95 sbit e=P2^2;
96
97 void delay_ms(uchar ms){
98 1 uint i,j;
99 1 for(i=0;i<ms;i++)
100 1 for(j=0;j<120;j++);
101 1 }
102
103 void lcd_wcmd(uchar cmd){ //写指令
104 1 rs=0;rw=0;
105 1 e=0;
106 1 P0=cmd;
107 1 e=1;
108 1 e=0;
109 1 delay_ms(5);
110 1 }
111
112 void lcd_wdat(uchar dat){ //写数据
113 1 rs=1;rw=0;
114 1 e=0;
115 1 P0=dat;
116 1 e=1;
117 1 e=0;
C51 COMPILER V8.02 程序 05/20/2009 22:04:56 PAGE 3
118 1 delay_ms(5);
119 1 }
120
121 void lcd_dis(uchar post,uchar *p){
122 1 lcd_wcmd(0x80 | post); //设置数据地址指针
123 1 while(*p!='\0'){
124 2 lcd_wdat(*p++);
125 2 }
126 1 }
127
128 uchar code def_char0[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}; //字符℃
129 void lcd_wcgram(uchar adress,uchar tmp[]){
130 1 uchar i;
131 1 for(i=0;i<8;i++){
132 2 lcd_wcmd(adress+i);
133 2 lcd_wdat(tmp[i]);
134 2 }
135 1 }
136
137 void lcd_inti(){
138 1 delay_ms(15);
139 1 lcd_wcmd(0x38); //16X2字符,5X7点阵,8位数据接口
140 1 lcd_wcmd(0x38);
141 1 lcd_wcmd(0x08); //关闭显示
142 1 lcd_wcmd(0x01); //清屏
143 1 lcd_wcmd(0x06); //设置光标工作方式
144 1 lcd_wcmd(0x0c); //开显示,设置光标显示方式
145 1
146 1 lcd_wcgram(0x48,def_char0); //载入用户自定义字符
147 1 }
148 /*******************************************************************************************/
149
150 void main(){
151 1 uchar tmp[5];
152 1
153 1 lcd_inti();
154 1
155 1 while(1){
156 2 rTempetuare(tmp);
157 2 lcd_dis(0x00,tmp);
158 2 }
159 1 }
160
161
162
163
164
165
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 491 ----
CONSTANT SIZE = 8 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 16
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 + -