AVR單片機PCF8591AD-DA實驗

2021-01-04 電子產品世界

未加入

濾波

函數所以數值有點晃動

//PCF8591 AVR單片機程序 默認為輸入模式下通道0開始通道0光敏電阻,通道1,熱敏電阻,通道2電位器,通道3外接電位器,如有標點符號丟失格式錯亂的情況可從這裡下載源碼:http://www.51hei.com/f/avr8591.rar

#include
#include

#define uchar unsigned char
#define uint unsigned int

#define k1 PIND_Bit4 //模擬量輸出值按鍵
#define k2 PIND_Bit5 //模擬量輸入通道設定
#define k3 PIND_Bit6 //輸入狀態鍵
#define k4 PIND_Bit7 //輸出狀態鍵

uchar output_val=0; //輸出值
uchar input_val; //輸入值
uchar channel=0; //通道值
uchar mode=1; //輸入輸出狀態模式 1表示輸入2表示輸出 默認為輸入狀態

uchar st1[]=" Input mode ";
uchar st2[]=" output mode ";


void delay(uint k)
{
uint i,j;
for(i=0;ifor(j=0;j<1140;j++);
}

#include "1602.h"

void port_init() //I/O口初始化
{
PORTA=0xff;
DDRA=0xff;
PORTB=0xff;
DDRB=0xff;
PORTC=0xff;
DDRC=0xff;
PORTD=0xff;
DDRD=0x0f;
}

//TWI宏定義---
#define TWINT 7 //TWI完成當前操作允許應用程式介入時,置位
#define TWSTA 5 //聲明自己希望成為主機TWI硬體檢測是否可用,若空閒則接口上產生START 信號,若繁忙則一直等待直到一個STOP狀態
#define TWSTO 4 //置位該位產生STOP狀態
#define TWEN 2 //TWI接口激活 置位後I/O引腳切換到TWI模式


//----TWI狀態字定義-MT主方式傳輸,MR主方式接受
#define START 0x08 //start已經發送
#define RE_START 0x10 //重複Start已經發送
#define MT_SLA_ACK 0x18 //SLA+W已經發送接受到應答 進入MT模式
#define MT_SLA_NOACK 0x20 //SLA+W已經發送接受到非應答
#define MT_DATA_ACK 0x28 //數據已經發送接受到應答
#define MT_DATA_NOACK 0x30 //數據發送接受到非應答

#define MR_SLA_ACK 0x40 //SLA+R已經發送接受到應答
#define MR_SLA_NOACK 0x48 //SLA+R已經發送接受到非應答
#define MR_DATA_ACK 0x50 //接受到數據ACK已經返回
#define MR_DATA_NOACK 0x58 //接受到數據NOACK已經返回

//--TWI常用操作(主模式寫,主模式讀)----

#define start() (TWCR=(1<

#define stop() (TWCR=(1<

#define wait() {while(!(TWCR&(1<

#define test_ack() (TWSR&0xf8) //測試應答狀態

#define set_ack() (TWCR|=(1<

#define set_noack() (TWCR=~(1<

#define twi() (TWCR=(1<

#define write_byte(x) {TWDR=(x);TWCR=(1<

//----
uchar ADC_read(uchar chl) //讀取函數設置通道變量
{
uchar temp; //讀取值
start();
wait();
if(test_ack()!=START) return 0; //啟動失敗返回0
write_byte(0x90); //發送寫方向
wait();
if(test_ack()!=MT_SLA_ACK) return 0;
write_byte(0x40|chl); //發送寫命令和通道值
wait();
if(test_ack()!=MT_DATA_ACK) return 0;
start(); //再次啟動
wait();
if(test_ack()!=RE_START) return 0;
write_byte(0x91); //發送讀方向
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); //啟動寫方向
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); //延時10ms 等待發送好
return 0;
}



技術專區

相關焦點

  • PCF8591(AD-DA)晶片-51單片機程序
    注: PCF8591 是8位AD-DA晶片 轉換數據0---5 對應 0--255 通信協議IIC 模擬量輸出值和電壓的關係: 輸出電壓=(參考電壓-基點電位)/255
  • PCF8591 DA驅動程序
    專用變量定義 ***********************/#definePCF8591_WRITE0x90#definePCF8591_READ 0x91#define NUM 4 //接收和發送緩存區的深度uchar idata receivebuf[NUM]; //數據接收緩衝區uchar
  • PCF8591 AD/DA轉換MSP430程序
    PCF8591用的也是IIC 總線,有了昨晚寫的總線協議,倒不是很難,下一步可以考慮做一個不精確的信號發生器,睡覺去咯!iic.h文件的源碼在這裡:http://www.51hei.com/mcu/2319.html本文引用地址:http://www.eepw.com.cn/article/201611/324032.htm#ifndef __PCF8591_h#define __PCF8591_h#include "basic.h"
  • 「正點原子FPGA連載」第二十三章高速AD/DA實驗
    表 23.3.1 高速AD-DA轉換實驗管腳分配信號名 方向 管腳 埠說明 電平標準sys_clk input U18 系統時鐘,50Mhz LVCMOS33sys_rst_n input J15 系統復位,低有效 LVCMOS33da_clk output K18 DA(AD9708)驅動時鐘 LVCMOS33da_data[0] output P15
  • avr單片機和stm32區別與優缺點分析
    摘要:avr單片機和stm32單片機是目前使用較廣泛的單片機,那麼avr單片機和stm32單片機有什麼區別呢?有什麼優劣勢呢?   avr單片機特點:   1. avr系列沒有類似累加器A的結構,它主要是通過R16~R31寄存器來實現A的功能。
  • 【分享】PCF8591的硬體接口
    PCF8591是一個單電源低功耗的8位CMOS數據採集器件,具有4路模擬輸入,1路模擬輸出和一個串行I2C總線接口用來與MCU通信
  • PCF8591晶片的差分輸入原理解析
    打開APP PCF8591晶片的差分輸入原理解析 佚名 發表於 2019-11-28 16:59:27 控制字的第4位和第5位是用於控制
  • ADDA系列PCF8591的驅動程序
    _Nop(); _Nop(); /*時鐘低電平周期大於4μs*/ _Nop(); _Nop(); _Nop(); SCL=0; /*清時鐘線,鉗住I2C總線以便繼續接收*/ _Nop(); _Nop();}#include#include #define PCF8591
  • AVR單片機驅動無源蜂鳴器C程序
    定時器實險,周期信號驅動無源蜂鳴器,些實驗基於定時器的CTC模式,由硬體產生頻率信號。程序中實現單一頻率的周期性提示音。程序採用單任務方式,軟體延時。AVR單片機需要設置合適的熔絲位才能實現其功能,如果熔絲位設置的不對將有可能導致單片機自鎖,這是我整理的AVR單片機熔絲位的設置及拯救方,希望對大家有幫助。
  • 【安裝包】AVR開發環境_AVR_ studio4b528.zip
    AVR 所使用開發環境 avrstudio是一款avr單片機開發軟體,atmel公司推出的avr集成開發環境,,工程師常用軟體 ATMEL的AVR單片機的集成環境彙編級開發調試軟體,完全免費。
  • PCF8591A/D D/A之間轉換
    /******************** A/D D/A之間轉換********************/#include#define uint unsigned int#define uchar unsigned char#define PCF8591
  • pcf8563晶片功能_工作原理和引腳圖及應用介紹
    pcf8563簡介   PCF8563是PHILIPS公司推出的一款工業級內含I2C總線接口功能的具有極低功耗的多功能時鐘/日曆晶片。PCF8563的多種報警功能、定時器功能、時鐘輸出功能以及中斷輸出功能能完成各種複雜的定時服務,甚至可為單片機提供看門狗功能。
  • AVR學習心得(一)
    它花了我500個大洋,我希望我學會它後能給我找工作帶來更多的機會,也希望通過對AVR單片機的學習,打好學習ARM的基礎,為將來的ARM學習鋪平道路……本文引用地址:http://www.eepw.com.cn/article/201611/317322.htm 今天我向著我人生中的又一大目標進發了,這是我學習的第三種單片機。
  • 基於PCF8591的I_2C總線A_D_D_A轉換的資料
    *******************/ /******************* D/A轉換*******************/#include#define uint unsigned int#define uchar unsigned char#define PCF8591
  • Avr單片機編程---延遲函數
    avr-gcc提供了兩個延遲函數,可以在用戶的程序中使用,前提--加入avr/delay.h這個頭文件:********************************************* F_CPU在avr-gcc中有定義,這個值是在編譯的時候傳遞給編譯器的,說明用戶程序的晶振頻率,編譯器為了保證編譯過程中防止因用戶為定義這個 F_CPU的值,設定一個初值
  • AVR的程式語言Arduino可用Proteus仿真調試
    ATMEGA168P控制器的AD轉換是10位的轉換器,5V對應的數字量為1024,2.5V應該是512,所以單片機一旦得知AD轉換後的數字量超過512時,把數字接口13的LED的變量ledpin為HIGH。下面是Arduino程序:
  • Microchip推出全新功能安全型AVR DA系列單片機,支持實時控制...
    隨著物聯網(IoT)為工業和家庭應用提供更強的連接性,以及車聯網提升了駕駛室和操控功能,業界需要更高性能的單片機來實現更好的實時控制以及增強的人機接口應用。
  • Microchip推出全新功能安全型AVR? DA系列單片機,支持實時控制...
    隨著物聯網(IoT)為工業和家庭應用提供更強的連接性,以及車聯網提升了駕駛室和操控功能,業界需要更高性能的單片機來實現更好的實時控制以及增強的人機接口應用。
  • 為什麼很多單片機的工作電壓是5v?
    所以3v3和5v一般出現在信號電路或者單片機等vcc供電,而12v/24v一般出現在低壓動力電,例如主板、顯卡、軸流風機、監控器。硬體決定系統基礎,如果鋰電池早點應用的話估計還會有3.7/7.4這個系統。 為什麼很多單片機的工作電壓是5v?
  • AVR單片機CRC校驗碼的查表與直接生成
    AVR高速嵌入式單片機功能強大,在無線數據傳輸應用方面具有很大優勢。本文基於 Atmega128高速嵌入式單片機,實現32位CRC校驗碼的直接生成法和查表生成法;根據實驗結果,分析兩種方法的特點。 關鍵詞:Atmega128 CRC校驗碼 CRC生成表 數據段 引 言   隨著技術的不斷進步,各種數據通信的應用越來越廣泛。