⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 掉链保护程序 功能介绍:通电时
💻 C
字号:
/**********************************************
*         掉链保护程序                        *
*  功能介绍:通电时,数码管以每秒自增到一百   *
*  如此循环,断电时,会自动保护数码管的数字, *
*  在下次开电中数码管自动跳到断电时的数字   *
**********************************************/

#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define wela  P2
#define dual P0
sbit scl=P3^4;
sbit sda=P3^5;
uchar code table[]={        
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xbf};                        //共阳数码管的数字代码
uchar num,sec;
void write_add(uchar addrss,uchar date);
uchar read_add(uchar addrss);
void delay();
void strat();
void stop();
void respons();
void init();
void write(uchar);
uchar read();
void delay1(uchar);
void intial();
void display(num);

/************************************************
*   主函数:                                    *
************************************************/
void main()
{
	init();                                 //调用初始化函数
	intial();                               //调用定时初始化函数
	sec=read_add(23);                       //把每次数字存的地址读出
	while(1)
	{
		wela=0xfe;                          //位选初始化
		display(sec/10);                    //显示秒的十位
		delay1(1);                          //延时一毫秒
		wela=_crol_(wela,1);                //位选移一位
		display(sec%10);                    //显示秒的个位
		delay1(1);                          //延时一毫秒
	}
	
}
/*************************************************
*   写地址和数据函数                             *
*************************************************/

void write_add(uchar addrss,uchar date)      
{
	strat();                                  //开始信号
	write(0xa0);                              //写器件地址
	respons();                                //应答信号
	write(addrss);                            //写器件内部地址
	respons();                                //应答信号
	write(date);                              //写入数据
	respons();                                //应答信号
	stop();                                   //停止信号
} 

/*************************************************
*    读存入地址中的数据函数                      *
*************************************************/

uchar read_add(uchar addrss)
{
	uchar date;                              //声明数据变量
	strat();                                 //开始信号
	write(0xa0);                             //写器件地址
	respons();                               //应答信号
	write(addrss);                           //写器件内部地址
	respons();                               //应答信号
	strat();                                 //换方向
	write(0xa1);                             //写器件地址,下一次为接收
	respons();                               //应答信号
	date=read();                             //把数据读出
	stop();                                  //停止信号
	return date;                             //把数据返回
}

void delay()
{;;}

/**************************************************
*   开始信号函数                                  *
**************************************************/

void strat()
{
	sda=1;                                  //数据总线置于高电位
	delay();                                //延时
	scl=1;                                  //时钟总线置于高电位
	delay();                                //延时
	sda=0;                                  //数据总线拉低
	delay();                                //延时
}

/**************************************************
*   停止信号函数                                  *
**************************************************/

void stop()
{
	sda=0;                                 //数据总线置于低电位
	delay();                               //延时
	scl=1;                                 //时钟总线置于高电位
	delay();                               //延时
	sda=1;                                 //数据总线拉高
	delay();                               //延时
}

/**************************************************
*   应答信号函数                                  *
**************************************************/

void respons()
{
	uchar i;
	scl=1;                                //时钟总线置于高电位
	delay();                              //延时
	while((sda==1)&&(i<200))i++;          //判断是否给出应答,当到一定时间时,默认为接收到,并停止发送
	scl=0;                                //时钟总线置于低电位
	delay();                              //延时
}

/**************************************************
*   初始化函数                                  *
**************************************************/

void init()
{
	
	scl=1;                               //时钟总线置于高电位
	delay();                             //延时
	sda=1;                               //数据总线置于高电位
	delay();                             //延时
}

/**************************************************
*   写入字节函数                                  *
**************************************************/

void write(uchar date)
{
	uchar i,temp;                       //声明变量,用于存储数据;
	temp=date;                          //把数据存储到变量中
	for(i=0;i<8;i++)                    //进行八次循环,把数据写入
	{
		temp=temp<<1;                   //数据移位
		scl=0;                          //时钟总线置于低电位
		delay();                        //延时
		sda=CY;                         //数据总线置于高电位
		delay();                        //延时
		scl=1;                          //时钟总线置于高电位
		delay();                        //延时
	}
	scl=0;                 
	delay();
	sda=1;
	delay();
}

/**************************************************
*   读出数据函数                                  *
**************************************************/

uchar read()
{
	uchar i,k;
	scl=0;
	delay();
	sda=1;
	delay();
	for(i=0;i<8;i++)
	{
		scl=1;
		delay();
		k=(k<<1)|sda;
		scl=0;
		delay();
	}
	return k;
}

/**************************************************
*   延时函数                                      *
**************************************************/

void delay1(uchar x)
{
	uchar a,b;
	for(a=x;a>0;a--)
	 for(b=100;b>0;b--);
}

/**************************************************
*   中断定时器0函数                               *
**************************************************/

void timer0() interrupt 1
{
	uchar count;
	TL0=(65536-49400)%256;
	TH0=(65536-49400)/256;
	count++;
	if(count==20)
	{
		count=0;
		sec++;
		if(sec==100)
		sec=0;
		write_add(23,sec);
	}
}

/**************************************************
*   显示函数                                      *
**************************************************/

void display(num)
{
	
	dual=table[num];	 
}
/**************************************************
*   定时初始化函数                                *
**************************************************/
void intial()
{
 	TMOD=0x01;
	TL0=(65536-49400)%256;
	TH0=(65536-49400)/256;
	EA=1;
	ET0=1;
	TR0=1;
	EX1=1;
	IT1=1;
}

/**************************************************
*   外部中断1 函数                                  *
**************************************************/

void wai(void)interrupt 2
{
	ET1=1;
	sec=0;
	ET1=0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -