标题:
单片机怎样把10进制unsigned int数据存入2402芯片?如何拆分与整合?
[打印本页]
作者:
欧阳云天
时间:
2019-5-14 16:09
标题:
单片机怎样把10进制unsigned int数据存入2402芯片?如何拆分与整合?
下面是一个试验程序,4个位是直接分开的,没有整合到一个unsigned int型里面,那样就还要进行一次分离,打算把这4个位分别存入24C02的某个地址,下一次再读回来接着显示,但问题是读回来的数字不能在数码管上正确显示,请教一个各位师傅你们是怎样做的,int型不能直接存入24c02,必然是要拆开的,拆成两个char型(一个高8位,一个低8位)?可是拆了以后,读回来又不知道怎么整合到一起
单片机源程序如下:
#include <STC89C5xRC.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit SDA=P2^7;
sbit SCL=P2^6;
sbit w1=P3^4;
sbit w2=P3^5;
sbit w3=P3^7;
sbit w4=P3^6;
uchar cc,ge,shi,bai,qian;
uchar code table[ ]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90 }; //共阳0~9段码
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void start( )
{
SDA=1; //发送起始条件的数据信号
_nop_( );
SCL=1;
_nop_( ); //起始条件建立时间大于4.7us,延时
_nop_( );
_nop_( );
_nop_( );
_nop_( );
SDA=0; //发送起始信号
_nop_( ); //起始条件锁定时间大于4μ
_nop_( );
_nop_( );
_nop_( );
_nop_( );
SCL=0; //钳住I2C总线,准备发送或接收数据
_nop_( );
_nop_( ); //SCL置低,准备接收或发送数据
}
void stop( )
{
SDA=0; //发送结束条件的数据信号
_nop_( ); //发送结束条件的时钟信号
SCL=1; //结束条件建立时间大于4μ
_nop_( );
_nop_( );
_nop_( );
_nop_( );
_nop_( );
SDA=1; //发送I2C总线结束信号
_nop_( );
_nop_( );
_nop_( );
_nop_( ); //延时保持4.7US以上
}
void write(uchar a)
{
uchar b,shu;
for(b=0;b<8;b++) //要传送的数据长度为8位
{
shu=a<<b; //把即将发送的数据的为移到最高位
if((shu&0x80)!=0) //判断最高位是否为0
SDA=1; //不等于0说明最明当前要发送的数据为1
else SDA=0; //否则数据为0
SCL=1; //置时钟线为高,通知被控器开始接收数据位
_nop_( );
_nop_( ); //保证时钟高电平周期大于4μ
_nop_( );
_nop_( );
_nop_( );
SCL=0;
}
_nop_( );
SDA=1; //8位发送完后释放数据线,准备接收应答位
_nop_( );
SCL=1;
_nop_( );
}
bit ack( ) //等待应答函数
{
bit h;
SDA=1;
_nop_( );
SCL=1; //SDA和SCL全部置高
_nop_( );
_nop_( );
_nop_( );
_nop_( );
SCL=0; //等待4.7US以上,把SCL置低
_nop_( );
_nop_( );
_nop_( );
_nop_( );
h=SDA; //等待4.7SU以上读取SDA应答信号
return h; //应答成功则是0,没有应答则是1
}
uchar reade( ) //接收数据
{
uchar d,g;
SDA=1; //数据线置高电平
for(d=0;d<8;d++)
{
_nop_( );
_nop_( );
SCL=0;
_nop_( );
_nop_( );
_nop_( );
_nop_( ); //SCL低电平,数据变化
SCL=1;
_nop_( );
_nop_( ); //SCL高电平,数据稳定
if(SDA==1)
g=(g<<1)|0x01; //如果读到的数据是1就是最低位置1
else
g=g<<1; //否则读到是0,直接左移1位(左移后右补0)
}
return g; //经过8次读取移位,把g返回
}
void fasong(uchar add , uchar tab) //发送一个字节
{
start( ); //启动总线
write(0xa0); //器件地址(发送)
ack( ); //等待应答
write(add); //发送器件内部地址
ack( ); //等待应答
write(tab); //发送数据
ack( ); //等待应答
stop( );
}
uchar jieshou(uchar add) //接收一个字节
{
uchar shu;
start( ); //读取(开始-器件地址(发)- 器件内部地址 - 开始 - 器件地址(收)- 接收数据 -发应答或停止接收
write(0xa0);
ack( );
write(add);
ack( );
start( );
write(0xa1);
ack( );
shu=reade( );
stop( );
return shu;
}
void display(uchar a , uchar b , uchar c , uchar d)
{
if(a!=0)
{
w1=0;
P0=table[a];
delay(5);
P0=0XFF;
w1=1;
}
if(a!=0||b!=0)
{
w2=0;
P0=table[b];
delay(5);
P0=0XFF;
w2=1;
}
if(a!=0||b!=0||c!=0)
{
w3=0;
P0=table[c];
delay(5);
P0=0XFF;
w3=1;
}
w4=0;
P0=table[d];
delay(5);
P0=0XFF;
w4=1;
}
void main( )
{
uchar a1,a2,a3,a4;
w1=w2=w3=w4=1;
EA=1;
ET0=1;
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
fasong(0x03,9);
fasong(0x04,8);
fasong(0x05,7);
fasong(0x06,6);
delay(100);
a1=jieshou(0x03);
ge=a1;
a2=jieshou(0x04);
shi=a2;
a3=jieshou(0x05);
bai=a3;
a4=jieshou(0x06);
qian=a4;
TR0=1;
while(1)
{
display(qian,bai,shi,ge);
}
}
void aa( ) interrupt 1
{
TH0=0X3c;
TL0=0Xb0;
cc++;
if(cc==1)
{
cc=0;
ge++;
if(ge==10)
{
ge=0;
shi++;
if(shi==10)
{
shi=0;
bai++;
if(bai==10)
{
bai=0;
qian++;
if(qian==10)
{
qian=0;
}
}
}
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1