www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]/************************************************** EEPROM讀寫操作 晶振:內(nèi)部 8M***************************************************/#include#include#define uchar unsigned char#define uint unsigned int

/**************************************************
EEPROM讀寫操作
晶振:內(nèi)部 8M
***************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar syserr;
void delay_EEPROM(uchar n) //延時(shí)
{
unsigned int a,b;
for(a=0;a for(b=0;b<100;b++)
;
}
//------在此設(shè)定芯片型號(hào)------
#define e2prom 256// <---在此設(shè)定芯片型號(hào), 1代表24C01; 16代表24C16; 512代表24C512

#if e2prom==1
#define PAGE_SIZE 8
#define SIZE 0x007f
#elif e2prom==2
#define PAGE_SIZE 8
#define SIZE 0x00ff
#elif e2prom==4
#define PAGE_SIZE 16
#define SIZE 0x01ff
#elif e2prom==8
#define PAGE_SIZE 16
#define SIZE 0x03ff
#elif e2prom==16
#define PAGE_SIZE 16
#define SIZE 0x07ff
#elif e2prom==32
#define PAGE_SIZE 32
#define SIZE 0x0fff
#elif e2prom==64
#define PAGE_SIZE 32
#define SIZE 0x1fff
#elif e2prom==128
#define PAGE_SIZE 64
#define SIZE 0x3fff
#elif e2prom==256
#define PAGE_SIZE 64
#define SIZE 0x7fff
#elif e2prom==512
#define PAGE_SIZE 128
#define SIZE 0xffff
#endif
//--------------------------

//--------在此設(shè)定芯片地址-------
#define W_ADD_COM 0xa0//寫字節(jié)命令及器件地址(根據(jù)地址實(shí)際情況改變), 1010 A2 A1 A0 0
#define R_ADD_COM 0xa1//讀命令字節(jié)及器件地址(根據(jù)地址實(shí)際情況改變), 1010 A2 A1 A0 1
//-------------------------------

#define SLAW0x18//SLA_W 已正常發(fā)送代碼,判斷器件是否正常應(yīng)答的常量.

//-----在此改變預(yù)置錯(cuò)誤號(hào)-----
#define ERR_SLAW10//寫字節(jié)命令及器件地址錯(cuò), 在此也就是讀寫器件錯(cuò)!!
//---------------------------

//-----------4個(gè)I2總線公用函數(shù), 可供其它I2總線器件的程序調(diào)用--------------
void i2cstart(void);//總線上起動(dòng)開始條件
uchar i2cwt(uchar a);//把一個(gè)字節(jié)數(shù)據(jù)輸入器件, 返回TWI狀態(tài)
uchar i2crd(void);//i2c讀要調(diào)用的函數(shù)
void i2cstop(void);//總線上起動(dòng)停止條件
//------------------------------------------------------------------------

uchar * wt24c_fc(uchar *p, uint ad, uchar n);//向24Cxx寫入數(shù)據(jù)wt24c_h()所要調(diào)用的函數(shù)

//向24Cxx寫入數(shù)據(jù)
//參數(shù): *p_rsc要輸出數(shù)據(jù)的主機(jī)內(nèi)存地址指針; ad_dst要寫入數(shù)據(jù)的i2c的地址(雙字節(jié)); num數(shù)據(jù)個(gè)數(shù)
//參數(shù)條件: ad_dst: ad_dst+(num-1)不能大于器件的最高地址; num必須>0;
void wt24c(uchar *p_rsc, uint ad_dst, uint num)
{ uint n;

n=ad_dst/PAGE_SIZE;//確定地址與塊地址的差
if(n)
n=(ulong)PAGE_SIZE*(n+1)-ad_dst;
else
n=PAGE_SIZE-ad_dst;

if(n>=num)//如果ad_dst所在的數(shù)據(jù)塊的末尾地址 >= ad_dst + num, 就直接寫入num個(gè)數(shù)據(jù)
{
wt24c_fc(p_rsc, ad_dst, num);
if(syserr!=0)
return;
}
else//如果ad_dst所在的數(shù)據(jù)塊末尾地址 < ad_dst + num, 就先寫入ad_dst所在的數(shù)據(jù)塊末尾地址與 ad_dst 之差個(gè)數(shù)據(jù)
{
p_rsc=wt24c_fc(p_rsc, ad_dst, n);
if(syserr!=0)
return;

num-=n; //更新剩下數(shù)據(jù)個(gè)數(shù)
ad_dst+=n;//更新剩下數(shù)據(jù)的起始地址

//把剩下數(shù)據(jù)寫入器件
while(num>=PAGE_SIZE)//先按PAGE_SIZE為長(zhǎng)度一頁(yè)一頁(yè)的寫入
{p_rsc=wt24c_fc(p_rsc, ad_dst, PAGE_SIZE);
if(syserr!=0) return;

num-=PAGE_SIZE;//更新剩余數(shù)據(jù)個(gè)數(shù)
ad_dst+=PAGE_SIZE;//更新剩下數(shù)據(jù)的起始地址
}

if(num)//把最后剩下的小于一個(gè)PAGE_SIZE長(zhǎng)度的數(shù)據(jù)寫入器件
wt24c_fc(p_rsc, ad_dst, num);
}
}


//從24cxx讀出數(shù)據(jù)
//參數(shù): *p_dst要讀入數(shù)據(jù)的主機(jī)內(nèi)存地址指針; ad_rsc要輸出數(shù)據(jù)的i2c的地址(整形); num數(shù)據(jù)個(gè)數(shù)(整形)
//參數(shù)條件: ad_dst+(num-1)不能大于器件的最高地址; num必須>0;
void port_init(void)
{

PORTC = 0xFF;
DDRC &= 0xfc;
}
//TWI initialize
// bit rate:100
void twi_init(void)
{
TWCR= 0x00; //disable twi
TWBR= 0x20; //set bit rate
TWSR= 0x00; //set prescale
TWAR= 0x00; //set slave address
TWCR= 0x04; //enable twi
}
void rd24c(uchar *p_dst, uint ad_rsc, uint num)
{
uchar t=0;
#if e2prom<32
t=ad_rsc>>8;
t<<=1;
#endif
i2cstart();//發(fā)送起始信號(hào)
if(i2cwt(W_ADD_COM+t)==SLAW)//發(fā)送SLA_W, 寫字節(jié)命令及器件地址
{
#if e2prom>=32
i2cwt(ad_rsc>>8);//ad_rsc的高位, 發(fā)送要讀出數(shù)據(jù)的地址
#endif
i2cwt(ad_rsc);//ad_rsc的低位

i2cstart();//再發(fā)送起始信號(hào)
i2cwt(R_ADD_COM+t);//發(fā)送SLA_R, 讀命令字節(jié)及器件地址

for(;num>0;num--)
{
*p_dst=i2crd();//從器件讀出一個(gè)字節(jié)
p_dst++;
}
}
else
syserr=ERR_SLAW;//寫字節(jié)命令及器件地址錯(cuò)或?qū)Ψ綗o(wú)應(yīng)答

i2cstop();

}
//向24Cxx寫入數(shù)據(jù)wt24c_h()所要調(diào)用的函數(shù)
//返回寫入n個(gè)字節(jié)后的主機(jī)內(nèi)存指針

uchar * wt24c_fc(uchar *p, uint ad, uchar n)
{
uchar t=0;
#if e2prom<32
t=ad>>8;
t<<=1;
#endif
i2cstart();//發(fā)送起始信號(hào)
if(i2cwt(W_ADD_COM+t)==SLAW)//發(fā)送SLA_W, 寫字節(jié)命令及器件地址
{
#if e2prom>=32
i2cwt(ad>>8);//ad_dst的高位到器件
#endif
i2cwt(ad);//ad_dst的低位到器件

for(;n>0;n--)//發(fā)送要寫入的數(shù)據(jù)
{ i2cwt(*p);
p++;
}
}
else syserr=ERR_SLAW;//寫字節(jié)命令及器件地址錯(cuò)

i2cstop();
delay_EEPROM(10);//延時(shí)6ms

return(p);
}

//-------------------------------以下為其它I2總線器件可調(diào)用的函數(shù)--------------------------

//總線上起動(dòng)開始條件
void i2cstart(void)
{
TWCR= BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)));
}

//把一個(gè)字節(jié)數(shù)據(jù)輸入器件, 返回TWI狀態(tài)
uchar i2cwt(uchar a)
{
TWDR = a;
TWCR = BIT(TWINT) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)));
_NOP();
return(TWSR&0b11111000);
}

//i2c讀要調(diào)用的函數(shù)
//從器件讀出一個(gè)字節(jié)
uchar i2crd(void)
{
TWCR= BIT(TWINT) | BIT(TWEA) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)));
return(TWDR);

}


//總線上起動(dòng)停止條件
void i2cstop(void)
{
TWCR = BIT(TWINT) | BIT(TWSTO) | BIT(TWEN);
}


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

1)那就是在之前的介紹中說過,在說一遍~~主機(jī)和從機(jī)的兩個(gè)移位寄存器可以被認(rèn)為是一個(gè)公開的16位環(huán)形移位寄存器,當(dāng)數(shù)據(jù)從主機(jī)移向從機(jī)時(shí),同時(shí)從機(jī)餓數(shù)據(jù)也向相反的放向移向主機(jī)。這就意味著在一個(gè)以為周期內(nèi),主機(jī)

關(guān)鍵字: atmega16 avr單片機(jī) spi 同步串行接口

五、ATMEGA16的USART與PC機(jī)串行通信五—(02)、PC機(jī)發(fā)送字符給單片機(jī),然后用液晶顯示發(fā)送的字符~~~這章節(jié)也是相對(duì)挺簡(jiǎn)單的~~直接上圖片吧~~基本上就這么點(diǎn)吧~~然后就是程序了,這里我只是粘貼一下重要的程...

關(guān)鍵字: atmega16 avr單片機(jī) usart 串行通信

九、ATMEGA16的模數(shù)轉(zhuǎn)換器九—(01)、ATMEGA16的模數(shù)轉(zhuǎn)換器的介紹1、介紹1)特點(diǎn):? 10 位 精度? 0.5 LSB 的非線性度? ± 2 LSB 的絕對(duì)精度? 65 - 260 μs 的轉(zhuǎn)換時(shí)間? 最...

關(guān)鍵字: atmega16 avr單片機(jī) 模數(shù)轉(zhuǎn)換器

五、ATMEGA16的USART與PC機(jī)串行通信五—(03)、PC機(jī)發(fā)送控制指令控制單片機(jī)工作~(這個(gè)控制還是比較簡(jiǎn)單的~~,不過個(gè)人認(rèn)為還是有水平的~)還是先上圖片~~,然后程序,程序師模塊化的,我盡量貼全點(diǎn)~~然后就...

關(guān)鍵字: atmega16 avr單片機(jī) usart 串行通信

三、ATMEGA16驅(qū)動(dòng)16*2點(diǎn)陣字符液晶三—(01)、ATMEGA16驅(qū)動(dòng)16*2點(diǎn)陣字符液晶這篇文章只是簡(jiǎn)單的驅(qū)動(dòng)并讓1602顯示,并沒有用到讀數(shù)據(jù)和讀狀態(tài)的部分,也沒有用到讀寫檢測(cè)(要是感興趣的話還是寫寫這里吧)...

關(guān)鍵字: atmega16 avr單片機(jī) 點(diǎn)陣 字符液晶模塊

四、ATMEGA16的定時(shí)/計(jì)數(shù)器四—(01)、四位顯示秒表試驗(yàn)首先懷念一下咱們的體育課,再體育課或者田徑比賽的時(shí)候,老師會(huì)經(jīng)常使用秒表來(lái)記錄同學(xué)們的成績(jī)。在此,來(lái)進(jìn)行一個(gè)秒表的設(shè)計(jì)。(說實(shí)話,這個(gè)秒表真的太貴了

關(guān)鍵字: atmega16 avr單片機(jī) 定時(shí) 計(jì)數(shù)器

//1號(hào)主機(jī):#include #include#include#include #defineucharunsigned char#defineSTATUS(TWSR&0xf8)#defineSLA_W0x32...

關(guān)鍵字: atmega16 twi 互相通信 中斷形式

在設(shè)置之前呢,我得把ATMEGA16里面的datasheet里面的資料說說,當(dāng)然是關(guān)于系統(tǒng)時(shí)鐘和時(shí)鐘選項(xiàng)的一、系統(tǒng)時(shí)鐘及時(shí)鐘選項(xiàng)(這里主要是介紹原理,三里面會(huì)介紹如何設(shè)置,其實(shí)你會(huì)了一,那后面的二和三就相當(dāng)簡(jiǎn)單了~~你懂

關(guān)鍵字: atmega16 avr單片機(jī) proteus 系統(tǒng)時(shí)鐘

//------------------------------------------------------------------------------//ATMEGA16與PC機(jī)的通信實(shí)驗(yàn)1//PC機(jī)發(fā)送一個(gè)字...

關(guān)鍵字: atmega16 avr單片機(jī) usart 串行通信

一、ATMEGA16的I\\0端口的使用:(只有一個(gè)實(shí)驗(yàn),下面的部分每個(gè)小節(jié)可能有幾個(gè)實(shí)驗(yàn)驗(yàn)證,你懂得)一—(01)、)—使用4*4行列式按鍵開關(guān)的使用I/O端口介紹:直接一個(gè)圖就哦了,因?yàn)楦緵]什么,就是控制寄存器(這...

關(guān)鍵字: atmega16 avr單片機(jī) i0端口
關(guān)閉