📄 74hc595.lst
字号:
C51 COMPILER V8.05a 74HC595 05/07/2009 13:38:40 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE 74HC595
OBJECT MODULE PLACED IN 74HC595.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 74HC595.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<absacc.h>
2 #include<stdlib.h>
3 #include <reg52.h>
4 #include <intrins.h> /*used for _nop_() function*/
5 #define uchar unsigned char
6 #define uint unsigned int
7 #define ulong unsigned long
8
9 sbit SDATA_595 =P1^0 ;/*串行数据输入*/
10 sbit SCLK_595 = P1^1;/*移位时钟脉冲*/
11 sbit RCK_595 =P1^2 ; /*输出锁存器控制脉冲*/
12 sbit YELLOW=P2^0; //黄色
13 sbit ALARM=P2^1; //报警
14 sbit RED=P2^2; //红色
15 sbit CS=P2^6;
16 bit b_flash;
17 sbit SCLK=P0^6;//时钟输入.
18 sbit IO=P0^7;//读写数据.
19 sbit RST=P0^5;//芯片复位.
20
21 uchar bdata dat;//
22 sbit dat0=dat^0;//
23 sbit dat7=dat^7;
24
25 uchar arr_RTC[7];
26 uchar counter;
27 bit b_flash;
28
29 uchar scan;
30 uchar Temp;
31 uchar Dis_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /*0~9的共阴极段码表*/
32 uchar Dis_Date[5];
33 int countv;
34 int count,countv;
35 uchar bdata dat;
36
37 void delay(int i)
38 {
39 1 for(i=1000;i>0;i--)
40 1 {
41 2 _nop_();
42 2 }
43 1 }
44 /***************************
45 初始化(定时器0为定时器,定时器1为计数器)
46 ***************************/
47
48 void Init()
49 {
50 1 TMOD=0x51;
51 1 TL0 = -50000%256;
52 1 TH0 = -50000/256; //50ms定时
53 1
54 1 TR0 = 1; //"T0运行控制"
55 1 ET0 = 1; //1"定时器0中断允许"
C51 COMPILER V8.05a 74HC595 05/07/2009 13:38:40 PAGE 2
56 1 TR1 = 1; //"T1运行控制"
57 1
58 1 TH1=TL1=0;
59 1 EA=1; //总中断允许
60 1 counter=0; //计数器清零
61 1 }
62
63 void UPdate()
64 {
65 1
66 1 // int TM_hour=12;
67 1 // int TM_minute=23;
68 1 // float data temp2;//定义存放计算得到的速度值
69 1
70 1 //temp2=3.6*t*0.6*counter;
71 1
72 1 // Temp=(unsigned int)temp2;//强制转型
73 1
74 1 Temp=19;
75 1 Dis_Date[5]=Temp%10;
76 1 Dis_Date[4]=Temp/10;
77 1
78 1
79 1
80 1 }
81 /*写数据到74HC595函数*/
82 void WR_595(unsigned char data num2 )
83 {
84 1 unsigned char data count1;
85 1
86 1 for(count1=0;count1<=7;count1++)
87 1 {
88 2 num2<<=1; /*右移位*/
89 2 SDATA_595=CY;
90 2 _nop_();
91 2 _nop_();
92 2 SCLK_595=0;
93 2 _nop_();
94 2 _nop_();
95 2 SCLK_595=1; /*产生上生沿*/
96 2
97 2 }
98 1
99 1 }
100
101 /****************************************************************/
102 /*更新74HC595输出数据函数void Out_595(void)*/
103 void Out_595(void)
104 {
105 1 RCK_595=0;
106 1 _nop_();
107 1 _nop_();
108 1 RCK_595=1; /*上升沿锁存数据*/
109 1
110 1
111 1 }
112
113 void Led_Drive(void)
114 {
115 1 int i;
116 1
117 1
C51 COMPILER V8.05a 74HC595 05/07/2009 13:38:40 PAGE 3
118 1 {
119 2
120 2 for(i=0;i<=5;i++)//一次输出六位
121 2 {
122 3 WR_595(Dis_Tab[Dis_Date[i]]);
123 3 }
124 2 {
125 3 Out_595();
126 3 delay(1000);
127 3 }
128 2 TL1=0;
129 2
130 2 }
131 1
132 1
133 1 }
134
135
136 /*****************************
137 功能:往DS1302写入1Byte数据
138 输入:wr_data写入的数据
139 返回值:无
140 *******************************/
141 void wr_1302(uchar wr_data)
142 {
143 1 uchar i;
144 1 RST=1;//启动数据传送.
145 1 SCLK=0;
146 1 _nop_(); _nop_();_nop_();
147 1 dat=wr_data;//读数据.
148 1 for(i=8;i>0;i--)//循环8次,写入数据.从低位到高位.
149 1 {
150 2 IO=dat0;//将dat0的值赋给时钟数据线.
151 2 _nop_();
152 2 _nop_();
153 2 SCLK=1;//时钟上升沿写入数据.
154 2 _nop_();
155 2 SCLK=0;
156 2 dat=dat>>1;//将高位数据移至dat0;
157 2 }
158 1 }
159 /*****************************
160 功能:从DS1302读出1Byte数据
161 返回值:dat
162 *******************************/
163 uchar rd_1302(void)
164 {
165 1 uchar i;//
166 1
167 1 RST=1;//启动数据传送.
168 1 _nop_();
169 1 for(i=8;i>0;i--)// //循环8次,读出数据.从低位到高位.
170 1 {
171 2 dat=dat>>1;//右移一位
172 2 dat7=IO;//读时钟数据总线
173 2 _nop_();
174 2 SCLK=1;
175 2 _nop_();
176 2 SCLK=0;//时钟下降沿读出数据
177 2 _nop_();
178 2 }
179 1 return (dat);
C51 COMPILER V8.05a 74HC595 05/07/2009 13:38:40 PAGE 4
180 1 }
181 /********************************************************************
182 * 名称: uc_R1302
183 * 说明: 先写地址,后读命令/数据
184 * 功能: 读取DS1302某地址的数据
185 * 调用: v_RTInputByte() , uc_RTOutputByte()
186 * 输入: ucAddr: DS1302地址
187 * 返回值: ucDa :读取的数据
188 ***********************************************************************/
189 uchar uc_R1302(uchar ucAddr)
190 {
191 1 uchar ucDa;
192 1 RST = 0;
193 1 SCLK = 0;
194 1 RST = 1;
195 1 wr_1302 (ucAddr); // 地址,命令
196 1 ucDa=rd_1302 (); //读1Byte数据
197 1 SCLK = 1;
198 1 RST =0;
199 1 return (ucDa);
200 1 }
201 /********************************************************************
202 * 名称: v_W1302
203 * 说明: 先写地址,后写命令/数据
204 * 功能: 往DS1302写入数据
205 * 调用: v_RTInputByte()
206 * 输入: ucAddr: DS1302地址, ucDa: 要写的数据
207 * 返回值: 无
208 ***********************************************************************/
209 void v_W1302(uchar ucAddr, uchar ucDa)
210 {
211 1 RST = 0;
212 1 SCLK = 0;
213 1 RST = 1;
214 1 wr_1302(ucAddr); // 地址,命令
215 1 wr_1302(ucDa); // 写1Byte数据
216 1 SCLK = 1;
217 1 RST =0;
218 1 }
219
220 void RTC_RD_Time ()
221 {
222 1 uchar i,add = 0x81;
223 1
224 1 for (i=0;i<7;i++)
225 1 {
226 2 arr_RTC[i] = uc_R1302(add); //读秒
227 2 add += 2;
228 2 }
229 1 /*
230 1 arr_RTC[0] 秒
231 1 arr_RTC[1] 分
232 1 arr_RTC[2] 时
233 1 arr_RTC[3] 日
234 1 arr_RTC[4] 月
235 1 arr_RTC[5] 星期
236 1 arr_RTC[6] 年
237 1 */
238 1 }
239 void RTC_initial ()
240 {
241 1 v_W1302(0x8e,0x00); //使能
C51 COMPILER V8.05a 74HC595 05/07/2009 13:38:40 PAGE 5
242 1 v_W1302(0x80,0x80); //停止晶振
243 1 v_W1302(0x90,0x00); //关闭充电
244 1 v_W1302(0x8c,0x07); //设置年
245 1 v_W1302(0x8a,0x06); //设置周
246 1 v_W1302(0x88,0x01); //设置月
247 1 v_W1302(0x86,0x13); //设置日
248 1 v_W1302(0x84,0x18); //设置小时
249 1 v_W1302(0x82,0x05); //设置分
250 1 v_W1302(0x80,0x00); //启动晶振,设置秒
251 1 v_W1302(0x8e,0x80); //使能
252 1 }
253
254 void RTC_set_time ()
255 {
256 1 v_W1302(0x8e,0x00); //使能
257 1 v_W1302(0x80,0x80); //停止晶振
258 1 v_W1302(0x90,0x00); //关闭充电
259 1 v_W1302(0x8c,arr_RTC[6]); //设置年
260 1 v_W1302(0x8a,arr_RTC[5]); //设置周
261 1 v_W1302(0x88,arr_RTC[4]); //设置月
262 1 v_W1302(0x86,arr_RTC[3]); //设置日
263 1 v_W1302(0x84,arr_RTC[2]); //设置小时
264 1 v_W1302(0x82,arr_RTC[1]); //设置分
265 1 arr_RTC[0] &= 0x7f;
266 1 v_W1302(0x80,arr_RTC[0]); //启动晶振,设置秒
267 1 v_W1302(0x8e,0x80); //使能
268 1 }
269
270
271 void Sys_initial ()
272 {
273 1 //sbit SCLK=P1^6;//时钟输入.
274 1 //sbit IO=P1^7;//读写数据.
275 1 //sbit RST=P3^3;//芯片复位.
276 1 //P3^4 = 0;
277 1 // BEEP=0;
278 1 SCLK=0; RST=0;
279 1
280 1 ET0=1;
281 1 TMOD=0x01;
282 1 EA=1;
283 1
284 1 TH0=-(20000/256);// TH0=0xB1;22118
285 1 TL0=-(20000%256);// TL0=0xDF; // 20000nS(20ms)
286 1 TR0=1;
287 1 }
288
289 /*void Time0 (void) interrupt 1
290 {
291 TH0=-(22000/256);//20ms //18432
292 TL0=-(22000%256);//20ms
293 //b_disp = ~b_disp;
294 counter++;
295 if (counter>=25)
296 {
297 counter=0;
298 b_flash = ~b_flash;
299 }
300
301 } */
302
303 void main (void)
C51 COMPILER V8.05a 74HC595 05/07/2009 13:38:40 PAGE 6
304 {
305 1 Sys_initial ();
306 1 RTC_initial ();
307 1 // EPIN=0;
308 1
309 1 while (1)
310 1 {
311 2 if (b_flash)
312 2 { b_flash=0;
313 3 RTC_RD_Time ();
314 3 delay(10);
315 3 // display ();
316 3 }
317 2 }
318 1 }
319 /****************************************************************/
320 /* main()
321 {
322 SCON = 0x00;
323 CS=0;
324 // In12887();
325 Init();
326 while(1)
327 {
328 Dis_Date[3]=arr_RTC[0]%10;
329 Dis_Date[2]=arr_RTC[0]/10;
330 Dis_Date[1]=arr_RTC[1]%10;
331 Dis_Date[0]=arr_RTC[1]/10;
332 //if(scan==0)
333 // scan = 0;
334 // counter=TL1;
335 // UPdate();
336 // Led_Drive();
337 //把定时器的数据传给计数器
338
339 }
340
341
342 } */
343 void Time0 (void) interrupt 1
344 {
345 1
346 1 //uchar scan;
347 1 TR0=0;
348 1 delay(1000);
349 1 scan++;
350 1 if(scan==20)
351 1 { scan = 0;
352 2 counter=TL1;
353 2 UPdate();
354 2 Led_Drive();
355 2 }
356 1
357 1 TL0 = -50000%256;
358 1 TH0 = -50000/256; //50ms定时
359 1 TR0=1;
360 1 }
361
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 495 ----
C51 COMPILER V8.05a 74HC595 05/07/2009 13:38:40 PAGE 7
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 30 ----
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 + -