📄 5.lst
字号:
C51 COMPILER V8.05a 5 12/09/2008 10:17:59 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE 5
OBJECT MODULE PLACED IN 5.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 5.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include <intrins.h>
3 #define HIGH 1
4 #define LOW 0
5 #define uchar unsigned char
6 #define uint unsigned int
7
8 //***************LCD1602********************************
9 #define DATA_MODE 0x28 //LCD模式设置,0x28位四位数据线模式
10 #define OPEN_SCREEN 0x0C //打开LCD显示
11 #define DISPLAY_ADDRESS 0x80 //写地址指令
12 #define CLEARSCREEN LCD_en_com(0x01) //清屏
13 #define LCDIO P0 //LCD1602的高四位接在P0口的高四位
14 sbit LCD1602_RS=P0^1; //RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
15 sbit LCD1602_EN=P0^0; //E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
16 void LCD_en_com(uchar command); //写命令指令
17 void LCD_en_dat(uchar temp); //写数据指令
18 void LCD_set_xy(uchar x, unsigned char y); //设置显示地址:X为横轴(0-15),Y为纵轴(0-1).
19 void LCD_write_char(uchar x,uchar y,uchar dat); //写一个字符
20 void LCD_write_string(uchar x,uchar y,uchar *s);//写一个字符串
21 void LCD_write_int(uchar x,uchar y,uint intdat); //写无字符型整形数
22 void LCD_init(void); //lcd初始化
23 void cover(void);
24
25 //************************DS1302*******************************************//
26 sbit RST =P3^4; //ds1302的接线
27 sbit IO =P3^3;
28 sbit SCLK=P3^2;
29 sbit ACC0=ACC^0; //累加器
30 sbit ACC7=ACC^7;
31 uchar times[7]={50,59,23,30,11,7,8}; //存放时间
32
33 uchar led[13];
34 void change_time(unsigned char i);
35 //*************************DS18B20*******************************************//
36 sbit DQ=P1^0;
37 uint h; //定义循环变量
38 uchar data temp_data[2]={0x00,0x00}; // 读出温度暂放
39 uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,一个运算暂存用
40 uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
41 //************************其他******************************************//
42 sbit alarm_speaker=P3^7; //蜂鸣器的接线
43 void delay(uchar i); //延时程序
44 unsigned char key=16; //存放健值
45 //***************************************************************************************
46 void LCD_en_write(void) //EN端产生一个高电平脉冲,写LCD
47 {
48 1 LCD1602_EN=HIGH;
49 1 _nop_();
50 1 LCD1602_EN=LOW;
51 1 }
52 //****************************************************************************************
53 void LCD_en_com(uchar command)
54 {
55 1 delay(9);
C51 COMPILER V8.05a 5 12/09/2008 10:17:59 PAGE 2
56 1 LCD1602_RS=LOW; //RS=0 写命令
57 1 LCDIO&=0x0f; //清高四位
58 1 LCDIO|=command&0xf0; //先发送高四位数据
59 1 LCD_en_write();
60 1 command=command<<4;
61 1 LCDIO&=0x0f;
62 1 LCDIO|=command&0xf0; //发送低四位数据
63 1 LCD_en_write();
64 1 }
65 //*****************************************************************************************
66 void LCD_en_dat(uchar dat)
67 {
68 1 delay(9);
69 1 LCD1602_RS=HIGH; //RS=1 写数据
70 1 LCDIO&=0x0f; //清高四位
71 1 LCDIO|=dat&0xf0; //写高四位
72 1 LCD_en_write();
73 1 dat=dat<<4; //低四位移到高四位
74 1 LCDIO&=0x0f; // 清高四位
75 1 LCDIO|=dat&0xf0; //写低四位
76 1 LCD_en_write();
77 1 }
78 //**************设置显示地址:X为横轴(0-15),Y为纵轴(0-1)**************************************
79 void LCD_set_xy(uchar x,uchar y)
80 {
81 1 uchar address;
82 1 x&=0x0f;
83 1 if(!y)
84 1 address=0x80+x;
85 1 else
86 1 address=0xc0+x;
87 1 LCD_en_com(address);
88 1 }
89 //***************写一个字符:X为横轴(0-15),Y为纵轴(0-1)**********
90 void LCD_write_char(uchar x,uchar y,uchar dat)
91 {
92 1 LCD_set_xy(x,y);
93 1 LCD_en_dat(dat);
94 1 }
95 //***************写一个字符串**********
96 void LCD_write_string(uchar x,uchar y,const uchar *s)
97 {
98 1 LCD_set_xy(x,y);
99 1 while(*s)
100 1 {
101 2 LCD_en_dat(*s);
102 2 s++;
103 2 }
104 1 }
105 //****************写一个无字符整数***************************************
106 void LCD_write_int(uchar x,uchar y,uint intdat)
107 {
108 1 uchar i=0,temp[5];
109 1 LCD_set_xy(x,y);
110 1 if(intdat==0)
111 1 {
112 2 LCD_en_dat(0x30);
113 2 return;
114 2 }
115 1 while(intdat/10 || intdat%10)
116 1 {
117 2 temp[i]=intdat%10;
C51 COMPILER V8.05a 5 12/09/2008 10:17:59 PAGE 3
118 2 intdat/=10;
119 2 i++;
120 2 }
121 1 while(i)
122 1 {
123 2 i--;
124 2 LCD_en_dat(temp[i]+0x30);
125 2 }
126 1 }
127 //*****//LCD的初始化函数(刚上电的时候一定要调用一次)//*********************
128 void LCD_init(void)
129 {
130 1 LCD_en_com(DATA_MODE); //设计四位数据线模式
131 1 LCD_en_write();
132 1 delay(9);
133 1 LCD_en_com(DATA_MODE);
134 1 LCD_en_com(OPEN_SCREEN); //打开LCD显示
135 1 LCD_en_com(DISPLAY_ADDRESS);//设计首地址
136 1 CLEARSCREEN; //清屏
137 1 delay(9);
138 1 }
139 //***********************18b20************
140 //*********************11微秒延时函数*********************//
141 void delay1(uint t)
142 {
143 1 for(;t>0;t--);
144 1 }
145 //*********************18B20复位函数*********************//
146 reset(void)
147 {
148 1 char presence=1;
149 1 while(presence)
150 1 {
151 2 while(presence)
152 2 {
153 3 DQ=1;_nop_();_nop_();//总线上拉
154 3 DQ=0; //下拉
155 3 delay1(50); //维持550us,最短维持480us
156 3 DQ=1; //总线上拉
157 3 delay1(6); //检测总线上升沿,66us
158 3 presence=DQ; //DS18B20发存在低电平信号(60-240us);presence=0继续下一步
159 3 }
160 2 delay1(30); //延时300us,总线恢复高电平,DQ=1;
161 2 presence = ~DQ; //取反,跳出循环
162 2 }
163 1 DQ=1;
164 1 }
165 //*********************18B20写命令函数*********************//
166 void write_byte1(uchar val)
167 {
168 1 uchar i;
169 1 for (i=8; i>0; i--) //定义 8 bit,写 8 bit
170 1 {
171 2 DQ=1;_nop_();_nop_();
172 2 DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
173 2 DQ = val&0x01; //最低位移出,并写入总线
174 2 delay1(6); //66us
175 2 val=val/2; //右移一位,倒数第二位变为最低位
176 2 }
177 1 DQ = 1;
178 1 delay(1); //高电平维持11us,写结束
179 1 }
C51 COMPILER V8.05a 5 12/09/2008 10:17:59 PAGE 4
180 //*********************18B20读1个字节函数*********************//
181 uchar read_byte1(void)
182 {
183 1 uchar i;
184 1 uchar value = 0;
185 1 for (i=8;i>0;i--)
186 1 {
187 2 DQ=1;_nop_();_nop_();
188 2 value>>=1; //右移一位
189 2 DQ = 0;
190 2 _nop_();_nop_();_nop_();_nop_(); //4us
191 2 DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us ,读时隙
192 2 if(DQ)value|=0x80; //DQ=1,则写入为 10000000
193 2 delay1(6); //66us
194 2 }
195 1 DQ=1;
196 1 return(value);
197 1 }
198 //*********************读出温度函数*********************//
199 read_temp()
200 {
201 1 reset(); //总线复位
202 1 write_byte1(0xCC); // 发Skip ROM命令
203 1 write_byte1(0xBE); // 发读命令
204 1 temp_data[0]=read_byte1(); //温度低8位
205 1 temp_data[1]=read_byte1(); //温度高8位
206 1 reset();
207 1 write_byte1(0xCC); // Skip ROM
208 1 write_byte1(0x44); // 发转换命令
209 1 }
210 //*********************温度数据处理函数*********************//
211 work_temp()
212 {
213 1 uchar n=0; //存储符号
214 1 if(temp_data[1]>112)
215 1 {temp_data[1]=(0xFF-temp_data[1]);temp_data[0]=(0xFF-temp_data[0]);n=1;} //负温度求补码
216 1
217 1 display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]]; //处理小数位
218 1 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//低八位屏蔽小数位后右移四位与高八位屏蔽符号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -