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

📄 24c04开机次数统计的设计.c

📁 基于Proteus的51系列单片机设计与仿真
💻 C
字号:
#include"reg51.h"
#define uint unsigned int
#define uchar unsigned char
sbit at24c04_scl=P3^2;                  
sbit at24c04_sda=P3^3;
sbit p06=P0^6;
sbit p07=P0^7;
code uchar tab[]={  	 0XC0,  0XF9, 0XA4,/*2*/
  			     		 0XB0,/*3*/
   			   		     0X99,/*4*/
  			    	     0X92,/*5*/
 			    	     0X82,/*6*/
 			   		     0XF8,/*7*/
 			   		     0X80,/*8*/
 			   		     0X90,/*9*/
};
unsigned char  temp_1=0;
void delayic(uchar t)//延时子程序
{
	uchar i,j;
	for(i=0;i<t;i++)
	{   
		for(j=0;j<255;j++);
	}
}
void delaym(uchar t)//延时子程序
{
	uchar i;
	for(i=0;i<t;i++);	  
}
void sta(void)//启动IIC总线
{
	at24c04_sda=1;
	at24c04_scl=1;
	delaym(1);
	at24c04_sda=0;
	delaym(1);
	at24c04_scl=0;
}
void stop(void)//停止IIC总线数据传送
{
	at24c04_sda=0;
	at24c04_scl=1;
	delaym(1);
	at24c04_sda=1;
	delaym(1);
	at24c04_scl=0;
}
uchar cack(void)//应答位检查
{
	uchar i;
	i=0x00;
	at24c04_sda=1;
	at24c04_scl=1;
	if(at24c04_sda==1)i=0xff;
	at24c04_scl=0;
	return i;
}
void mnack(void)//发送非应答位
{
	at24c04_sda=1;
	at24c04_scl=1;
	delaym(1);
	at24c04_scl=0;
	at24c04_sda=0;
}
void wrbyt(uchar date_w24)//向SDA线上发送一个数据字节
{
	uchar i,j;
	j=0x80;	 
	for(i=0;i<8;i++)
	{
		if((date_w24&j)==0)
		{
			at24c04_sda=0;
			at24c04_scl=1;
			delaym(1);
			at24c04_scl=0;
		}
		else
		{
			at24c04_sda=1;
			at24c04_scl=1;
			delaym(1);
			at24c04_scl=0;
			at24c04_sda=0;
		}
		j=j>>1;
	}
}
uchar rdbyt(void)//从SDA线上读取一个数据字节
{  
	uchar i,j;
	j=0x00; 
	for(i=0;i<8;i++)
	{
		at24c04_sda=1;
		at24c04_scl=1;
		if(at24c04_sda==0)
		{
			j=j&0xfe;
		}
		else
		{
			j=j|0x01;
		}
		if(i!=7)j=j<<1;
		at24c04_scl=0;
	}
	return j;
}
 void main(void)
{     uchar h,l;
      uchar biao;
      uchar xt;
	  uchar zt;
    for(biao=0;biao<1;biao++)
     {      sta();  //启动
	    wrbyt(0xa0);//写  I2C写命令
		if(cack()!=0) //应答信号
		break;  
		wrbyt(0X00);// 写地址命令  地址是0X00
        if(cack()!=0) //应答信号
		break; 
		sta();  //这是写单个字节的格式  需要从新启动然后读数据
    	wrbyt(0xa1); //读I2C的0X00地址的命令
		if(cack()!=0) //应答信号
		 break;  
	    temp_1=rdbyt();//读0X00地址的数据 并且把这个数据发给temp_1这个全局变量
		mnack();           //发个非应答信号
		stop();             //停止
 		delayic(20);										 
		delayic(20);//从新启动与停止之间要有个时间差
       }	 
		if(temp_1!=0x68)   //判断0X00数据是否是0X68  否就执if语句的数据
		{    
		  for(biao=0;biao<1;biao++)  
			{    sta();
				wrbyt(0xa0); 
				if(cack()!=0) //应答信号
					break;  
				wrbyt(0x00); //地址0x00;
				if(cack()!=0) //应答信号
				break;  
				wrbyt(0x68); //写0X68这个字
				if(cack()!=0) //应答信号
				break;  
				stop();
				delayic(20);  
				delayic(20); //这次启动与这次停止之间有一个时间 必须要这样
				}															    
             }
         //写0X01地址的数据
			for(biao=0;biao<1;biao++)
                {   sta();
				wrbyt(0xa0);
					if(cack()!=0) //应答信号
					break;  
					wrbyt(0X01);//0地址 
                    if(cack()!=0) //应答信号
					break;  
					sta();
    				wrbyt(0xa1); 
					if(cack()!=0) //应答信号
					break;  
					temp_1=rdbyt(); 
					mnack();
					stop();
					delayic(20); 
				    delayic(20);
				 }                            
				if(temp_1<10)    //设定程序运行的次数
				{    zt=temp_1; 
				     zt++;
					for(biao=0;biao<1;biao++) 
					{   sta();
						wrbyt(0xa0); 
						if(cack()!=0) //应答信号
						break;  
						wrbyt(0x01); 
						if(cack()!=0) //应答信号
						break;  
                        wrbyt(zt);//写设定的值 
						if(cack()!=0) //应答信号
						break;  
						stop();      
						delayic(20); 
						delayic(20);   
 					}										  				    
                 }
                  else
					{for(biao=0;biao<1;biao++) 
					  { sta();
						wrbyt(0xa0); 
						if(cack()!=0) //应答信号
						break;  
						wrbyt(0x01); 
						if(cack()!=0) //应答信号
						break;  
                        wrbyt(0x00);//写设定的值 
						if(cack()!=0) //应答信号
						break; 
						stop();      
						delayic(20); 
						 delayic(20);   
 					  }
                    }
//主循环									 	  
          while(1) 
			{   if(temp_1>5) //大于5次就闪烁
			   { P0=0X00;
				delayic(254);
			    delayic(254); 
				}
				for(xt=0;xt<10;xt++)
					{   l= temp_1%10;
						h= temp_1/10;
						p06=1;
						P2= tab[h];  
						delayic(20);
						p06=0;
                        p07=1;
						P2= tab[l];  
						delayic(20);
						p07=0;
					}
				}
}

⌨️ 快捷键说明

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