📄 i2c.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 + -