原创 WJ-V2.0实验板实验例程十二:AT24C02存储芯片读写IIC协议模拟

2009-12-13 22:46 2377 4 4 分类: MCU/ 嵌入式

/*********** (C) COPYRIGHT 2009 http://www.wang1jin.com ************
* 文件名称: main.c
* 程序作者: wish_btn(QQ:1323266146 ,Email:wish_btn@qq.com)
* 程序版本: V1.0
* 编制日期: 12-13-2009
* 功能描述: 99秒计数器,断电再重新上电的时候从断电的时候显示的数开始计数
* 编译器:Keil C uVision4
* 芯片:STC89C52,11.0592M晶振
* 技术支持:http://www.wang1jin.com
*
* 提供原创51单片机、PROTEL99SE视频教程下载,欢迎大家前往论坛下载。
* 论坛地址: http://www.wang1jin.com/bbs/
******************** http://www.wang1jin.com **********************/
#include <REGX52.H>


sbit IIC_SCL=P2^6;
sbit IIC_SDA=P2^7; //IIC引脚定义


sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3; //数码管的位选


unsigned char ucNum,ucCount,ucFlag; //全局变量
unsigned char code LEDDATA[]={ //数码管编码
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0x88,/*A*/
0x83,/*b*/
0xC6,/*C*/
0xA1,/*d*/
0x86,/*E*/
0x8E,/*F*/
};


void Delay(unsigned int uiCount); //延时函数
void IIC_Init(void); //初始化
void IIC_Start(void); //起始信号
void IIC_Stop(void); //停止信号
void IIC_Response(void); //应答信号
void IIC_WriteOneChar(unsigned char Data); //写入一个字节
unsigned char IIC_ReadOneChar(void); //读取一个字节
void IIC_WriteOneCharOnAddr(unsigned char address,unsigned char content); //在指定位置写入一个字节
unsigned char IIC_ReadOneCharOnAddr(unsigned char address); //从指定位置读取一个字节
void Display(unsigned char c,unsigned char d); //数码管的后两位显示两个数字


/******************* http://www.wang1jin.com **********************
* 函数名称: main
* 功能描述: main函数,程序入口
* 输入参数: 无
* 返回参数: 无
**********************************************************************/void main(void)
{
TMOD=0x10; //工作模式
TH1=0x4C; //初值
TL1=0x00; //50ms
TR1=1; //开计数器
ET1=1; //使能定时器1中断
EA=1; //使能全局中断
IIC_Init(); //初始化


ucNum=IIC_ReadOneCharOnAddr(1); //在指定的位置读取初始化的数据
while(1)
{
unsigned char i="10";
while(i--)
Display(ucNum/10,ucNum%10); //数据显示
if(ucFlag==1)
{
IIC_WriteOneCharOnAddr(1,ucNum);
ucFlag=0; //每秒中写入一次数据
}
}
}


/******************* http://www.wang1jin.com **********************
* 函数名称: Delay
* 功能描述: 延时函数
* 输入参数: uiCount
* 返回参数: 无
**********************************************************************/
void Delay(unsigned int uiCount)
{
while(uiCount--);
}


/******************* http://www.wang1jin.com **********************
* 函数名称: IIC_Init
* 功能描述: 初始化
* 输入参数: 无
* 返回参数: 无
**********************************************************************/
void IIC_Init(void)
{
IIC_SDA=1;
IIC_SCL=1;
}


/******************* http://www.wang1jin.com **********************
* 函数名称: IIC_Start
* 功能描述: 起始信号
* 输入参数: 无
* 返回参数: 无
**********************************************************************/
void IIC_Start(void)
{
IIC_SCL=1;
IIC_SDA=1;
IIC_SDA=0;
IIC_SCL=0;
}


/******************* http://www.wang1jin.com **********************
* 函数名称: 停止信号
* 功能描述: IIC_Stop
* 输入参数: 无
* 返回参数: 无
**********************************************************************/
void IIC_Stop(void)
{
IIC_SDA=0;
IIC_SCL=1;
IIC_SDA=1;
}


/******************* http://www.wang1jin.com **********************
* 函数名称: IIC_Response
* 功能描述: 应答信号
* 输入参数: 无
* 返回参数: 无
**********************************************************************/
void IIC_Response(void)
{
unsigned char i;
IIC_SCL=1;
while((IIC_SDA==1)&&(i<254))i++;
IIC_SCL=0;
}


/******************* http://www.wang1jin.com **********************
* 函数名称: 写一个字节,先写最高位
* 功能描述: IIC_WriteOneChar
* 输入参数: Data
* 返回参数: 无
**********************************************************************/
void IIC_WriteOneChar(unsigned char Data)
{
unsigned char i,temp;
temp = Data;
for(i=0;i<8;i++)
{
temp=temp<<1;
IIC_SCL=0;
IIC_SDA=CY;
IIC_SCL=1;
}
IIC_SCL=0;
IIC_SDA=1;
}


/******************* http://www.wang1jin.com **********************
* 函数名称: IIC_ReadOneChar
* 功能描述: 读一个字节,从最高位开始读起
* 输入参数: 无
* 返回参数: temp
**********************************************************************/
unsigned char IIC_ReadOneChar(void)
{
unsigned char i,k,temp;
temp=0;
IIC_SCL=0;
IIC_SDA=1;
for(i=0;i<8;i++)
{
IIC_SCL=1;
if(IIC_SDA==1)k=1;
else k="0";
temp=(temp<<1)|k;
IIC_SCL=0;
}


return (temp);
}


/******************* http://www.wang1jin.com **********************
* 函数名称: IIC_WriteOneCharOnAddr
* 功能描述: 在指定位置写入数据
* 输入参数: address ,content
* 返回参数: 无
**********************************************************************/
void IIC_WriteOneCharOnAddr(unsigned char address,unsigned char content)
{
EA=0;
IIC_Start();
IIC_WriteOneChar(0xa0);
IIC_Response();
IIC_WriteOneChar(address);
IIC_Response();
IIC_WriteOneChar(content);
IIC_Response();
IIC_Stop();
EA=1;
Delay(50);
}


/******************* http://www.wang1jin.com **********************
* 函数名称: IIC_ReadOneCharOnAddr
* 功能描述: 在指定位置读出数据
* 输入参数: address
* 返回参数: backchar
**********************************************************************/
unsigned char IIC_ReadOneCharOnAddr(unsigned char address)
{
unsigned char backchar;
IIC_Start();
IIC_WriteOneChar(0xa0);
IIC_Response();
IIC_WriteOneChar(address);
IIC_Response();
IIC_Start();
IIC_WriteOneChar(0xa1);
IIC_Response();
backchar=IIC_ReadOneChar(); //此处无应答
IIC_Stop();
Delay(50);
return(backchar);
}


/******************* http://www.wang1jin.com **********************
* 函数名称: Display
* 功能描述: 数码管显示
* 输入参数: c,d
* 返回参数: 无
**********************************************************************/
void Display(unsigned char c,unsigned char d)
{
P0=LEDDATA[c];
led1=1;
led2=1;
led3=0;
led4=1;
Delay(10);


P0=LEDDATA[d];
led1=1;
led2=1;
led3=1;
led4=0;
Delay(10);
}


/******************* http://www.wang1jin.com **********************
* 函数名称: timer1
* 功能描述: 定时器1中断
* 输入参数: 无
* 返回参数: 无
**********************************************************************/
void time1() interrupt 3
{
TH1=0X4C;
TL1=0X00;
ucCount++;
if(ucCount==20)
{
ucCount=0;
ucFlag=1;
ucNum++;
if(ucNum>59)ucNum=0;


}
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条