久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
I2C的程序不能實(shí)現(xiàn)???
[打印本頁]
作者:
crytail
時(shí)間:
2014-2-22 21:03
標(biāo)題:
I2C的程序不能實(shí)現(xiàn)???
哪位大神知道為什么嗎?我的程序在理論沒錯(cuò)誤啊!怎么實(shí)現(xiàn)不了它的功能???
# include <reg52.h>
# include "intrins.h"
//# include "I2C_driver.h"
#define AT24C02 0xa0 //AT24C02 地址
sbit LS138A=P2^2; //譯碼器端
sbit LS138B=P2^3;
sbit LS138C=P2^4;
sbit K1 = P1^0; //保存
sbit K2 = P1^1; //讀取
sbit K3 = P1^2; //+數(shù)據(jù)
sbit K4 = P1^3; //-數(shù)據(jù)
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsigned char Count1;
unsigned long D[17], LedOut[4];
unsigned int idata USEC;
typedef unsigned int uint;
typedef unsigned char uchar;
sbit SCL = P2^1;
sbit SDA = P2^0;
bit ack; //應(yīng)答;1發(fā)送正常
/* 4us延時(shí) */
void delay()
{
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
}
/* I2C啟動(dòng)信號(hào) */
void I2C_Start()
{
SDA = 1;
_nop_();
SCL = 1; //在SCL高電平的期間,SDA高到低
delay();
_nop_();
SDA = 0;
delay();
SCL=0; /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
_nop_();
_nop_();
}
/* I2C終止信號(hào) */
void I2C_Stop()
{
SDA = 0;
_nop_();
SCL = 1; //在SCL高電平的期間,SDA高到低
delay();
SDA = 1;
delay();
SCL = 0;
_nop_();
}
/* i2C 應(yīng)答函數(shù) */
void I2C_ack(bit a)
{
if(a == 0) SDA = 0;
else SDA = 1;
delay();
SCL = 1;
delay();
SCL = 0; /*清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收*/
_nop_();
}
/* I2C寫一字節(jié)數(shù)據(jù) */
void I2C_writebyte(uchar datum)
{
uchar i;
for(i=0; i<8; i++)
{
if(i<<datum&0x80) SDA = 1;
else SDA = 0;
_nop_();
SCL = 1; /*置時(shí)鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
delay();
SCL = 0;
} //一幀的數(shù)據(jù)傳輸完畢,開始應(yīng)答
SDA = 1; /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
delay();
SCL = 1;
delay();
if(SDA ==1) ack = 0; //fei應(yīng)答
else ack = 1;
SCL = 0;
delay();
}
/* I2C讀一字節(jié)數(shù)據(jù) */
uchar I2C_readbyte()
{
uchar datum, i;
datum = 0;
SDA = 1; /*置數(shù)據(jù)線為輸入方式*/
for(i=0; i<8; i++)
{
SCL = 0; /*置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
delay();
SCL = 1; /*置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
delay();
datum <<= 1;
if(SDA == 1)
datum |= 0x01;
_nop_();
_nop_();
}
SCL = 0;
delay();
return datum;
}
/* I2C寫入多個(gè)字節(jié)的數(shù)據(jù) */
bit I2Cwritenbyte(uchar SLA, uchar SUBA, uchar *datum, uchar n)
{
uchar i;
I2C_Start();
I2C_writebyte(SLA);
if(ack == 0) return 0;
I2C_writebyte(SUBA);
if(ack == 0) return 0;
for(i=0; i<n; i++)
{
I2C_writebyte(*datum);
if(ack == 0) return 0; //程序員自己設(shè)定是否繼續(xù)
datum++;
}
I2C_Stop();
return 1;
}
/* I2C讀入多個(gè)字節(jié)的數(shù)據(jù) */
bit I2Creadnbyte(uchar SLA, uchar SUBA, uchar *datum, uchar n)
{
uchar i;
I2C_Start();
I2C_writebyte(SLA); /*發(fā)送器件地址*/
if(ack == 0) return 0;
I2C_writebyte(SUBA); /*發(fā)送器件子地址*/
if(ack == 0) return 0;
I2C_Start(); /*重新啟動(dòng)總線*/
I2C_writebyte(SLA+1); //發(fā)送器件寫地址
if(ack == 0) return 0;
for(i=0; i<n-1; i++)
{
*datum = I2C_readbyte();
I2C_ack(0);
datum++;
}
*datum = I2C_readbyte();
I2C_ack(1); /*發(fā)送非應(yīng)位*/
I2C_Stop(); /*結(jié)束總線*/
return(1);
}
void system_init()
{
TMOD|= 0x11;
TH1 = 0xfe; //11.0592
TL1 = 0x33;
TR1 = 1;
IE =0x8A;
}
void Delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void display(uchar count)
{
uchar LedNumVal,i;
/********以下將2402中保存的數(shù)據(jù)送到LED數(shù)碼管顯示*************/
LedNumVal=count;
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100];
LedOut[2]=Disp_Tab[LedNumVal%100/10]|0x80;
LedOut[3]=Disp_Tab[LedNumVal%10];
for(i=0; i<4; i++)
{
P0 = LedOut[i];
switch(i)
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break;
}
Delay(100);
}
}
void main()
{
unsigned char i;
unsigned char pDat[8];
system_init();
while(1)
{
//========================IIC 讀取
if(K2 == 0) //第二個(gè)按鈕讀取數(shù)據(jù)
{
I2Creadnbyte(AT24C02, 0 , &pDat[0], 8);
for (i=0; i<4; i++)
{
D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100;
Count1 = D[14];
}
}
//========================IIC 保存
if(K1 == 0) //第一個(gè)按鈕保存數(shù)據(jù)
{
D[14]= Count1;
for (i=0; i<4; i++)
{
pDat[i*2+0]=D[14+i]; //D[14]是長(zhǎng)字節(jié)的無符號(hào)型的數(shù)據(jù)
pDat[i*2+1]=D[14+i]>>8; //pDat[]是8位的數(shù)據(jù),所以要進(jìn)行轉(zhuǎn)換防止數(shù)據(jù)丟失
}
I2Cwritenbyte(AT24C02, 0 , &pDat[0], 8);
D[14] = 0;
}
display(Count1);
}
}
void T1zd(void) interrupt 3 //3 為定時(shí)器1的中斷號(hào) 1 定時(shí)器0的中斷號(hào) 0 外部中斷1 2 外部中斷2 4 串口中斷
{
TH1 = 0xfe; //12M
TL1 = 0x33;
if(USEC++==200)
{ USEC=0;
if (!K3) Count1++; //改變數(shù)據(jù)
if (!K4&Count1!=0) Count1--;
}
}
作者:
kpdz009
時(shí)間:
2014-8-10 09:07
沒看懂
作者:
lzzgg834483370
時(shí)間:
2014-9-18 11:20
額 地址你搞錯(cuò)了 寫是0xa0,讀是0xa1。 R/W位有區(qū)別的親~~~~~~
作者:
lzzgg834483370
時(shí)間:
2014-9-18 11:41
對(duì)于I2C的EEPROM器件,D7-D4是1010 后面D3-D1是地址 最后一位是R/W
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩欧美在线免费观看
|
亚洲少妇综合网
|
japanhd成人
|
成人av免费网站
|
亚洲一区二区视频在线播放
|
综合久
|
成人二区
|
成人国产精品免费观看视频
|
九九热精品视频
|
女人夜夜春
|
精品国产91
|
国产成人精品视频在线观看
|
天天干天天谢
|
日韩在线第一
|
亚洲黄色片免费观看
|
av影片在线
|
久久精品久久久久久
|
国产重口老太伦
|
日韩高清中文字幕
|
91视频入口
|
日干夜干
|
www..com18午夜观看
|
在线播放国产一区二区三区
|
天天操精品视频
|
九九热久久免费视频
|
色综合一区
|
亚洲激情在线
|
国产一区二区三区在线
|
国产成人自拍av
|
成人午夜视频在线观看
|
国产精品99999999
|
久久久久国产一区二区
|
日韩在线视频一区
|
欧美久久影院
|
久久亚洲国产精品
|
国产中文字幕网
|
精品在线一区二区
|
日韩三区
|
日韩精品一区二区三区在线
|
日韩在线免费
|
美女在线视频一区二区三区
|