#include <reg52.h>
#define uchar unsigned char
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}
unsigned char sec=0//定义计数值,每过1秒,sec加1
unsigned int count//定时中断次数
bit write=0//写24C08的标志
sbit gewei=P2^7//个位选通定义
sbit shiwei=P2^6//十位选通定义
/////////24C08读写驱动程序////////////////////
sbit scl=P3^4// 24c08 SCL
sbit sda=P3^5// 24c08 SDA
sbit K5=P1^4 //清0按键
/***********************************************/
void delay() //delay 5us
{ }
/**********************************************/
void delay1(uchar x)
{
uchar a,b
for(a=xa>0a--)
for(b=100b>0b--)
}
/**********************************************/
void start() //开始信号
{
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<250))i++
scl=0
delay()
}
/**************************************************/
void init_24c08() //初始化24C02
{
sda=1
delay()
scl=1
delay()
}
/************************************************/
void write_byte(uchar date)
{
uchar i,temp
temp=date
for(i=0i<8i++)
{
temp=temp<<1
scl=0
delay()
sda=CY
delay()
scl=1
delay()
// scl=0
// delay()
}
scl=0
delay()
sda=1
delay()
}
/**********************************************/
uchar read_byte()
{
uchar i,k
scl=0
delay()
sda=1
delay()
for(i=0i<8i++)
{
scl=1
delay()
k=(k<<1)|sda
scl=0
delay()
}
return k
}
/*****************************************************************/
void write_24c08(uchar address,uchar shuju) //给指定地址中写入数据
{
start()
write_byte(0xa0) // 最低位为0写,1读
respons()
write_byte(address)
respons()
write_byte(shuju)
respons()
stop()
}
/*****************************************************************/
uchar read_24c08(uchar address) //从24c08指定地址中读出数据
{
uchar date
start()
write_byte(0xa0)
respons()
write_byte(address)
respons()
start()
write_byte(0xa1)
respons()
date=read_byte()
stop()
return date
}
/////////////24C02读写驱动程序完/////////////////////
/***********************************************************/
void LEDshow() //LED显示函数
{
P0=table[sec/10]
shiwei=0
delay1(40)
shiwei=1
P0=table[sec%10]
gewei=0
delay1(40)
gewei=1
}
/***********************************************************/
void main(void)
{
TMOD=0x01//定时器工作在方式1
ET0=1
EA=1
init_24c08()//初始化24C08
sec=read_24c08(2)//读出保存的数据赋于sec
TH0=(65536-50000)/256//对TH0 TL0赋值
TL0=(65536-50000)%256//使定时器0.05秒中断一次
TR0=1//开始计时
while(1)
{
LEDshow()
if(write==1) //判断计时器是否计时一秒
{
write=0//清零
write_24c08(2,sec)//在24c08的地址2中写入数据sec
}
if(K5==0){
delay1(10)
if(K5==0){
sec=0
}
}
}
}
/**************************************************************/
void t0(void) interrupt 1 using 0 //定时中断服务函数
{
TH0=(65536-50000)/256//对TH0 TL0赋值
TL0=(65536-50000)%256//重装计数初值
count++//每过50ms tcnt加一
if(count==20) //计满20次(1秒)时
{
count=0//重新再计
sec++
write=1//1秒写一次24C08
if(sec==100) //定时100秒,在从零开始计时
{sec=0}
}
}
void start(){
sda=1
delay()
scl=1
delay()
sda=0
delay()
}
void stop()
{
sda=0
delay()
scl=1
delay()
sda=1
delay()
}
void respons()
{
uchar i=0
scl=1
delay()
while((sda==1)&&(i<255))i++
scl=0
delay()
}
void wr_date(char date)
{
uchar i,temp
temp=date
for(i=0i<8i++)
{
scl=0
delay()
temp=(temp<<1)
sda=CY
delay()
scl=1
delay()
}
scl=0
delay()
}
uchar re_date()
{
uchar i,num
for(i=0i<8i++)
{
scl=1
delay()
num=(num<<1)|sda
delay()
scl=0
delay()
}
return num
}
void wr_rea(char address,char date)
{
start()
wr_date(0xa2)//设置为写模式
respons()
wr_date(address)//写数据地址
respons()
wr_date(date) //写数据
respons()
stop()
}
uchar re_rea(char address)
{ uchar date
start()
wr_date(0xa2)//设置为写模式 A0.A2.A6.A8不同的页
respons()
wr_date(address)//写数据地址
respons()
start()
wr_date(0xa3)//设置为读模式A1 A3 A7 A9对应分页读
respons()
date=re_date()
respons()
stop()
return date
}
void delay()
{}
//****************24c08 写入 读出 地址0x23开始写*********************************
void savesj( uchar code *bcsj ,uchar sjws ,char address )
{ char d,f
f=sjws/sizeof( *bcsj)-1// f 为写入的数组长度
wr_rea(address,f)
address=address+1
delayms(2)//连续读得时候必须要有延时 要不然就会有数据错误
for(d=0d<f d++)
{
wr_rea(address,bcsj[d])
address=address+1
delayms(5)
}
}
void readsj(char address )
{ uchar f,d,h
f=re_rea(address)
address=address+1
for (d=0d<fd++)
{ h=re_rea(address)
DisplayOneChar(d,1, h)//1602显示用可以不理会
delayms(1)
address=address+1
}
}
void main(void)
{
savesj(user,sizeof(user),0X23 ) //保存数据程序user为写入的一个数组入user【】={123} 0X23为写入地址
readsj(0X23) //读出24C08数据程序0X23为开始写的地址
}
本人最近刚用过希望可以帮到你
这是程序设计者偷懒的结果,因为大多数正常情况下不会出现应答为1的情况。程序没有写出错处理,出错处理也就是把结果向上一级函数返回,IIC_single_byte_write定义为 bit型,返回IIC_Tack的值。正常情况下 程序设计合理,电路器件正常,基本不会出错。程序设计不合理调试不会通过,电路器件不正常,程序也没办法,只是知道错了而已。解决不了问题,所以很多时候程序员都会舍去这部分出错处理程序。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)