欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機怎樣把10進制unsigned int數(shù)據(jù)存入2402芯片?如何拆分與整合?
[打印本頁]
作者:
歐陽云天
時間:
2019-5-14 16:09
標題:
單片機怎樣把10進制unsigned int數(shù)據(jù)存入2402芯片?如何拆分與整合?
下面是一個試驗程序,4個位是直接分開的,沒有整合到一個unsigned int型里面,那樣就還要進行一次分離,打算把這4個位分別存入24C02的某個地址,下一次再讀回來接著顯示,但問題是讀回來的數(shù)字不能在數(shù)碼管上正確顯示,請教一個各位師傅你們是怎樣做的,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; //發(fā)送起始條件的數(shù)據(jù)信號
_nop_( );
SCL=1;
_nop_( ); //起始條件建立時間大于4.7us,延時
_nop_( );
_nop_( );
_nop_( );
_nop_( );
SDA=0; //發(fā)送起始信號
_nop_( ); //起始條件鎖定時間大于4μ
_nop_( );
_nop_( );
_nop_( );
_nop_( );
SCL=0; //鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)
_nop_( );
_nop_( ); //SCL置低,準備接收或發(fā)送數(shù)據(jù)
}
void stop( )
{
SDA=0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號
_nop_( ); //發(fā)送結(jié)束條件的時鐘信號
SCL=1; //結(jié)束條件建立時間大于4μ
_nop_( );
_nop_( );
_nop_( );
_nop_( );
_nop_( );
SDA=1; //發(fā)送I2C總線結(jié)束信號
_nop_( );
_nop_( );
_nop_( );
_nop_( ); //延時保持4.7US以上
}
void write(uchar a)
{
uchar b,shu;
for(b=0;b<8;b++) //要傳送的數(shù)據(jù)長度為8位
{
shu=a<<b; //把即將發(fā)送的數(shù)據(jù)的為移到最高位
if((shu&0x80)!=0) //判斷最高位是否為0
SDA=1; //不等于0說明最明當(dāng)前要發(fā)送的數(shù)據(jù)為1
else SDA=0; //否則數(shù)據(jù)為0
SCL=1; //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
_nop_( );
_nop_( ); //保證時鐘高電平周期大于4μ
_nop_( );
_nop_( );
_nop_( );
SCL=0;
}
_nop_( );
SDA=1; //8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應(yīng)答位
_nop_( );
SCL=1;
_nop_( );
}
bit ack( ) //等待應(yīng)答函數(shù)
{
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應(yīng)答信號
return h; //應(yīng)答成功則是0,沒有應(yīng)答則是1
}
uchar reade( ) //接收數(shù)據(jù)
{
uchar d,g;
SDA=1; //數(shù)據(jù)線置高電平
for(d=0;d<8;d++)
{
_nop_( );
_nop_( );
SCL=0;
_nop_( );
_nop_( );
_nop_( );
_nop_( ); //SCL低電平,數(shù)據(jù)變化
SCL=1;
_nop_( );
_nop_( ); //SCL高電平,數(shù)據(jù)穩(wěn)定
if(SDA==1)
g=(g<<1)|0x01; //如果讀到的數(shù)據(jù)是1就是最低位置1
else
g=g<<1; //否則讀到是0,直接左移1位(左移后右補0)
}
return g; //經(jīng)過8次讀取移位,把g返回
}
void fasong(uchar add , uchar tab) //發(fā)送一個字節(jié)
{
start( ); //啟動總線
write(0xa0); //器件地址(發(fā)送)
ack( ); //等待應(yīng)答
write(add); //發(fā)送器件內(nèi)部地址
ack( ); //等待應(yīng)答
write(tab); //發(fā)送數(shù)據(jù)
ack( ); //等待應(yīng)答
stop( );
}
uchar jieshou(uchar add) //接收一個字節(jié)
{
uchar shu;
start( ); //讀取(開始-器件地址(發(fā))- 器件內(nèi)部地址 - 開始 - 器件地址(收)- 接收數(shù)據(jù) -發(fā)應(yīng)答或停止接收
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;
}
}
}
}
}
}
復(fù)制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1