?? gettime.lst
字號(hào):
C51 COMPILER V7.06 GETTIME 12/17/2006 14:56:13 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE GETTIME
OBJECT MODULE PLACED IN GetTime.OBJ
COMPILER INVOKED BY: E:\My Electronic\Tools\Design tools\keil7.06\C51\BIN\C51.EXE GetTime.c LARGE OPTIMIZE(SIZE)
stmt level source
1 #include <REG52.H>
2 #include <intrins.h>
3
4 #define DS1307_Addr 0xd0 //前七位為器件地址,最后一位為讀寫(xiě)位,為0時(shí)寫(xiě),為1時(shí)讀
5
6 //端口位定義
7 sbit SDA=P3^5; //模擬I2C數(shù)據(jù)傳送位
8 sbit SCL=P3^4; //模擬I2C時(shí)鐘控制位
9
10 void delay_us(unsigned char us);
11
12 /*******************************************************************
13 起動(dòng)總線(xiàn)函數(shù)
14 函數(shù)原型: void Start_I2c();
15 功能: 啟動(dòng)I2C總線(xiàn),即發(fā)送I2C起始條件.
16 ********************************************************************/
17 void IIC_Start()//在SCL處于高電平狀態(tài),SDA從高電平到低電平的跳變表示數(shù)據(jù)傳輸起始
18 {
19 1 SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號(hào)
20 1 _nop_();
21 1 SCL=1;
22 1 delay_us(5); //起始條件建立時(shí)間大于4.7us,延時(shí)
23 1 SDA=0; //發(fā)送起始信號(hào)
24 1 delay_us(4); //起始條件鎖定時(shí)間大于4us
25 1 SCL=0; //鉗住I2C總線(xiàn),準(zhǔn)備發(fā)送或接收數(shù)據(jù) 起始條件已發(fā)送準(zhǔn)備發(fā)送數(shù)據(jù)
26 1 delay_us(2);
27 1 }
28
29 /*******************************************************************
30 結(jié)束總線(xiàn)函數(shù)
31 函數(shù)原型: void Stop_I2c();
32 功能: 結(jié)束I2C總線(xiàn),即發(fā)送I2C結(jié)束條件.
33 ********************************************************************/
34 void IIC_Stop()//在SCL處于高電平的時(shí)候,SDA從低電平向高電平的跳變表示結(jié)束數(shù)據(jù)傳輸
35 {
36 1 SDA=0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)
37 1 _nop_(); //發(fā)送結(jié)束條件的時(shí)鐘信號(hào)
38 1 SCL=1;
39 1 delay_us(4); //結(jié)束條件建立時(shí)間大于4us
40 1 SDA=1; //發(fā)送I2C總線(xiàn)結(jié)束信號(hào)
41 1 delay_us(4);
42 1 }
43
44 /*******************************************************************
45 字節(jié)數(shù)據(jù)傳送函數(shù)
46 函數(shù)原型: void SendByte(unsigned char c);
47 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對(duì)
48 此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0 假)
49 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無(wú)應(yīng)答或損壞。
50 ********************************************************************/
51 void IIC_SendByte(unsigned char write_data)
52 {
53 1 unsigned char i;
54 1
55 1 for(i=0;i<8;i++) //要傳送的數(shù)據(jù)長(zhǎng)度為8位
C51 COMPILER V7.06 GETTIME 12/17/2006 14:56:13 PAGE 2
56 1 {
57 2 delay_us(2);
58 2 if(write_data&0x80)
59 2 SDA=1; //判斷發(fā)送位
60 2 else
61 2 SDA=0;
62 2 write_data <<= 1;
63 2 delay_us(2);
64 2 SCL=1; //置時(shí)鐘線(xiàn)為高,通知被控器開(kāi)始接收數(shù)據(jù)位
65 2 delay_us(6); //保證時(shí)鐘高電平周期大于4us
66 2 SCL=0;
67 2 }
68 1 SDA=1; //8位發(fā)送完后釋放數(shù)據(jù)線(xiàn),準(zhǔn)備接收應(yīng)答位
69 1 delay_us(5);
70 1 SCL=1;
71 1 while (SDA); //等待應(yīng)答信號(hào)
72 1 _nop_();
73 1 SCL = 0;
74 1 }
75
76 /*******************************************************************
77 字節(jié)數(shù)據(jù)接收函數(shù)
78 函數(shù)原型: unsigned char RcvByte();
79 功能: 用來(lái)接收從器件傳來(lái)的數(shù)據(jù),并判斷總線(xiàn)錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),
80 發(fā)完后請(qǐng)用應(yīng)答函數(shù)。
81 ********************************************************************/
82 unsigned char IIC_ReadByte()
83 {
84 1 unsigned char iic_data_temp,i; //iic_data_temp用來(lái)接受數(shù)據(jù)
85 1
86 1 SDA=1; //置數(shù)據(jù)線(xiàn)為輸入方式,釋放數(shù)據(jù)總線(xiàn)
87 1 for(i=0;i<8;i++)
88 1 {
89 2 delay_us(3);
90 2 SCL = 0; //置時(shí)鐘線(xiàn)為低,準(zhǔn)備接收數(shù)據(jù)位,SDA變化在這段時(shí)間出現(xiàn)
91 2 delay_us(6); //時(shí)鐘低電平周期大于4.7us
92 2 SCL = 1; //置時(shí)鐘線(xiàn)為高使數(shù)據(jù)線(xiàn)上數(shù)據(jù)有效
93 2 delay_us(2);
94 2 iic_data_temp <<= 1;
95 2 if(SDA)
96 2 iic_data_temp +=1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入iic_data_temp中
97 2 delay_us(2);
98 2 }
99 1 SCL=0;
100 1 _nop_();
101 1 return(iic_data_temp);
102 1 }
103
104
105 /********************************************************************
106 應(yīng)答子函數(shù)
107 原型: void Ack_I2c(bit a);
108 功能:主控器進(jìn)行應(yīng)答信號(hào),(可以是應(yīng)答或非應(yīng)答信號(hào))
109 ********************************************************************/
110 void IIC_Ack(bit a)
111 {
112 1
113 1 if(a==0)
114 1 SDA=0; //在此發(fā)出應(yīng)答或非應(yīng)答信號(hào)
115 1 else
116 1 SDA=1;
117 1 delay_us(3);
C51 COMPILER V7.06 GETTIME 12/17/2006 14:56:13 PAGE 3
118 1 SCL=1;
119 1 delay_us(6); //時(shí)鐘低電平周期大于4us
120 1 SCL=0; //清時(shí)鐘線(xiàn),鉗住I2C總線(xiàn)以便繼續(xù)接收
121 1 _nop_();
122 1 }
123
124
125
126 unsigned char DS1307_Read(unsigned char Addr)
127 {
128 1 unsigned char read_data; //存放讀出的數(shù)據(jù)
129 1
130 1 //隨機(jī)讀取,先進(jìn)行偽寫(xiě),使指針移到要讀的單元
131 1 IIC_Start(); //啟動(dòng)總線(xiàn)
132 1 IIC_SendByte(DS1307_Addr); //發(fā)送器件地址
133 1 IIC_SendByte(Addr); //發(fā)送要寫(xiě)的地址
134 1
135 1 //讀取單元內(nèi)容
136 1 IIC_Start();
137 1 IIC_SendByte(DS1307_Addr+1);
138 1 read_data=IIC_ReadByte();
139 1 IIC_Ack(1);
140 1 IIC_Stop();
141 1 return(read_data);
142 1 }
143
144
145 void DS1307_Write(unsigned char Addr,unsigned char wdata)
146 {
147 1 IIC_Start(); //啟動(dòng)總線(xiàn)
148 1 IIC_SendByte(DS1307_Addr); //發(fā)送器件地址
149 1 IIC_SendByte(Addr); //發(fā)送要寫(xiě)的地址
150 1 IIC_SendByte(wdata);
151 1 IIC_Stop();
152 1 }
153
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 293 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 8
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -