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

发布者:Lihua1314520最新更新时间:2016-05-31 来源: eefocus关键字:51单片机  EEPROM  数码管  中断  开机次数 手机看文章 扫描二维码
随时随地手机看文章
>_<: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-2)/256;          //重新赋值 2ms
55     TL0=(65536-2)%256;
56     Display(0,8);
57 }

>_<:display.h

 1 #include
 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<

>_<:i2c.h

 1 /*--
 2 名称:IIC协议 头文件
 3 内容:
 4 */  
 5 #ifndef __I2C_H__
 6 #define __I2C_H__  
 7 
 8 #include           //头文件的包含
 9 #include 
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                 
 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  数码管  中断  开机次数 引用地址:51单片机 EEPROM 24c02 + 数码管 + 中断 统计开机次数

上一篇:实验1 单片机IO口应用及数码管显示
下一篇:51单片机 EEPROM 24c02 读取存储多字节

推荐阅读最新更新时间:2024-03-16 14:55

51单片机-实际LED硬件连接
1.三极管认识 假如我们的开发板的硬件连接有如下情况,我们需要点亮LED,需要怎么做? 先看左图,要想点亮LED,根据本章第一讲知识,只需“+5”与R1是短接状态即可,那么PNP型三极管就是起到被单片机IO端口控制是否允许此处短接的作用,也叫三极管是否导通。 如果单片机IO端口输出的是低电平(0V),此时我们可以直观的认为“+5”那端与单片机IO端口形成压差有电流通过,而电流流向正如箭头所示,则表明此时“+5”与R1是短接状态,三极管导通,灯就被点亮了。 那单片机IO端口输出的是高电平(5V)时,则没有形成压差也就产生不了电流,那么箭头不能代表此时有电流流向这个方向,所以“+5”与R1是断开状态,灯没
[单片机]
<font color='red'>51单片机</font>-实际LED硬件连接
TI 54xx DSP与51单片机的接口技术
1 硬件设计    1.1 时序匹配     HPI8总共有18根信号线。其中数据线8根(HD0~HD7),其余10根都是控制线,如表1所列 ①HAS:在数据线和地址复用的MCU中,与ALE信号连接,在下降沿锁存HBIL、HCNTL0/1、HR/W,因数这些信号通常与地址线连接。如果MCU的数据线和地址线没有复用,则应该接高电平。    ②HDS1、HDS2:数据传输的时序控制。时序见图1,即下降沿传输开始,上升沿传输结束。另外如果不使用HAS(即接高电平),也可以配合HCS对HBIL、HCNTL0/1、HR/W进行锁存。    ③HCNTL0/:选择HPI内部寄
[单片机]
TI 54xx DSP与<font color='red'>51单片机</font>的接口技术
51单片机中断与定时计数器尝试
这是我的第一篇有关51单片机的博客,主要记录我的学习历程与中间遇到的问题,如有错漏请指出。 在我理解里面中断与定时计数器是这样的: 中断是通过检查P3.2(INT0)与P3.3(INT1)两个引脚来触发的 计数器是通过检查P3.4(T0)与P3.5(T1)两个引脚的状态,要达到一定的次数(一般是记脉冲数)才触发 定时器不需要检测引脚,直接计数 先说中断的代码 #include reg51.h #include intrins.h #define SDT P0//静态数码管定义 unsigned char temp; unsigned char code SDT_map ={0xC0,0xF9,0xA4,0xB0,
[单片机]
51单片机封装库HML_FwLib_STC89/STC11
HML_FwLib_STC89/11 项目地址 https://github.com/MCU-ZHISHAN-IoT/HML_FwLib_STC89 https://github.com/MCU-ZHISHAN-IoT/HML_FwLib_STC11 这些项目主要是封装了8051和STC89, STC11的寄存器配置信息, 提供接口方法给上层调用. 因为传统的代码都是直接用八进制值给寄存器赋值进行操作, 不便于记忆, 用这个封装库就可以使用类似于STM的高级语言方式进行开发, 解决了开发过程极度依赖手册的问题. 如果使用STC12C5A60S2系列, 可以用STC11封装库. 目录结构 HML_FwLib_STC89 ├─
[单片机]
中断之外部中断
ARM Cortex M3共有256个中断。 STM32F103CB共有43个外部中断和16个内部中断。 具有相同数值编号的IO口被分配为同一组,共用一条中断请求线,如下图: 所以共有15条中断线,另外 ●EXTI线16连接到PVD输出 ●EXTI线17连接到RTC闹钟事件 ●EXTI线18连接到USB唤醒事件 寄存器:1、外部中断配置寄存器 AFIO_EXTxCR1- 用于选择输入中断源 Pin 0..3     AFIO_EXTxCR2- 用于选择输入中断源 Pin 0..7     AFIO_EXTxCR2- 用于选择输入中断源 Pin
[单片机]
<font color='red'>中断</font>之外部<font color='red'>中断</font>
设备树中的中断
中断概述# 这里就比较复杂了,暂时不去做深入的学习,以后再来挖坑学习,太难了 哈哈.这里放一个框图大概理解下基本流程 详细流程看窝窝科技 以前的内核中断描述符的数组序号与硬件是对应的,后来出了个虚拟中断号,不再强调一定是线性关系. 中断入口# 2440的中断向量表是这样的(参考uboot) Copy .globl _start 0--- _start: b reset 4--- ldr pc, _undefined_instruction 8--- ldr pc, _software_interrupt c--- ldr pc, _prefetch_abort 16-- ldr
[单片机]
设备树中的<font color='red'>中断</font>
基于STM8的UART发送和中断接收
1. 综述 UART的基础知识,通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器。 做软件开发的人都知道打印信息的重要,说到打印信息,我们就不得不说UART串口打印。做单片机开发的人,打印信息主要的来源就是UART串口打印。因此,UART会比较常用到,所以在此对UART串口进行一个说明。 2. 关于STM8S103手册的UART简介 3. UART初始化参数详细讲解 3.1 BaudRate(波特率) 所谓的波特率就是每秒钟传送的码元符号的个数,可以理解为串口的输出速率。可选的波特率有很多,常用的波特率有115
[单片机]
基于STM8的UART发送和<font color='red'>中断</font>接收
一文详解80C51单片机的指令集
数据传送类指令 数据传送是单片机最基本的操作。数据传送的一般功能是将源操作数传送到指令所指定的目的操作数,指令执行后,源操作数不变。 数据传送类指令一般不影响标志位。数据传送类指令共29条,可以分为两大类。一是采用MOV操作符,称为一般传送指令,共16条;二是采用非MOV操作符,称为特殊传送指令,共13条。 一般传送指令的 汇编 指令格式为: MOV是传送指令的操作助记符。其功能是将源操作数传送到目的操作数,源操作数内容不变。 该类指令的助记符,操作数,功能,字节数及执行时长(机器周期数),按目的操组数归类如下。 1)内部8位数据传送指令 内部 RAM 区是数据传送最活跃的区域,8位内部数据传送指令共15条,用于 单片机
[单片机]
一文详解80C<font color='red'>51单片机</font>的指令集
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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