[51单片机] EEPROM 24c02 + 数码管 + 中断 [统计开机次数]

>_<:24c02的SCL连P2.0;SDA连P2.1;WP接GND;P0接8位数码管的8针;P2.2连段码;P2.3连位码;

>_<:delay.c


 1 #include "delay.h"
2 /*------------------------------------------------
3 uS延时函数,含有输入参数 unsigned char t,无返回值
4 unsigned char 是定义无符号字符变量,其值的范围是
5 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
6 长度如下 T=tx2+5 uS
7 ------------------------------------------------*/
8 void DelayUs2x(unsigned char t)
9 {
10 while(--t);
11 }
12 /*------------------------------------------------
13 mS延时函数,含有输入参数 unsigned char t,无返回值
14 unsigned char 是定义无符号字符变量,其值的范围是
15 0~255 这里使用晶振12M,精确延时请使用汇编
16 ------------------------------------------------*/
17 void DelayMs(unsigned char t)
18 {
19 while(t--)
20 {
21 //大致延时1mS
22 DelayUs2x(245);
23 DelayUs2x(245);
24 }
25 }

>_<:delay.h


 1 #ifndef __DELAY_H__
2 #define __DELAY_H__
3 /*------------------------------------------------
4 uS延时函数,含有输入参数 unsigned char t,无返回值
5 unsigned char 是定义无符号字符变量,其值的范围是
6 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
7 长度如下 T=tx2+5 uS
8 ------------------------------------------------*/
9 void DelayUs2x(unsigned char t);
10 /*------------------------------------------------
11 mS延时函数,含有输入参数 unsigned char t,无返回值
12 unsigned char 是定义无符号字符变量,其值的范围是
13 0~255 这里使用晶振12M,精确延时请使用汇编
14 ------------------------------------------------*/
15 void DelayMs(unsigned char t);
16
17 #endif

>_<:display.c


 1 #include"display.h"
2 #include"delay.h"
3
4 #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
5 //sbit LATCH1=P2^0;//定义锁存使能端口 段锁存
6 //sbit LATCH2=P2^3;// 位锁存
7
8 unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
10 unsigned char TempData[8]; //存储显示值的全局变量
11 /*------------------------------------------------
12 显示函数,用于动态扫描数码管
13 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
14 如输入0表示从第一个显示。
15 Num表示需要显示的位数,如需要显示99两位数值则该值输入2
16 ------------------------------------------------*/
17 void Display(unsigned char FirstBit,unsigned char Num)
18 {
19 static unsigned char i=0;
20
21 DataPort=0; //清空数据,防止有交替重影
22 LATCH1=1; //段锁存
23 LATCH1=0;
24
25 DataPort=dofly_WeiMa[i+FirstBit]; //取位码
26 LATCH2=1; //位锁存
27 LATCH2=0;
28
29 DataPort=TempData[i]; //取显示数据,段码
30 LATCH1=1; //段锁存
31 LATCH1=0;
32
33 i++;
34 if(i==Num)
35 i=0;
36 }
37 /*------------------------------------------------
38 定时器初始化子程序
39 ------------------------------------------------*/
40 void Init_Timer0(void)
41 {
42 TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
43 //TH0=0x00; //给定初值
44 //TL0=0x00;
45 EA=1; //总中断打开
46 ET0=1; //定时器中断打开
47 TR0=1; //定时器开关打开
48 }
49 /*------------------------------------------------
50 定时器中断子程序
51 ------------------------------------------------*/
52 void Timer0_isr(void) interrupt 1
53 {
54 TH0=(65536-2000)/256; //重新赋值 2ms
55 TL0=(65536-2000)%256;
56 Display(0,8);
57 }

>_<:display.h


 1 #include<reg52.h>
2
3 #ifndef __DISPLAY_H__
4 #define __DISPLAY_H__
5
6 #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
7 sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
8 sbit LATCH2=P2^3;// 位锁存
9
10 extern unsigned char TempData[8]; //存储显示值的全局变量
11 extern unsigned char code dofly_DuanMa[10];
12 /*------------------------------------------------
13 显示函数,用于动态扫描数码管
14 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
15 如输入0表示从第一个显示。
16 Num表示需要显示的位数,如需要显示99两位数值则该值输入2
17 ------------------------------------------------*/
18 void Display(unsigned char FirstBit,unsigned char Num);
19 /*------------------------------------------------
20 定时器初始化子程序
21 ------------------------------------------------*/
22 void Init_Timer0(void);
23
24 #endif

>_<:i2c.c


  1 /*-----------------------------------------------
2 名称:IIC协议
3 内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器
4 周期,即晶振频率要小于12MHZ)
5 ------------------------------------------------*/
6 #include "i2c.h"
7 #include "delay.h"
8 #define _Nop() _nop_() //定义空指令
9 bit ack; //应答标志位
10 sbit SDA=P2^1;
11 sbit SCL=P2^0;
12 /*------------------------------------------------
13 启动总线
14 ------------------------------------------------*/
15 void Start_I2c()
16 {
17 SDA=1; //发送起始条件的数据信号
18 _Nop();
19 SCL=1;
20 _Nop(); //起始条件建立时间大于4.7us,延时
21 _Nop();
22 _Nop();
23 _Nop();
24 _Nop();
25 SDA=0; //发送起始信号
26 _Nop(); //起始条件锁定时间大于4μ
27 _Nop();
28 _Nop();
29 _Nop();
30 _Nop();
31 SCL=0; //钳住I2C总线,准备发送或接收数据
32 _Nop();
33 _Nop();
34 }
35 /*------------------------------------------------
36 结束总线
37 ------------------------------------------------*/
38 void Stop_I2c()
39 {
40 SDA=0; //发送结束条件的数据信号
41 _Nop(); //发送结束条件的时钟信号
42 SCL=1; //结束条件建立时间大于4μ
43 _Nop();
44 _Nop();
45 _Nop();
46 _Nop();
47 _Nop();
48 SDA=1; //发送I2C总线结束信号
49 _Nop();
50 _Nop();
51 _Nop();
52 _Nop();
53 }
54 /*----------------------------------------------------------------
55 字节数据传送函数
56 函数原型: void SendByte(unsigned char c);
57 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
58 此状态位进行操作.(不应答或非应答都使ack=0 假)
59 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
60 ------------------------------------------------------------------*/
61 void SendByte(unsigned char c)
62 {
63 unsigned char BitCnt;
64
65 for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
66 {
67 if((c<<BitCnt)&0x80)SDA=1; //判断发送位
68 else SDA=0;
69 _Nop();
70 SCL=1; //置时钟线为高,通知被控器开始接收数据位
71 _Nop();
72 _Nop(); //保证时钟高电平周期大于4μ
73 _Nop();
74 _Nop();
75 _Nop();
76 SCL=0;
77 }
78
79 _Nop();
80 _Nop();
81 SDA=1; //8位发送完后释放数据线,准备接收应答位
82 _Nop();
83 _Nop();
84 SCL=1;
85 _Nop();
86 _Nop();
87 _Nop();
88 if(SDA==1)ack=0;
89 else ack=1; //判断是否接收到应答信号
90 SCL=0;
91 _Nop();
92 _Nop();
93 }
94 /*----------------------------------------------------------------
95 字节数据传送函数
96 函数原型: unsigned char RcvByte();
97 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
98 发完后请用应答函数。
99 ------------------------------------------------------------------*/
100 unsigned char RcvByte()
101 {
102 unsigned char retc;
103 unsigned char BitCnt;
104
105 retc=0;
106 SDA=1; //置数据线为输入方式
107 for(BitCnt=0;BitCnt<8;BitCnt++)
108 {
109 _Nop();
110 SCL=0; //置时钟线为低,准备接收数据位
111 _Nop();
112 _Nop(); //时钟低电平周期大于4.7us
113 _Nop();
114 _Nop();
115 _Nop();
116 SCL=1; //置时钟线为高使数据线上数据有效
117 _Nop();
118 _Nop();
119 retc=retc<<1;
120 if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中
121 _Nop();
122 _Nop();
123 }
124 SCL=0;
125 _Nop();
126 _Nop();
127 return(retc);
128 }
129 /*----------------------------------------------------------------
130 应答子函数
131 原型: void Ack_I2c(void);
132
133 ----------------------------------------------------------------*/
134 void Ack_I2c(void)
135 {
136
137 SDA=0;
138 _Nop();
139 _Nop();
140 _Nop();
141 SCL=1;
142 _Nop();
143 _Nop(); //时钟低电平周期大于4μ
144 _Nop();
145 _Nop();
146 _Nop();
147 SCL=0; //清时钟线,钳住I2C总线以便继续接收
148 _Nop();
149 _Nop();
150 }
151 /*----------------------------------------------------------------
152 非应答子函数
153 原型: void NoAck_I2c(void);
154
155 ----------------------------------------------------------------*/
156 void NoAck_I2c(void)
157 {
158
159 SDA=1;
160 _Nop();
161 _Nop();
162 _Nop();
163 SCL=1;
164 _Nop();
165 _Nop(); //时钟低电平周期大于4μ
166 _Nop();
167 _Nop();
168 _Nop();
169 SCL=0; //清时钟线,钳住I2C总线以便继续接收
170 _Nop();
171 _Nop();
172 }
173 /*----------------------------------------------------------------
174 向无子地址器件发送字节数据函数
175 函数原型: bit ISendByte(unsigned char sla,ucahr c);
176 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
177 如果返回1表示操作成功,否则操作有误。
178 注意: 使用前必须已结束总线。
179 ----------------------------------------------------------------*/
180 /*bit ISendByte(unsigned char sla,unsigned char c)
181 {
182 Start_I2c(); //启动总线
183 SendByte(sla); //发送器件地址
184 if(ack==0)return(0);
185 SendByte(c); //发送数据
186 if(ack==0)return(0);
187 Stop_I2c(); //结束总线
188 return(1);
189 }
190 */
191 /*----------------------------------------------------------------
192 向有子地址器件发送多字节数据函数
193 函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
194 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
195 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
196 如果返回1表示操作成功,否则操作有误。
197 注意: 使用前必须已结束总线。
198 ----------------------------------------------------------------*/
199 bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
200 {
201 unsigned char i;
202 for(i=0;i<no;i++)
203 {
204 Start_I2c(); //启动总线
205 SendByte(sla); //发送器件地址
206 if(ack==0)return(0);
207 SendByte(suba); //发送器件子地址
208 if(ack==0)return(0);
209
210 SendByte(*s); //发送数据
211 if(ack==0)return(0);
212 Stop_I2c(); //结束总线
213 DelayMs(1); //必须延时等待芯片内部自动处理数据完毕
214 s++;
215 suba++;
216 }
217 return(1);
218 }
219 /*----------------------------------------------------------------
220 向无子地址器件读字节数据函数
221 函数原型: bit IRcvByte(unsigned char sla,ucahr *c);
222 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
223 址sla,返回值在c.
224 如果返回1表示操作成功,否则操作有误。
225 注意: 使用前必须已结束总线。
226 ----------------------------------------------------------------*/
227 /*bit IRcvByte(unsigned char sla,unsigned char *c)
228 {
229 Start_I2c(); //启动总线
230 SendByte(sla+1); //发送器件地址
231 if(ack==0)return(0);
232 *c=RcvByte(); //读取数据
233 NoAck_I2c(); //发送非就答位
234 Stop_I2c(); //结束总线
235 return(1);
236 }
237 */
238 /*----------------------------------------------------------------
239 向有子地址器件读取多字节数据函数
240 函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
241 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
242 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
243 如果返回1表示操作成功,否则操作有误。
244 注意: 使用前必须已结束总线。
245 ----------------------------------------------------------------*/
246 bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
247 {
248 unsigned char i;
249
250 Start_I2c(); //启动总线
251 SendByte(sla); //发送器件地址
252 if(ack==0)return(0);
253 SendByte(suba); //发送器件子地址
254 if(ack==0)return(0);
255
256 Start_I2c();
257 SendByte(sla+1);
258 if(ack==0)return(0);
259
260 for(i=0;i<no-1;i++)
261 {
262 *s=RcvByte(); //发送数据
263 Ack_I2c(); //发送就答位
264 s++;
265 }
266 *s=RcvByte();
267 NoAck_I2c(); //发送非应位
268 Stop_I2c(); //结束总线
269 return(1);
270 }

>_<:i2c.h


 1 /*-----------------------------------------------
2 名称:IIC协议 头文件
3 内容:
4 ------------------------------------------------*/
5 #ifndef __I2C_H__
6 #define __I2C_H__
7
8 #include <reg52.h> //头文件的包含
9 #include <intrins.h>
10 #define _Nop() _nop_() //定义空指令
11 /*------------------------------------------------
12 启动总线
13 ------------------------------------------------*/
14 void Start_I2c();
15 /*------------------------------------------------
16 结束总线
17 ------------------------------------------------*/
18 void Stop_I2c();
19 /*----------------------------------------------------------------
20 字节数据传送函数
21 函数原型: void SendByte(unsigned char c);
22 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
23 此状态位进行操作.(不应答或非应答都使ack=0 假)
24 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
25 ------------------------------------------------------------------*/
26 void SendByte(unsigned char c);
27 /*----------------------------------------------------------------
28 字节数据传送函数
29 函数原型: unsigned char RcvByte();
30 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
31 发完后请用应答函数。
32 ------------------------------------------------------------------*/
33 unsigned char RcvByte();
34 /*----------------------------------------------------------------
35 应答子函数
36 原型: void Ack_I2c(void);
37 ----------------------------------------------------------------*/
38 void Ack_I2c(void);
39 /*----------------------------------------------------------------
40 非应答子函数
41 原型: void NoAck_I2c(void);
42 ----------------------------------------------------------------*/
43 void NoAck_I2c(void);
44 /*----------------------------------------------------------------
45 向无子地址器件发送字节数据函数
46 函数原型: bit ISendByte(unsigned char sla,ucahr c);
47 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
48 如果返回1表示操作成功,否则操作有误。
49 注意: 使用前必须已结束总线。
50 ----------------------------------------------------------------*/
51 bit ISendByte(unsigned char sla,unsigned char c);
52 /*----------------------------------------------------------------
53 向有子地址器件发送多字节数据函数
54 函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
55 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
56 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
57 如果返回1表示操作成功,否则操作有误。
58 注意: 使用前必须已结束总线。
59 ----------------------------------------------------------------*/
60 bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);
61 /*----------------------------------------------------------------
62 向无子地址器件读字节数据函数
63 函数原型: bit IRcvByte(unsigned char sla,ucahr *c);
64 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
65 址sla,返回值在c.
66 如果返回1表示操作成功,否则操作有误。
67 注意: 使用前必须已结束总线。
68 ----------------------------------------------------------------*/
69 bit IRcvByte(unsigned char sla,unsigned char *c);
70 /*----------------------------------------------------------------
71 向有子地址器件读取多字节数据函数
72 函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
73 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
74 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
75 如果返回1表示操作成功,否则操作有误。
76 注意: 使用前必须已结束总线。
77 ----------------------------------------------------------------*/
78 bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);
79 #endif

>_<:main()


 1 /*-----------------------------------------------
2 名称:IIC协议 24c02存储开机次数
3 内容:每次开机,开机数值加1并存储到24c02
4 ------------------------------------------------*/
5 #include <reg52.h>
6 #include "i2c.h"
7 #include "delay.h"
8 #include "display.h"
9
10 main()
11 {
12 unsigned char num=0;
13 Init_Timer0();
14 IRcvStr(0xae,50,&num,1); //从24c02读出数据
15 num++;
16 ISendStr(0xae,50,&num,1); //写入24c02
17 DelayMs(10);
18 TempData[0]=dofly_DuanMa[num/100];
19 TempData[1]=dofly_DuanMa[(num%100)/10];
20 TempData[2]=dofly_DuanMa[(num%100)%10];
21
22 while(1)
23 {
24 }
25 }

[51单片机] EEPROM 24c02 + 数码管 + 中断 [统计开机次数],布布扣,bubuko.com

时间: 2024-08-25 00:44:33

[51单片机] EEPROM 24c02 + 数码管 + 中断 [统计开机次数]的相关文章

[51单片机] EEPROM 24c02 [I2C代码封装-保存实现流水灯]

这里把EEPROM 24c02封装起来,今后可以直接调用,其连线方式为:SDA-P2.1;SCL-P2.0;WP-VCC >_<:i2c.c 1 /*----------------------------------------------- 2 名称:IIC协议 3 内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器 4 周期,即晶振频率要小于12MHZ) 5 ---------------------------------------

51单片机第五弹---外部中断

写了半天掉线了... 不写了上定义... 什么叫中断 中断是指CPU在执行当前程序的过程中,由于某种随机出现的外设请求或CPU内部的异常事件,使CPU暂停正在执行的程序而转去 执行相应的服务处理程序:当服务处理程序运行完毕后,CPU再返回到暂停处继续执行原来的程序. 51单片机的中断 80c51提供有5个中断源,分别为:2个外部中断,2个定时/计数器中断,1个串口发送/接收中断.并且具有2个中断优先级,可以实现2级中断服务程序嵌套. 首先要弄中断设置 ,中断原理图如下: 以 设置INT0为例:I

基于51单片机8位数码管(74HC595芯片)的使用方法

#include <AT89X51.H> #include <intrins.h> // 函数原形定义 #define uchar unsigned char #define uint unsigned int void main (void); // 主函数 void LED_OUT(uchar X); // LED单字节串行移位函数 void LED_print (uchar p, uchar x) ; unsigned char code LED_0F[]; // LED字模

51单片机入门(三)

数码管显示,定时器中断:键盘检测: 1.数码管:分共阳极和共阴极数码管.我的实验板是共阴极,多位数码管的公共端叫做"位选线",连接在一起的段线叫做"段选线".位选是独立控制的,而段选是连接在一起的.段选数据由P0口发送,位选由P2口的2.3.4控制.(消影用P0=0x00) 2.中断:为使单片机具有对外部或内部随机事件发生的时间实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部时间的能力.51单片机内部共有5个中断源,外部中断0.1:定时器中断0

51单片机实现对24C02进行页写、顺序读取并显示验证

源:51单片机实现对24C02进行页写.顺序读取并显示验证 //************************************************************************************* //**程序名称:51单片机实现对24C02进行页写.顺序读取并显示验证 //**编写人:**** //**修改人:**** //**程序目的:熟悉I2C总线协议,实现51模拟I2C时序和24C02通信 //**功能描述:51单片机将8个字节数据写入24C02的一

【转】 51单片机中断学习

一.中断的概念    CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生):    CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务):    待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 二.中断源 在51单片机中有5个中断源 中断号          优先级                    中断源                    中断入口地址 0               1(最高)   

51单片机中断interrupt……using……

51单片机中断细节的一些问题. interrupt0:外部中断0interrupt1:定时器中断0interrupt2:外部中断interrupt3:定时器中断1interrupt4:串口 using 0 是第0组寄存器: using 1 是第1组寄存器: using 2 是第2组寄存器: using 3 是第3组寄存器:51单片机内的寄存器是R0--R7(不是R0-R3)R0-R7在数据存储器里的实际地址是由特殊功能寄存器PSW里的RS1.RS0位决定的.using 0时设置 RS1=0,RS

51单片机的中断优先级及中断嵌套

说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套.现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了. 在说到中断之前,我先来定义一下优先级,明白了什么是优先级,后面的阐述就容易明白了.实际上很多人都是混淆了优先级的含义,所以才觉得糊里糊涂. 中断的优先级有两个:查询优先级和执行优先级. 什么是查询优级呢?我们从datasheet或书上看到的默认(IP寄存器不做设置,上电复位后为00H)的优先级:外部中断0 > 定时/计数器0 >

一天:51单片机从入门到一个动态数码管显示数字控制

最近进的公司是一个做路由器的..很多嵌入式工程师.有个项目( 智能空调控制)是跟嵌入式工程师对接,我做APP+PHP..他做服务器.我们用MQTT(由于emqtt是用erlang写的,所以我也学了点erlang,后期有时间分享一下,这个语言很好,很强大.特别抽象).这个项目激发了我对嵌入式的兴趣,于是乎.开始从51单片机搞起了..所以就有了这篇文章...今天搞得东西挺多.我最近都是笔记形式,不想以前写的那么详细...因为学的东西太多,白天在公司搞项目,没时间写太具体... 今天学了什么呢? >k