51單片機(jī) EEPROM 24c02 + 數(shù)碼管 + 中斷 統(tǒng)計開機(jī)次數(shù)
>_<:delay.c
本文引用地址:http://m.butianyuan.cn/article/201611/318338.htm1 #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 #include6 #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 }
評論