用c语言写个程序24c08(EEprom)控制两个数码管 实现重1加到99 掉电不归0 利用中断定时1秒加一个数 谢谢了

用c语言写个程序24c08(EEprom)控制两个数码管 实现重1加到99 掉电不归0 利用中断定时1秒加一个数 谢谢了,第1张

//24c08地址为0xa0

#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的值。

正常情况下 程序设计合理,电路器件正常,基本不会出错。程序设计不合理调试不会通过,电路器件不正常,程序也没办法,只是知道错了而已。解决不了问题,所以很多时候程序员都会舍去这部分出错处理程序。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7939411.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存