中级会员
- 积分
- 297
- 金钱
- 297
- 注册时间
- 2017-6-10
- 在线时间
- 39 小时
|
10金钱
#include "reg52.h"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define addr_w 0xa0
#define addr_r 0xa1
sbit SCL=P2^1;
sbit SDA=P2^0;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar num=0;
uchar disp[4];
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uchar);
void delay_us();
void IIC_Init();
void II_C_start();
void II_C_end();
uchar II_C_write(uchar dat);
uchar II_C_read();
void AT24_w(uchar dat);
uchar AT24_r();
void datapros()
{
disp[0]=smgduan[num/1000];//千位
disp[1]=smgduan[num%1000/100];//百位
disp[2]=smgduan[num%1000%100/10];
disp[3]=smgduan[num%1000%100%10];
}
void DigDisplay()
{
uchar i;
for(i=0;i<4;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
}
P0=disp[3-i];//发送数据
delay(5); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void main()
{
IIC_Init();
while(1)
{
AT24_w(20);
delay(10);
num=AT24_r();
datapros(); //数据处理函数
DigDisplay();//数码管显示函数
}
}
void delay_us()
{_nop_();_nop_();_nop_();_nop_();
}
void delay(uchar xms)
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void IIC_Init()
{
SCL=1;
delay_us();
SDA=1;
delay_us();
}
void II_C_start()
{
SCL=1;
delay_us();
SDA=1;
delay_us();
SDA=0;
delay_us();
}
void II_C_end()
{
SCL=1;
delay_us();
SDA=0;
delay_us();
SDA=1;
}
uchar II_C_write(uchar dat)//写一个字符
{
uchar i,ack;
for(i=0;i<8;i++)
{
SCL=0;//拉低数据线,低电平期间可写SDA
delay_us();
SDA=dat>>7;
delay_us();
SCL=1;//上升沿写数据
delay_us();
dat<<=1;
}
SCL=0;//拉低,允许变化
delay_us();
SDA=1;
delay_us();
SCL=1;//释放总线
delay_us();
ack=SDA;//读ack信号
SCL=0;
delay_us();
return ack;
}
uchar II_C_read()//读一个字节
{
uchar i,temp;
SCL=0;//拉低时钟线,为了将数据线拉高
delay_us();//时不被认为是控制信号
SDA=1; //拉高后释放总线,为空闲
for(i=0;i<8;i++)
{
SCL=1;//拉高时钟线,禁止主机数据变化
delay_us();
temp=(temp<<1)|SDA;
SCL=0;//允许数据变化,从而从机能够传数据到SDA上
delay_us();
}
return temp;
}
void AT24_w(uchar dat)
{
II_C_start();
II_C_write(addr_w);
II_C_write(1);
II_C_write(dat);
II_C_end();
}
uchar AT24_r()
{
uchar temp;
II_C_start();
II_C_write(addr_w);//写 写器件地址
II_C_write(1); //写读取地址
II_C_start();
II_C_write(addr_r);//写 读器件地址
temp=II_C_read(); //读出数据
II_C_end();
return temp;
}
|
|