新入門的看官請點擊此處目錄:
這次我們來研究一下AD轉換模塊和外部存儲模塊。
-
AD轉換
CT107D實驗板采用的AD轉換芯片是PCF8591.
以下是百度百科的簡介:
PCF8591是一個單片集成、單獨供電、低功耗、8-bit CMOS數據獲取器件。PCF8591具有4個模擬輸入、1個模擬輸出和1個串行I2C總線接口。PCF8591的3個地址引腳A0, A1和A2可用于硬件地址編程,允許在同個I2C總線上接入8個PCF8591器件,而無需額外的硬件。在PCF8591器件上輸入輸出的地址、控制和數據信號都是通過雙線雙向I2C總線以串行的方式進行傳輸。
PCF8591芯片可以實現AD/DA轉換,比賽官方只對AD轉換做要求,所以我們只看模數轉換。
從簡介中知道,該芯片是通過I2C總線通信的。所以在編程時會用到I2C總線的驅動,多數芯片都是通過此類型總線與單片機主機通信,掌握好總線的應用很重要。
I2C總線驅動如下:
//總線開始
void iic_start(void)
{
SDA = 1;
_nop_();
SCL = 1;
somenop();
SDA = 0;
somenop();
SCL = 0;
}
//總線關閉
void iic_stop(void)
{
SDA = 0;
_nop_();
SCL = 1;
somenop();
SDA = 1;
}
//總線問答
void iic_ack(bit ackbit)
{
if(ackbit)
SDA = 0;
else
SDA = 1;
somenop();
SCL = 1;
somenop();
SCL = 0;
SDA = 1;
somenop();
}
//等待問答
bit iic_waitack(void)
{
SDA = 1;
somenop();
SCL = 0;
somenop();
if(SDA)
{
SCL = 0;
iic_stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
//發送字節
void iic_sendbyte(uchar byt)
{
uchar i;
for(i = 0; i<8; i++)
{
if(byt&0x80)
SDA = 1;
else
SDA = 0;
somenop();
SCL = 1;
byt <<= 1;
somenop();
SCL = 0;
}
}
//回送數據
uchar iic_recbyte(void)
{
uchar da;
uchar i;
for(i = 0; i<8; i++)
{
SCL = 1;
somenop();
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
somenop();
}
return da;
}
待初始化好總線后,單片機便可讀取總線傳送回來的數據。
uchar adc_pcf8591(void)
{
uchar temp;
iic_start();
iic_sendbyte(0x91);
iic_waitack();
temp = iic_recbyte();
iic_ack(0);
iic_stop();
return temp;
}
-
外部存儲模塊
板子上搭載的存儲芯片是AT24c02。
AT24C02是一個2K位串行CMOS E2PROM, 內部含有256個8位字節,CATALYST公司的先進CMOS技術實質上減少了器件的功耗。AT24C02有一個8字節頁寫緩沖器。該器件通過IIC總線接口進行操作,有一個專門的寫保護功能。
嗯,芯片也是用I2C總線通信的,所以其他的不用多說,自然會用上I2C總線的驅動,另外再加入讀寫驅動就行了。
//寫AT24c02
void wrbyte_24c02(uchar add, uchar dat)
{
iic_start();
iic_sendbyte(0xa0);//寫地址
iic_waitack();
iic_sendbyte(add);
iic_waitack();
iic_sendbyte(dat);
iic_waitack();
iic_stop();
delay(10);
}
//讀AT24c02
uchar rdbyte_24c02(uchar add)
{
uchar da;
iic_start();
iic_sendbyte(0xa0); //寫地址
iic_waitack();
iic_sendbyte(add);
iic_waitack();
iic_start();
iic_sendbyte(0xa1); //讀地址
iic_waitack();
da = iic_recbyte();
iic_ack(0);
iic_stop();
return da;
}
其實都很簡單,只要用心學習,自然而然就明白其中的道理了。