📄 wdbj.lst
字号:
C51 COMPILER V7.50 WDBJ 03/08/2008 22:56:25 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE WDBJ
OBJECT MODULE PLACED IN wdbj.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE wdbj.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<intrins.h>
2 #include<reg52.h>
3 #include<absacc.h>
4 #define uint unsigned int
5 #define uchar unsigned char
6
7 #define liangtime 40 //设置闪烁时间
8 #define mietime 40
9 #define MaxRate 50 //重复前的延迟值600MS
10 #define MinRate 20 //重复速度240MS
11 #define N 2 //设定去抖时间
12
13 //定时器1的时间常数和方式控制字2ms
14 #define V_TH0 (65535-10000)/256
15 #define V_TL0 (65535-10000)%256
16 #define V_TMOD 0x01
17 sbit ds18b20_IO=P1^0;
18 sbit duX=P2^7; //段选使能
19 sbit weX=P2^6; //位选使能
20 sbit K1=P3^7; //设置键
21 sbit K2=P3^5; //加数键
22 sbit K3=P3^6; //减数键
23 sbit K4=P3^4;
24 sbit led4=P1^3;
25 sbit led8=P1^7;
26 sbit sda=P1^2;
27 sbit scl=P1^1;
28 uchar buffer[]={0,0,0,0,0,0,0,0}; //数码管键显缓存
29 uchar *pb=&buffer[0];
30 uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
31 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管段码表
32 uchar code wema[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选
33 uchar tempL,tempH;
34 uchar task; //task:按键状态,0:去抖,1:重复的延缓,2:重复
35 bit keydone,keyprocess; //keydone:按键任务完成标志,为1时已完成
36 //keyprocess:按键有效标志,为1时对按键执行
37 bit shans; //shans 为闪烁使能位,1时LED闪,shanz为闪烁状态位,
38 bit shanz; //1时为灭
39 bit keymark; //设定状态标志位
40 uchar blink; //闪烁控制器,某位为1时闪烁。
41 uchar ledtime; //闪烁时间
42 uchar sdate; //显示位置变量
43
44 uchar funcnt; //功能键的个数
45 uchar funval; //最后扫描到的功能键的值
46 uchar keypre=0x00; //存放上次功能键的键值
47 uint num1;
48 void keyXZ(void);
49 void display(uchar pos);
50 /****************************************************************************/
51 /* */
52 /* 所用的延时子程序 */
53 /* */
54 /****************************************************************************/
55 void DelayM(uint a) //延时函数 1MS/次
C51 COMPILER V7.50 WDBJ 03/08/2008 22:56:25 PAGE 2
56 {
57 1 unsigned char i;
58 1 while( --a != 0)
59 1 {
60 2 for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。
61 2 } //i 从0加到125,CPU大概就耗时1毫秒
62 1 }
63 void DelayU(uint b) //延时函数 US级别
64 {
65 1 unsigned char i;
66 1 while( --b != 0)
67 1 {
68 2 for(i = 0; i < 20; i++); //一个 ; 表示空语句,CPU空转。
69 2 }
70 1 }
71 void delay_5us(uchar c) //(2.17*y+5)us延时,11.0592M晶振
72 {
73 1 while(--c);
74 1 }
75 void delay(void)
76 {;;}
77 /******************************************************************/
78 /******************************************************************/
79 /* DS18B20驱动函数 */
80 /******************************************************************/
81 void DS18b20_w_byte(uchar dat);
82 uchar DS18b20_r_byte(void);
83 DS18b20_init(void);
84 uint DS18b20_readTemp(void);
85 /******************************************************************/
86 /* 写一字节函数 */
87 /* 入口参数dat */
88 /******************************************************************/
89 void DS18b20_w_byte(uchar dat) //向18b20写一个字节dat是要写的内容
90 {
91 1 uchar i;
92 1 for(i=0;i<8;i++)
93 1 {
94 2 ds18b20_IO=0;
95 2 ds18b20_IO=0x01&dat;
96 2 delay_5us(15); //要求总时间在60-120us
97 2 ds18b20_IO=1; //释放总线
98 2 dat=dat>>1;
99 2 }
100 1 }
101
102 /******************************************************************/
103 /* 读一字节函数 */
104 /* */
105 /******************************************************************/
106 uchar DS18b20_r_byte(void) //从18b20读一个字节.返回读到的内容
107 {
108 1 uchar i,dat;
109 1 dat=0;
110 1 for(i=0;i<8;i++)
111 1 {
112 2
113 2 ds18b20_IO=0;
114 2 dat=dat>>1;
115 2 ds18b20_IO=1; //释放总线
116 2 if(ds18b20_IO)
117 2 dat|=0x80;
C51 COMPILER V7.50 WDBJ 03/08/2008 22:56:25 PAGE 3
118 2 delay_5us(15); //要求总时间在60-120us
119 2 }
120 1 return dat;
121 1 }
122
123 /******************************************************************/
124 /* ds18b20初始化函数 */
125 /* */
126 /******************************************************************/
127 DS18b20_init(void) //每次上电都给18b20初始化,设置18b20的参数
128 {
129 1 uchar x=0;
130 1 ds18b20_IO=1;
131 1 delay_5us(25);
132 1 ds18b20_IO=0;
133 1 delay_5us(255); //要求480-960us
134 1 ds18b20_IO=1; //释放总线
135 1 delay_5us(40); //要求60-120us
136 1 x=ds18b20_IO; //用X值来判断初始化是否成功
137 1 delay_5us(60);
138 1 }
139
140 /******************************************************************/
141 /* 向DS18B20读温度值 */
142 /* 出口参数DS18b20_temp */
143 /******************************************************************/
144 uint DS18b20_readTemp(void) //读18b20温度值
145 {
146 1 uint DS18b20_temp,t; //读出的18b20温度值存放地
147 1 uchar i;
148 1 float tt=0;
149 1 DS18b20_init();
150 1 DS18b20_w_byte(0xcc); //发送Skip ROM命令
151 1 DS18b20_w_byte(0x44); //发送温度转换命令
152 1 for(i=0;i<7;i++)
153 1 {
154 2 for(sdate=0;sdate<=7;sdate++)
155 2 {
156 3 display(sdate);
157 3 DelayM(3);
158 3 }
159 2 keyXZ();
160 2 }
161 1 DS18b20_init();
162 1 DS18b20_w_byte(0xcc); //发送Skip ROM命令
163 1 DS18b20_w_byte(0xbe); //读温度寄存器(头两个值分别为温度的低和高位
164 1 tempL=DS18b20_r_byte(); //读温度低字节
165 1 tempH=DS18b20_r_byte(); //读温度高字节
166 1 t=tempH;
167 1 t<<=8;
168 1 t|=tempL;
169 1 tt=t*0.0625;
170 1 DS18b20_temp=tt*10+0.5;
171 1 return(DS18b20_temp);
172 1 }
173 //以下为EEPROM所用子函数
174 //起始信号
175 void start()
176 {
177 1 sda=1;
178 1 delay();
179 1 scl=1;
C51 COMPILER V7.50 WDBJ 03/08/2008 22:56:25 PAGE 4
180 1 delay();
181 1 sda=0;
182 1 delay();
183 1 scl=0;
184 1 delay();
185 1 }
186 //停止信号
187 void stop()
188 {
189 1 sda=0;
190 1 delay();
191 1 scl=1;
192 1 delay();
193 1 sda=1;
194 1 delay();
195 1 }
196 //应答
197 void yingda()
198 {
199 1 uchar i=0;
200 1 scl=1;
201 1 delay();
202 1 while((sda==1)&&(i<250))i++;
203 1 scl=0;
204 1 delay();
205 1 }
206 //初始
207 void init()
208 {
209 1 scl=1;
210 1 delay();
211 1 sda=1;
212 1 delay();
213 1 }
214 //写一个字节
215 void write_byte(uchar date)
216 {
217 1 uchar i,temp;
218 1 temp=date;
219 1 for(i=0;i<8;i++)
220 1 {
221 2 temp=temp<<1;
222 2 scl=0;
223 2 delay();
224 2 sda=CY;
225 2 delay();
226 2 scl=1;
227 2 delay();
228 2 }
229 1 scl=0;
230 1 delay();
231 1 sda=1;
232 1 delay();
233 1 }
234 //读一个字节
235 uchar read_byte()
236 {
237 1 uchar i,j,k;
238 1 scl=0;
239 1 delay();
240 1 sda=1;
241 1 for(i=0;i<8;i++)
C51 COMPILER V7.50 WDBJ 03/08/2008 22:56:25 PAGE 5
242 1 {
243 2 delay();
244 2 scl=1;
245 2 delay();
246 2 if (sda==1) j=1;
247 2 else j=0;
248 2 k=(k<<1)|j;
249 2 scl=0;
250 2 }
251 1 delay();
252 1 return k;
253 1 }
254
255 void write_add(uchar dizhi,uchar date)
256 {
257 1 start();
258 1 write_byte(0xa0);
259 1 yingda();
260 1 write_byte(dizhi);
261 1 yingda();
262 1 write_byte(date);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -