51单片机连接24C02-C语言测试代码

发布者:pengbinyyy最新更新时间:2017-01-18 来源: eefocus关键字:51单片机  24C02  测试代码 手机看文章 扫描二维码
随时随地手机看文章

我总结3点需要注意的地方


1.关闭非IIC通信器件,比如我的开发板SDA和SCL也连接了DS1302,造成干扰会没有结果。


2.IIC通信的应答,发送端在SCL为0时将SDA置1,等待接收端拉低SDA;接收端在拉低SDA持续一个周期后,应将SDA置1释放总线。


主机作为发送端等待应答


SDA=1;

SCL=1;

while(SDA);

SCL=0;

主机作为接收端,进行应答或不应答


SDA=0;    //不应答则为1    

SCL=1;

SCL=0;

SDA=1;

3.24C02在写入周期完成后还有有内部写入时间Twr,所以可以查手册加入适当时间的延时函数,或者使用查询应答的方式进行延时等待。


总之,关键是注意参考数据手册及IIC总线规范,尤其是芯片的特别说明以及时序的控制,再结合代码就能弄懂了。


下面是我写的代码,用上了所有的功能,包括 Current Read 对应的函数 readnext() 。多字节写入时不用考虑分页问题,函数自动解决,直接给数组即可。使用数码管显示结果。


  1 #include

  2 

  3 sbit RST=P2^4;    //用来关闭ds1302

  4 

  5 

  6 sbit SDA=P2^0;                         

  7 sbit SCL=P2^1;

  8 //内部使用的函数

  9 bit start(unsigned char dev);

 10 void stop(void);

 11 bit write_byte(unsigned char dat);

 12 unsigned char read_byte(bit ack);

 13 void waitack(void);

 14 //外部使用

 15 void writes(unsigned char address,unsigned char dat[],unsigned char num);

 16 void reads(unsigned char address,unsigned char dat[],unsigned char num);

 17 unsigned char read(unsigned char address);

 18 void write(unsigned char address,unsigned char dat);

 19 unsigned char readnext(void);

 20 

 21 /*数码管部分*/

 22 sbit du=P2^6;

 23 sbit we=P2^7;

 24 void display(void);

 25 void delayms(unsigned time);

 26 unsigned char code table[]={

 27 0x3f,0x06,0x5b,0x4f,

 28 0x66,0x6d,0x7d,0x07,

 29 0x7f,0x6f,0x77,0x7c,

 30 0x39,0x5e,0x79,0x71};

 31 unsigned char num[6]={0};

 32 

 33 

 34 void main(void)

 35 {

 36     //测试用数据

 37     unsigned char a[9]={2,3,5,7,13,15,11,4,8};

 38     unsigned char b[13]={0};

 39 

 40     RST=0;    //关闭ds1302消除影响

 41 

 42     write(11,6);

 43     write(12,1);

 44     writes(2,a,9);

 45     b[9]=readnext();    //b[9]=6

 46     b[10]=readnext();    //b[10]=1

 47     reads(2,b,9);        //b[0-8]=a[0-8]

 48     b[11]=readnext();    //b[11]=6

 49     b[12]=read(12);        //b[12]=1

 50     

 51     num[5]=b[3];

 52     num[4]=b[6];

 53     num[3]=b[9];

 54     num[2]=b[10];

 55     num[1]=b[11];

 56     num[0]=b[12];

 57     

 58     while(1)

 59     {

 60         display();

 61     } 

 62 }

 63 

 64 //传入设备地址,返回设备是否应答

 65 bit start(unsigned char dev)

 66 {    

 67     SDA=1;

 68     SCL=1;

 69     SDA=0;

 70     SCL=0;

 71     return write_byte(dev);

 72 }

 73 

 74 void stop(void)

 75 {

 76     SDA=0;

 77     SCL=1;

 78     SDA=1;

 79 }

 80 

 81 //传入要写入的字节,返回设备是否应答

 82 bit write_byte(unsigned char dat)

 83 {

 84     unsigned char i=8;

 85     bit ack;

 86     while(i--)

 87     {

 88         dat<<=1;

 89         SDA=CY;

 90         SCL=1;

 91         SCL=0;

 92     }

 93     SDA=1;        //接收设备应答

 94     SCL=1;

 95     ack=~SDA;

 96     SCL=0;

 97     return ack;

 98 }

 99 

100 //在写入后等待24c02完成内部写入

101 //恢复响应的时间为手册中的twr

102 void waitack(void)    

103 {                        

104     while(!start(0xa0));                

105     stop();

106 }

107 

108 //传入是否应答设备,返回读取的字节

109 unsigned char read_byte(bit ack)

110 {

111     unsigned char i=8,ret;

112     

113     while(i--)

114     {

115         ret<<=1;

116         SCL=1;

117         ret|=SDA;

118         SCL=0;

119     }

120     SDA=~ack;    //应答或不应答设备

121     SCL=1;

122     SCL=0;

123     SDA=1;    //应答时要注意的时序

124     return ret;

125 }

126 

127 //传入写入地址,数组,写入字节数

128 //函数自动进行分页写入

129 void writes(unsigned char address,unsigned char dat[],unsigned char num)

130 {

131     unsigned char i;

132     

133     for(i=0;i

134     {

135         start(0xa0);

136         write_byte(address);

137         do

138             write_byte(dat[i++]);

139         while(++address&0x07 && i

140         stop();

141         waitack();    //延时等待以完成内部写入

142     }    

143 }

144 

145 //传入读取地址,接收用的数组,读取字节数

146 void reads(unsigned char address,unsigned char dat[],unsigned char num)

147 {

148     unsigned char i;    

149 

150     start(0xa0);

151     write_byte(address);

152 

153     start(0xa1);

154 

155     for(i=0;i

156         dat[i]=read_byte(1);

157 

158     dat[i]=read_byte(0);

159     stop();

160 }

161 

162 void write(unsigned char address,unsigned char dat)

163 {

164     writes(address,&dat,1);

165 }

166 

167 unsigned char read(unsigned char address)

168 {

169     unsigned char ret;

170     reads(address,&ret,1);

171     return ret;

172 }

173 

174 //对应手册中的Current Read

175 unsigned char readnext(void)

176 {

177     unsigned char ret;

178     start(0xa1);

179     ret=read_byte(0);

180     stop();

181     return ret;

182 }

183 

184 void delayms(unsigned time)

185 {

186     unsigned i,j;

187 

188     for(i=time;i>0;i--)

189         for(j=110;j>0;j--)

190         ;

191 }

192 

193 void display(void)

194 {

195     unsigned char i;

196     

197     for(i=0;i<6;i++)

198     {

199         P0=0;

200         du=1;

201         du=0;

202 

203         P0=~(0x20>>i);

204         we=1;

205         we=0;

206 

207         P0=table[num[i]];

208         du=1;

209         du=0;

210 

211         delayms(1);

212     }

213 }


关键字:51单片机  24C02  测试代码 引用地址:51单片机连接24C02-C语言测试代码

上一篇:单片机计数器T0作定时技术(记时器设计)
下一篇:51单片机产生1Hz-5kHz可调占空比方波

推荐阅读最新更新时间:2024-03-16 15:31

51单片机温度报警DS18B20系统程序
51单片机温度报警DS18B20系统程序: #include AT89X52.h #include stdio.h #define uint unsigned int #define uchar unsigned char //宏定义 #define SET P3_1 //定义调整键 #define DEC P3_2 //定义减少键 #define ADD P3_3 //定义增加键 #define BEEP P3_7 //定义蜂鸣器 #define DQ P3_6 //定义DS18B20总线I/O bit shanshuo_st; //闪烁间隔标志 bit beep_st; //蜂鸣器间隔标志 sbit
[单片机]
51单片机C编程(十、74LS165串口输入)
通过74ls165将按键的状态串口输入到51单片机,在数码管上显示出来,每个按键对应数码管上的一段。 proteus仿真电路图如下: #include reg51.h sbit SL=P3^7 //串口接收启动端口:0- 1启动。 #define LEDPORT P0; void main() { unsigned char ucCount; SCON=0x10; //设置串口模式:模式0,允许接收。 while(1) { SL=0; SL=1; //启动接收。 while(RI==0); LEDPORT=SBUF; //转存数据。 RI=0;
[单片机]
51单片机-指令周期与LED闪烁
之前讲了如何点亮LED,包括硬件电路和程序,今天说一下如何让LED闪烁。单片机控制LED闪烁有两种方法,一种是软件延时,另一种是定时器中断。因为涉及到单片机指令集的问题,还有一些简单的C语言,今天只讲第一种。 先说指令集,早期的51单片机都是复杂指令集,因为沿用的习惯现在用的STC89C52单片机也是复杂指令集,和复杂指令集对应的,就是精简指令集,常见的有AVR和430单片机。 这两种指令集的区别是啥?最明显的就是一条指令执行的时间,举个例子:51单片机和AVR单片机都外接一个12M的晶体,一个时钟周期是1/12M=1/12US,执行一条单周期指令(多周期指令不考虑)需要多少时间? 51单
[单片机]
学<font color='red'>51单片机</font>-指令周期与LED闪烁
如何区分51单片机中的单周期和双周期指令
最可靠的是查指令表。不过可以提供一个我总结的规律,可帮助记忆。你可在此基础上完善: 此规律应按照顺序进行判断,前一条原则高于后一条(主要指2~6),按顺序检查到哪一条满足,就归属哪一类! 1、MUL、DIV:仅有的4周期指令 2、包含DPTR和PC的指令均为2周期指令 3、所有的绝对跳转和条件转移指令,均为2周期指令 4、所有包括A寄存器的指令,均为单周期指令 5、位操作指令中,ANL和ORL是2周期指令 6、所有包含立即地址的指令,除INC direct及DEC direct外,均为2周期指令 7、剩下的均为单周期指令。
[单片机]
51单片机入门 - 串口通信实验(模拟串口通信/多机通信实例)
RS232串口应用实例 设计要求: 通过串口发送接收数据(串口工作方式1) 实现思路: 定时器设置 串口设置 工作方式 波特率 开启定时/计数器 串口执行 接收数据 发送数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 实现代码: 1 #include reg51.h 2 main() 3 { 4 TMOD = 0x20; 5 SM0
[单片机]
<font color='red'>51单片机</font>入门 - 串口通信实验(模拟串口通信/多机通信实例)
C51单片机在电机转速测量仿真系统中的设计
单片机电机转速测量系统仿真系统采用单片机中T1计数器对转速脉冲进行计数。定时器T1 工作于外部事件计数方式,对转速脉冲计数; T0 工作于定时器方式。每到1 s 读1 次计数值,此值即为脉冲信号的频率,根据式( 1) 可计算出电机的转速。转速检测装置的软件系统主要包括: 测速主程序、数据处理子程序和显示子程序。单片机上电后,系统进入准备状态。首先进行初始化,然后读取脉冲数据进行运算,将转速显示在LCD上。需要这款仿真及C语言程序的爱好者可从文章配图左上角网址上了解。 该单片机电机转速测量系统仿真仿真采用测频法“M法”测量电机转速。即在一定测量时间T内,测量脉冲发生器(替代输入脉冲)产生的脉冲数m1来测量转速,计算式如下:n=
[单片机]
C<font color='red'>51单片机</font>在电机转速测量仿真系统中的设计
51单片机之存储器
51单片机结构: 思维结构很重要: 由上图可知,51单片机的存储器分为俩大部分:程序存储器ROM和数据存储器RAM,这一点有别与计算机 程序存储器ROM: 1、 程序存储器ROM顾名思义,存放程序的地方,程序指令指导单片机完成设定的功能 2、 51单片机专门设置一个16位的PC,用于指示下一时刻CPU将要执行的程序指令在ROM中的位置,由于PC指针长度位16位,所以单片机的程序存储器ROM空间大小为2^16 = 64Kb,从0000~FFFFH 3、 ROM还可以细分为片内ROM和片外ROM 片内ROM: 8051片内有4KB ROM,地址范围从0000H~0FFFH 片外ROM: 片外可扩展,一般从1000H~F
[单片机]
<font color='red'>51单片机</font>之存储器
51单片机的13%26#215;14点阵缩码汉卡
我们历时数载,开发成“51单片机13%26;#215;14点阵缩码汉卡”,适用于目前国内外应用最为广泛的MCSX-51及其兼容系列单片机。 与此同时,还开发了13%26;#215;14点阵汉字字模。13%26;#215;14点阵字模,可完全与目前通用的16%26;#215;16点阵汉字字模媲美,其在单片机和嵌入式系统的汉字显示应用中也具有明显的经济价值和实用意义。 1 单片机目前的汉字显示 信息交流的最主要方式之一即文字交流,但由于我国方块汉字数量繁多,构形迥异,使汉字显示一直是我国计算机普及的障碍。随着计算机技术的迅速发展,PC机的汉字显示已不成问题。但对于成本低、体积小、应用灵活且用量极为巨大的单片机而言,因其结构简单,
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved