AVR單片機PCF8591AD-DA實(shí)驗

未加入濾波函數所以數值有點(diǎn)晃動(dòng)


//PCF8591 AVR單片機程序 默認為輸入模式下通道0開(kāi)始通道0光敏電阻,通道1,熱敏電阻,通道2電位器,通道3外接電位器,如有標點(diǎn)符號丟失格式錯亂的情況可從這里下載源碼:http://www.51hei.com/f/avr8591.rar
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define uint unsigned int
#define k1 PIND_Bit4 //模擬量輸出值按鍵
#define k2 PIND_Bit5 //模擬量輸入通道設定
#define k3 PIND_Bit6 //輸入狀態(tài)鍵
#define k4 PIND_Bit7 //輸出狀態(tài)鍵
#define k2 PIND_Bit5 //模擬量輸入通道設定
#define k3 PIND_Bit6 //輸入狀態(tài)鍵
#define k4 PIND_Bit7 //輸出狀態(tài)鍵
uchar output_val=0; //輸出值
uchar input_val; //輸入值
uchar channel=0; //通道值
uchar mode=1; //輸入輸出狀態(tài)模式 1表示輸入2表示輸出 默認為輸入狀態(tài)
uchar input_val; //輸入值
uchar channel=0; //通道值
uchar mode=1; //輸入輸出狀態(tài)模式 1表示輸入2表示輸出 默認為輸入狀態(tài)
uchar st1[]=" Input mode ";
uchar st2[]=" output mode ";
uchar st2[]=" output mode ";
void delay(uint k)
{
uint i,j;
for(i=0;i
}
#include "1602.h"
void port_init() //I/O口初始化
{
PORTA=0xff;
DDRA=0xff;
PORTB=0xff;
DDRB=0xff;
PORTC=0xff;
DDRC=0xff;
PORTD=0xff;
DDRD=0x0f;
}
{
PORTA=0xff;
DDRA=0xff;
PORTB=0xff;
DDRB=0xff;
PORTC=0xff;
DDRC=0xff;
PORTD=0xff;
DDRD=0x0f;
}
//---------------TWI宏定義-------------
#define TWINT 7 //TWI完成當前操作允許應用程序介入時(shí),置位
#define TWSTA 5 //聲明自己希望成為主機TWI硬件檢測是否可用,若空閑則接口上產(chǎn)生START 信號,若繁忙則一直等待直到一個(gè)STOP狀態(tài)
#define TWSTO 4 //置位該位產(chǎn)生STOP狀態(tài)
#define TWEN 2 //TWI接口激活 置位后I/O引腳切換到TWI模式
#define TWINT 7 //TWI完成當前操作允許應用程序介入時(shí),置位
#define TWSTA 5 //聲明自己希望成為主機TWI硬件檢測是否可用,若空閑則接口上產(chǎn)生START 信號,若繁忙則一直等待直到一個(gè)STOP狀態(tài)
#define TWSTO 4 //置位該位產(chǎn)生STOP狀態(tài)
#define TWEN 2 //TWI接口激活 置位后I/O引腳切換到TWI模式
//--------------TWI狀態(tài)字定義------MT主方式傳輸,MR主方式接受----------
#define START 0x08 //start已經(jīng)發(fā)送
#define RE_START 0x10 //重復Start已經(jīng)發(fā)送
#define MT_SLA_ACK 0x18 //SLA+W已經(jīng)發(fā)送接受到應答 進(jìn)入MT模式
#define MT_SLA_NOACK 0x20 //SLA+W已經(jīng)發(fā)送接受到非應答
#define MT_DATA_ACK 0x28 //數據已經(jīng)發(fā)送接受到應答
#define MT_DATA_NOACK 0x30 //數據發(fā)送接受到非應答
#define MR_SLA_ACK 0x40 //SLA+R已經(jīng)發(fā)送接受到應答
#define MR_SLA_NOACK 0x48 //SLA+R已經(jīng)發(fā)送接受到非應答
#define MR_DATA_ACK 0x50 //接受到數據ACK已經(jīng)返回
#define MR_DATA_NOACK 0x58 //接受到數據NOACK已經(jīng)返回
#define MR_SLA_NOACK 0x48 //SLA+R已經(jīng)發(fā)送接受到非應答
#define MR_DATA_ACK 0x50 //接受到數據ACK已經(jīng)返回
#define MR_DATA_NOACK 0x58 //接受到數據NOACK已經(jīng)返回
//-------TWI常用操作(主模式寫(xiě),主模式讀)--------------
#define start() (TWCR=(1< #define stop() (TWCR=(1< #define wait() {while(!(TWCR&(1< #define test_ack() (TWSR&0xf8) //測試應答狀態(tài)
#define set_ack() (TWCR|=(1< #define set_noack() (TWCR=~(1< #define twi() (TWCR=(1< #define write_byte(x) {TWDR=(x);TWCR=(1<
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
#define start() (TWCR=(1<
#define set_ack() (TWCR|=(1<
//-----------------------------
uchar ADC_read(uchar chl) //讀取函數設置通道變量
{
uchar temp; //讀取值
start();
wait();
if(test_ack()!=START) return 0; //啟動(dòng)失敗返回0
write_byte(0x90); //發(fā)送寫(xiě)方向
wait();
if(test_ack()!=MT_SLA_ACK) return 0;
write_byte(0x40|chl); //發(fā)送寫(xiě)命令和通道值
wait();
if(test_ack()!=MT_DATA_ACK) return 0;
start(); //再次啟動(dòng)
wait();
if(test_ack()!=RE_START) return 0;
write_byte(0x91); //發(fā)送讀方向
wait();
if(test_ack()!=MR_SLA_ACK) return 0;
twi();
wait();
if(test_ack()!=MR_DATA_NOACK) return 0;
temp=TWDR;
stop();
return temp;
}
//------------------------------------------------
uchar ADC_write(uchar data)
{
start();
wait();
if(test_ack()!=START) return 1;
write_byte(0x90); //啟動(dòng)寫(xiě)方向
wait();
if(test_ack()!=MT_SLA_ACK) return 1;
write_byte(0x40); //模擬量輸出設定
wait();
if(test_ack()!=MT_DATA_ACK) return 1;
write_byte(data); //模擬量輸出值
wait();
if(test_ack()!=MT_DATA_ACK) return 1;
stop();
delay(10); //延時(shí)10ms 等待發(fā)送好
return 0;
}
uchar ADC_read(uchar chl) //讀取函數設置通道變量
{
uchar temp; //讀取值
start();
wait();
if(test_ack()!=START) return 0; //啟動(dòng)失敗返回0
write_byte(0x90); //發(fā)送寫(xiě)方向
wait();
if(test_ack()!=MT_SLA_ACK) return 0;
write_byte(0x40|chl); //發(fā)送寫(xiě)命令和通道值
wait();
if(test_ack()!=MT_DATA_ACK) return 0;
start(); //再次啟動(dòng)
wait();
if(test_ack()!=RE_START) return 0;
write_byte(0x91); //發(fā)送讀方向
wait();
if(test_ack()!=MR_SLA_ACK) return 0;
twi();
wait();
if(test_ack()!=MR_DATA_NOACK) return 0;
temp=TWDR;
stop();
return temp;
}
//------------------------------------------------
uchar ADC_write(uchar data)
{
start();
wait();
if(test_ack()!=START) return 1;
write_byte(0x90); //啟動(dòng)寫(xiě)方向
wait();
if(test_ack()!=MT_SLA_ACK) return 1;
write_byte(0x40); //模擬量輸出設定
wait();
if(test_ack()!=MT_DATA_ACK) return 1;
write_byte(data); //模擬量輸出值
wait();
if(test_ack()!=MT_DATA_ACK) return 1;
stop();
delay(10); //延時(shí)10ms 等待發(fā)送好
return 0;
}
關(guān)鍵詞:
AVR單片機PCF8591AD-D
相關(guān)推薦
技術(shù)專(zhuān)區
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線(xiàn)
- 開(kāi)關(guān)電源
- 單片機
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機控制
- 藍牙
- PLC
- PWM
- 汽車(chē)電子
- 轉換器
- 電源管理
- 信號放大器
評論