📄 lc.lst
字号:
C51 COMPILER V7.50 LC 09/21/2008 21:29:43 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE LC
OBJECT MODULE PLACED IN .\LC.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE .\LC.C DEBUG OBJECTEXTEND
line level source
1 //****************************************************************************************************//
2 //本设计使用AT89C2051单片机,时钟频率为12MHz,用共阳极LED数码管显示及使用DS18B20智能温度传感器。//
3 #include "reg51.h"
4 #include "intrins.h" //_nop_();延时函数,用于小于11us延时
5 #define Disdata P1 //段码输出口
6 #define discan P3 //动态扫描口
7 #define uchar unsigned char
8 #define uint unsigned int
9 sbit DQ=P3^1; //温度输入口
10 sbit DIN=P1^7; //LED小数点控制
11 uint h; //定义循环变量
12 //
13 //
14 //*********************温度小数部分用查表法*********************//
15 uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
16 //
17 uchar code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
18 // 共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" //
19 uchar code scan_con[4]={0x04,0x08,0x10,0x20}; // 列扫描控制字,P3.3 P3.4 P3.5 P3.6
20 uchar data temp_data[2]={0x00,0x00}; // 读出温度暂放
21 uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,一个运算暂存用
22 //
23 //
24 //*********************11微秒延时函数*********************//
25 void delay(uint t)
26 {
27 1 for(;t>0;t--);
28 1 }
29 //
30 //
31 //*********************显示扫描函数*********************//
32 scan()
33 {
34 1 char k;
35 1 for(k=0;k<4;k++) //四位LED扫描控制
36 1 {
37 2 Disdata=dis_7[display[k]];
38 2 if(k==1){DIN=0;}
39 2 discan=scan_con[k];delay(90);//scan_con-列扫描控制字;discan-P3口列扫描输出
40 2 discan=0x00; //灭字
41 2 }
42 1 }
43 //
44 //
45 //*********************18B20复位函数*********************//
46 reset(void)
47 {
48 1 char presence=1;
49 1 while(presence)
50 1 {
51 2 while(presence)
52 2 {
53 3 DQ=1;_nop_();_nop_();//总线上拉
54 3 DQ=0; //下拉
55 3 delay(50); //维持550us,最短维持480us
C51 COMPILER V7.50 LC 09/21/2008 21:29:43 PAGE 2
56 3 DQ=1; //总线上拉
57 3 delay(6); //检测总线上升沿,66us
58 3 presence=DQ; //DS18B20发存在低电平信号(60-240us);presence=0继续下一步
59 3 }
60 2 delay(30); //延时300us,总线恢复高电平,DQ=1;
61 2 presence = ~DQ; //取反,跳出循环
62 2 }
63 1 DQ=1;
64 1 }
65 //
66 //
67 //*********************18B20写命令函数*********************//
68 void write_byte(uchar val)
69 {
70 1 uchar i;
71 1 for (i=8; i>0; i--) //定义 8 bit,写 8 bit
72 1 {
73 2 DQ=1;_nop_();_nop_();
74 2 DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
75 2 DQ = val&0x01; //最低位移出,并写入总线
76 2 delay(6); //66us
77 2 val=val/2; //右移一位,倒数第二位变为最低位
78 2 }
79 1 DQ = 1;
80 1 delay(1); //高电平维持11us,写结束
81 1 }
82 //
83 //
84 //*********************18B20读1个字节函数*********************//
85 uchar read_byte(void)
86 {
87 1 uchar i;
88 1 uchar value = 0;
89 1 for (i=8;i>0;i--)
90 1 {
91 2 DQ=1;_nop_();_nop_();
92 2 value>>=1; //右移一位
93 2 DQ = 0;
94 2 _nop_();_nop_();_nop_();_nop_(); //4us
95 2 DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us ,读时隙
96 2 if(DQ)value|=0x80; //DQ=1,则写入为 10000000
97 2 delay(6); //66us
98 2 }
99 1 DQ=1;
100 1 return(value);
101 1 }
102 //
103 //
104 //*********************读出温度函数*********************//
105 read_temp()
106 {
107 1 reset(); //总线复位
108 1 write_byte(0xCC); // 发Skip ROM命令
109 1 write_byte(0xBE); // 发读命令
110 1 temp_data[0]=read_byte(); //温度低8位
111 1 temp_data[1]=read_byte(); //温度高8位
112 1 reset();
113 1 write_byte(0xCC); // Skip ROM
114 1 write_byte(0x44); // 发转换命令
115 1 }
116 //
117 //
C51 COMPILER V7.50 LC 09/21/2008 21:29:43 PAGE 3
118 //*********************温度数据处理函数*********************//
119 work_temp()
120 {
121 1 uchar n=0; //存储符号
122 1 if(temp_data[1]>112)
123 1 {temp_data[1]=(0xFF-temp_data[1]);temp_data[0]=(0xFF-temp_data[0]);n=1;} //负温度求补码
124 1 display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]]; //处理小数位
125 1 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//低八位屏蔽小数位后右移四位与高八位屏蔽符号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -