#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^0;
sbit SDA=P2^1;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit P36=P3^6;
sbit dq=P1^4;
uchar code tableduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 ,0xff}; //共阳
uchar code tablewei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //共阳
uchar xianshishu[]={1,2,3,4,0,0,0,0};
uchar code TESTDATA[] =
{
0x00,0x09,0x08,0x03,0x04,0x05,0x06,0x07,
0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF
};
void Delay5us();
void Delay5ms();
void AT24C04_Start();
void AT24C04_Stop();
void AT24C04_SendACK(bit ack);
bit AT24C04_RecvACK();
void AT24C04_SendByte(uchar dat);
uchar AT24C04_RecvByte();
void AT24C04_ReadPage();
void AT24C04_WritePage();
/**************************************
延时5微秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
void Delay5us()
{
uchar i = 4;
while (i--)
{
_nop_();
_nop_();
}
}
/
**************************************
延时5毫秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
void Delay5ms()
{
int n = 2500;
while (n--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay1ms(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
微孔抛光镜面加工
}
void xuanY5()
{
P36=1;
P25=1;
P26=0;
P27=1;
P36=0;
}
void duanxuan()
{
P36=1;
P25=1;
P26=1;
P27=1;
P36=0;
}
void weixuan()
{
P36=1;
P25=0;
P26=1;
P27=1;
P36=0;
}
/**************************************
**************************************/
void AT24C04_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
铝合金精密铸造Delay5us(); //延时
SCL = 0; //拉低时钟线
}
/**************************************
停止信号
**************************************/
void AT24C04_Stop()
{
SDA = 0; //拉低数据线
SCL = 1; //拉高时钟线
数据销毁Delay5us(); //延时
SDA = 1; //产生上升沿
Delay5us(); //延时
}
/**************************************
入口参数:ack (0:ACK 1:NAK)
**************************************/
void AT24C04_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5
us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/
bit AT24C04_RecvACK()
{
SCL = 1; //拉高时钟线
Delay5us(); //延时
CY = SDA; //读应答信号
SCL = 0; //拉低时钟线
Delay5us(); //延时
return CY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void AT24C04_SendByte(uchar date)
{
uchar i;
for (i=0; i<8; i++) //8位计数器
{
date <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
AT24C04_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
uchar AT24C04_RecvByte()
{
uchar i;
uchar date = 0;
SDA = 1; //使能内部上拉,准备读取数据
for (i=0; i<8; i++) //8位计数器
{
date <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
date |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return date;
}
/**************************************
向AT24C04写1页(16字节)数据土压力盒
将TESTDATA开始的16个测试数据写如设备的00~0F地址中 **************************************/
void AT24C04_WritePage()
{
uchar i;
AT24C04_Start(); //起始信号
AT24C04_SendByte(0xa0); //发送设备地址+写信号
AT24C04_SendByte(0x00); //发送存储单元地址
for (i=0; i<16; i++)
{
AT24C04_SendByte(TESTDATA[i]);
}
AT24C04_Stop(); //停止信号
}
/**************************************
从AT24C04读取1页(16字节)数据
将设备的00~0F地址中的数据读出存放在DATA区的BUF中
**************************************/
void AT24C04_ReadPage()
{
uchar i;
AT24C04_Start(); //起始信号
AT24C04_SendByte(0xa0); //发送设备地址+写信号
AT24C04_SendByte(0x00); //发送存储单元地址
AT24C04_Start(); //起始信号
AT24C04_SendByte(0xa1); //发送设备地址+读信号
for (i=0; i<16; i++)
{
BUF[i] = AT24C04_RecvByte();
if (i == 15)
{
AT24C04_SendACK(1); //最后一个数据需要会NAK
}
else
{
AT24C04_SendACK(0); //回应ACK
}
}
AT24C04_Stop(); //停止信号
}
void c02shujuchuli()
{
uchar i;
for(i=0;i<8;i++)
{
xianshishu[i]= BUF[i];
}
}
/**************************************
显示子程序
**************************************/
定鼎建筑
void display()
{
uchar i;
for(i=0;i<8;i++)
{
duanxuan(); //138选通Y7
P0=0xff;
_nop_();
_nop_();
P0=tableduan[xianshishu[i]];
P36=1; //duan=0;
weixuan(); //138选通Y6
P0=0xff;
_nop_();
_nop_(); //wela=1;
P0=tablewei[i];
P36=1; //wela=0;
cdth
delay1ms(30);
}
duanxuan();
P36=0; //duan=1;
P0=0xff;
P36=1; //duan=0;
}
void main()
{
AT24C04_WritePage();
Delay5ms();
AT24C04_ReadPage();
c02shujuchuli();
while(1)
{
display();
xuanY5();
P0=0x00;
_nop_();
_nop_();
P36=1;
}
}