您的位置 首页 产品

AVR单片机PCF8591AD-DA试验

未加入滤波函数所以数值有点晃动PCF8591AVR单片机程序默认为输入模式下通道0开始通道0光敏电阻,通道1,热敏电阻,通道2电位器,通道

未参加滤波函数所以数值有点晃动

//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;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/318414.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部