📄 24c04开机次数统计的设计.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 + -