📄 51
字号:
C51 COMPILER V8.09 EX85 07/12/2010 14:45:58 PAGE 1
C51 COMPILER V8.09, COMPILATION OF MODULE EX85
OBJECT MODULE PLACED IN ex85.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE ex85.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //将数据"0x0f"写入AT24C08再读出送P0口显示
2 #include <reg52.h> // 包含51单片机寄存器定义的头文件
3 #include <intrins.h> //包含_nop_()函数定义的头文件
4 #define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B
5 #define OP_WRITE 0xa0 // 器件地址以及写入操作,0xa1即为1010 0000B
6 sbit SDA=P3^5; //将串行数据总线SDA位定义在为P3.5引脚
7 sbit SCL=P3^4; //将串行时钟总线SDA位定义在为P3.4引脚
8
9 /*****************************************************
10 函数功能:延时1ms
11 (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
12 ***************************************************/
13 void delay1ms()
14 {
15 1 unsigned char i,j;
16 1 for(i=0;i<10;i++)
17 1 for(j=0;j<33;j++)
18 1 ;
19 1 }
20
21 /*****************************************************
22 函数功能:延时若干毫秒
23 入口参数:n
24 ***************************************************/
25 void delaynms(unsigned char n)
26 {
27 1 unsigned char i;
28 1 for(i=0;i<n;i++)
29 1 delay1ms();
30 1 }
31 /***************************************************
32 函数功能:开始数据传送
33 ***************************************************/
34 void start()
35 // 开始位
36 {
37 1 SDA = 1; //SDA初始化为高电平“1”
38 1 SCL = 1; //开始数据传送时,要求SCL为高电平“1”
39 1 _nop_(); //等待一个机器周期
40 1 _nop_(); //等待一个机器周期
41 1 _nop_(); //等待一个机器周期
42 1 _nop_(); //等待一个机器周期
43 1 SDA = 0; //SDA的下降沿被认为是开始信号
44 1 _nop_(); //等待一个机器周期
45 1 _nop_(); //等待一个机器周期
46 1 _nop_(); //等待一个机器周期
47 1 _nop_(); //等待一个机器周期
48 1 SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
49 1 }
50 /***************************************************
51 函数功能:结束数据传送
52 ***************************************************/
53 void stop()
54 // 停止位
55 {
C51 COMPILER V8.09 EX85 07/12/2010 14:45:58 PAGE 2
56 1 SDA = 0; //SDA初始化为低电平“0” _n
57 1 SCL = 1; //结束数据传送时,要求SCL为高电平“1”
58 1 _nop_(); //等待一个机器周期
59 1 _nop_(); //等待一个机器周期
60 1 _nop_(); //等待一个机器周期
61 1 _nop_(); //等待一个机器周期
62 1 SDA = 1; //SDA的上升沿被认为是结束信号
63 1 _nop_(); //等待一个机器周期
64 1 _nop_(); //等待一个机器周期
65 1 _nop_(); //等待一个机器周期
66 1 _nop_(); //等待一个机器周期
67 1 SDA=0;
68 1 SCL=0;
69 1 }
70 /***************************************************
71 函数功能:从AT24Cxx读取数据
72 出口参数:x
73 ***************************************************/
74 unsigned char ReadData()
75 // 从AT24Cxx移入数据到MCU
76 {
77 1 unsigned char i;
78 1 unsigned char x; //储存从AT24Cxx中读出的数据
79 1 for(i = 0; i < 8; i++)
80 1 {
81 2 SCL = 1; //SCL置为高电平
82 2 x<<=1; //将x中的各二进位向左移一位
83 2 x|=(unsigned char)SDA; //将SDA上的数据通过按位“或“运算存入x中
84 2 SCL = 0; //在SCL的下降沿读出数据
85 2 }
86 1 return(x); //将读取的数据返回
87 1 }
88 /***************************************************
89 函数功能:向AT24Cxx的当前地址写入数据
90 入口参数:y (储存待写入的数据)
91 ***************************************************/
92 //在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0
93 bit WriteCurrent(unsigned char y)
94 {
95 1 unsigned char i;
96 1 bit ack_bit; //储存应答位
97 1 for(i = 0; i < 8; i++) // 循环移入8个位
98 1 {
99 2 SDA = (bit)(y&0x80); //通过按位“与”运算将最高位数据送到S
100 2 //因为传送时高位在前,低位在后
101 2 _nop_(); //等待一个机器周期
102 2 SCL = 1; //在SCL的上升沿将数据写入AT24Cxx
103 2 _nop_(); //等待一个机器周期
104 2 _nop_(); //等待一个机器周期
105 2
106 2 SCL = 0; //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
107 2 y <<= 1; //将y中的各二进位向左移一位
108 2 }
109 1 SDA = 1; // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,
110 1 //以让SDA线转由接收设备(AT24Cxx)控制
111 1 _nop_(); //等待一个机器周期
112 1 _nop_(); //等待一个机器周期
113 1 SCL = 1; //根据上述规定,SCL应为高电平
114 1 _nop_(); //等待一个机器周期
115 1 _nop_(); //等待一个机器周期
116 1 _nop_(); //等待一个机器周期
117 1 _nop_(); //等待一个机器周期
C51 COMPILER V8.09 EX85 07/12/2010 14:45:58 PAGE 3
118 1 ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
119 1 //若送高电平,表示没有接收到,传送异常
120 1 SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
121 1 return ack_bit; // 返回AT24Cxx应答位
122 1 }
123 /***************************************************
124 函数功能:向AT24Cxx中的指定地址写入数据
125 入口参数:add (储存指定的地址);dat(储存待写入的数据)
126 ***************************************************/
127 void WriteSet(unsigned char add, unsigned char dat)
128 // 在指定地址addr处写入数据WriteCurrent
129 {
130 1 start(); //开始数据传递
131 1 WriteCurrent(OP_WRITE); //选择要操作的AT24Cxx芯片,并告知要对其写入数据
132 1 WriteCurrent(add); //写入指定地址
133 1 WriteCurrent(dat); //向当前地址(上面指定的地址)写入数据
134 1 stop(); //停止数据传递
135 1 delaynms(4); //1个字节的写入周期为1ms, 最好延时1ms以上
136 1 }
137 /***************************************************
138 函数功能:从AT24Cxx中的当前地址读取数据
139 出口参数:x (储存读出的数据)
140 ***************************************************/
141 unsigned char ReadCurrent()
142 {
143 1 unsigned char x;
144 1 start(); //开始数据传递
145 1 WriteCurrent(OP_READ); //选择要操作的AT24Cxx芯片,并告知要读其数据
146 1 x=ReadData(); //将读取的数据存入x
147 1 stop(); //停止数据传递
148 1 return x; //返回读取的数据
149 1 }
150 /***************************************************
151 函数功能:从AT24Cxx中的指定地址读取数据
152 入口参数:set_addr
153 出口参数:x
154 ***************************************************/
155 unsigned char ReadSet(unsigned char set_addr)
156 // 在指定地址读取
157 {
158 1 start(); //开始数据传递
159 1 WriteCurrent(OP_WRITE); //选择要操作的AT24Cxx芯片,并告知要对其写入数据
160 1 WriteCurrent(set_addr); //写入指定地址
161 1 return(ReadCurrent()); //从指定地址读出数据并返回
162 1 }
163 /***************************************************
164 函数功能:主函数
165 ***************************************************/
166 main(void)
167 {
168 1 SDA = 1; // SDA=1,SCL=1,使主从设备处于空闲状态
169 1 SCL = 1;
170 1 WriteSet(0x36,0x0f); //在指定地址“0x36”中写入数据“0x0f”
171 1 P1=ReadSet(0x36); //从指定地址“0x36中读取数据并送P1口显示
172 1
173 1 }
174
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 207 ----
CONSTANT SIZE = ---- ----
C51 COMPILER V8.09 EX85 07/12/2010 14:45:58 PAGE 4
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -