新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 51單片機(jī) EEPROM 24c02 + 數(shù)碼管 + 中斷 統(tǒng)計開機(jī)次數(shù)

51單片機(jī) EEPROM 24c02 + 數(shù)碼管 + 中斷 統(tǒng)計開機(jī)次數(shù)

作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
>_<:24c02的SCL連P2.0;SDA連P2.1;WP接GND;P0接8位數(shù)碼管的8針;P2.2連段碼;P2.3連位碼;

>_<:delay.c

本文引用地址:http://m.butianyuan.cn/article/201611/318338.htm
1 #include "delay.h"2 /*3 uS延時函數(shù),含有輸入?yún)?shù) 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延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值14 unsigned char 是定義無符號字符變量,其值的范圍是15 0~255 這里使用晶振12M,精確延時請使用匯編16 */17 void DelayMs(unsigned char t)18 {19     while(t--)20     {21         //大致延時1mS22         DelayUs2x(245);23         DelayUs2x(245);24     }25 }

>_<:delay.h

1 #ifndef __DELAY_H__2 #define __DELAY_H__3 /*4  uS延時函數(shù),含有輸入?yún)?shù) 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延時函數(shù),含有輸入?yún)?shù) 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 //定義數(shù)據(jù)端口 程序中遇到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~99 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應(yīng)相應(yīng)的數(shù)碼管點亮,即位碼10 unsigned char TempData[8]; //存儲顯示值的全局變量11 /*12 顯示函數(shù),用于動態(tài)掃描數(shù)碼管13 輸入?yún)?shù) FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數(shù)碼管開始顯示14 如輸入0表示從第一個顯示。15 Num表示需要顯示的位數(shù),如需要顯示99兩位數(shù)值則該值輸入216 */17 void Display(unsigned char FirstBit,unsigned char Num)18 {19     static unsigned char i=0;20 21     DataPort=0;   //清空數(shù)據(jù),防止有交替重影22     LATCH1=1;     //段鎖存23     LATCH1=0;24 25     DataPort=dofly_WeiMa[i+FirstBit]; //取位碼 26     LATCH2=1;     //位鎖存27     LATCH2=0;28 29     DataPort=TempData[i]; //取顯示數(shù)據(jù),段碼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;           //定時器開關(guān)打開48 }49 /*50 定時器中斷子程序51 */52 void Timer0_isr(void) interrupt 1 53 {54     TH0=(65536-2)/256;          //重新賦值 2ms55     TL0=(65536-2)%256;56     Display(0,8);57 }

>_<:display.h

1 #include2 3 #ifndef __DISPLAY_H__4 #define __DISPLAY_H__5 6 #define DataPort P0 //定義數(shù)據(jù)端口 程序中遇到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 顯示函數(shù),用于動態(tài)掃描數(shù)碼管14 輸入?yún)?shù) FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數(shù)碼管開始顯示15 如輸入0表示從第一個顯示。16 Num表示需要顯示的位數(shù),如需要顯示99兩位數(shù)值則該值輸入217 */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協(xié)議 3 內(nèi)容:函數(shù)是采用軟件延時的方法產(chǎn)生SCL脈沖,固對高晶振頻率要作 一定的修改....(本例是1us機(jī)器4 周期,即晶振頻率要小于12MHZ)5 */            6 #include "i2c.h"7 #include "delay.h"8 #define  _Nop()  _nop_()  //定義空指令                       9 bit ack;                  //應(yīng)答標(biāo)志位10 sbit SDA=P2^1;11 sbit SCL=P2^0;12 /*13 啟動總線14 */15 void Start_I2c()16 {17     SDA=1;   //發(fā)送起始條件的數(shù)據(jù)信號18     _Nop();19     SCL=1;20     _Nop();    //起始條件建立時間大于4.7us,延時21     _Nop();22     _Nop();23     _Nop();24     _Nop();    25     SDA=0;     //發(fā)送起始信號26     _Nop();    //起始條件鎖定時間大于4μ27     _Nop();28     _Nop();29     _Nop();30     _Nop();       31     SCL=0;    //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)32     _Nop();33     _Nop();34 }35 /*36 結(jié)束總線37 */38 void Stop_I2c()39 {40     SDA=0;    //發(fā)送結(jié)束條件的數(shù)據(jù)信號41     _Nop();   //發(fā)送結(jié)束條件的時鐘信號42     SCL=1;    //結(jié)束條件建立時間大于4μ43     _Nop();44     _Nop();45     _Nop();46     _Nop();47     _Nop();48     SDA=1;    //發(fā)送I2C總線結(jié)束信號49     _Nop();50     _Nop();51     _Nop();52     _Nop();53 }54 /*-55 字節(jié)數(shù)據(jù)傳送函數(shù)               56 函數(shù)原型: void  SendByte(unsigned char c);57 功能:  將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對58 此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0 假)     59 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。60 */61 void  SendByte(unsigned char c)62 {63     unsigned char BitCnt;64     65     for(BitCnt=0;BitCnt<8;BitCnt++)  //要傳送的數(shù)據(jù)長度為8位66     {67         if((c<

>_<:i2c.h

1 /*--2 名稱:IIC協(xié)議 頭文件3 內(nèi)容: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 結(jié)束總線17 */18 void Stop_I2c();19 /*-20 字節(jié)數(shù)據(jù)傳送函數(shù)               21 函數(shù)原型: void  SendByte(unsigned char c);22 功能:  將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對23 此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0 假)     24 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。25 */26 void  SendByte(unsigned char c);27 /*-28 字節(jié)數(shù)據(jù)傳送函數(shù)               29 函數(shù)原型: unsigned char  RcvByte();30 功能:  用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),31 發(fā)完后請用應(yīng)答函數(shù)。  32 */    33 unsigned char  RcvByte();34 /*-35 應(yīng)答子函數(shù)36 原型:  void Ack_I2c(void);37 -*/38 void Ack_I2c(void);39 /*-40 非應(yīng)答子函數(shù)41 原型:  void NoAck_I2c(void);42 -*/43 void NoAck_I2c(void);44 /*-45 向無子地址器件發(fā)送字節(jié)數(shù)據(jù)函數(shù)               46 函數(shù)原型: bit  ISendByte(unsigned char sla,ucahr c);  47 功能:     從啟動總線到發(fā)送地址,數(shù)據(jù),結(jié)束總線的全過程,從器件地址sla.48 如果返回1表示操作成功,否則操作有誤。49 注意:    使用前必須已結(jié)束總線。50 -*/51 bit ISendByte(unsigned char sla,unsigned char c);52 /*-53 向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)函數(shù)               54 函數(shù)原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  55 功能:     從啟動總線到發(fā)送地址,子地址,數(shù)據(jù),結(jié)束總線的全過程,從器件56 地址sla,子地址suba,發(fā)送內(nèi)容是s指向的內(nèi)容,發(fā)送no個字節(jié)。57 如果返回1表示操作成功,否則操作有誤。58 注意:    使用前必須已結(jié)束總線。59 -*/60 bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);61 /*-62 向無子地址器件讀字節(jié)數(shù)據(jù)函數(shù)               63 函數(shù)原型: bit  IRcvByte(unsigned char sla,ucahr *c);  64 功能:     從啟動總線到發(fā)送地址,讀數(shù)據(jù),結(jié)束總線的全過程,從器件地65 址sla,返回值在c.66 如果返回1表示操作成功,否則操作有誤。67 注意:    使用前必須已結(jié)束總線。68 -*/69 bit IRcvByte(unsigned char sla,unsigned char *c);70 /*-71 向有子地址器件讀取多字節(jié)數(shù)據(jù)函數(shù)               72 函數(shù)原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  73 功能:     從啟動總線到發(fā)送地址,子地址,讀數(shù)據(jù),結(jié)束總線的全過程,從器件74 地址sla,子地址suba,讀出的內(nèi)容放入s指向的存儲區(qū),讀no個字節(jié)。75 如果返回1表示操作成功,否則操作有誤。76 注意:    使用前必須已結(jié)束總線。77 -*/78 bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);79 #endif

>_<:main()

1 /*--2 名稱:IIC協(xié)議 24c02存儲開機(jī)次數(shù)3 內(nèi)容:每次開機(jī),開機(jī)數(shù)值加1并存儲到24c024 */  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讀出數(shù)據(jù)                             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 }



評論


技術(shù)專區(qū)

關(guān)閉