未加入滤波函数所以数值有点晃动
//PCF8591 AVR单片机程序 默认为输入模式下通道0开始通道0 光敏电阻,通道1,热敏电阻,通道2电位器,通道3外接电位器,如有标点符号丢失格式错乱的情况可从这里下载源码: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 //输入状态键
#define k4 PIND_Bit7 //输出状态键
#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 input_val; //输入值
uchar channel=0; //通道值
uchar mode=1; //输入输出状态模式 1表示输入2表示输出 默认为输入状态
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完成当前操作允许应用程序介入时,置位
#define TWSTA 5 //声明自己希望成为主机TWI硬件检测是否可用,若空闲则接口上产生START 信号,若繁忙则一直等待直到一个STOP状态
#define TWSTO 4 //置位该位产生STOP状态
#define TWEN 2 //TWI接口激活 置位后I/O引脚切换到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已经返回
#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<
关键字:AVR单片机 PCF859 1AD-DA
引用地址:AVR单片机PCF8591AD-DA实验
#define start() (TWCR=(1<
#define set_ack() (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;
}
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;
}
[page]
//-----------------------------------------------------------
void key1() //模拟量输出按键
{
static uchar i,j;
if(k1==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k1==0)
{
i=1;j=0;
output_val=output_val+10;
}
}
}
}
else
{
i=0;
j=0;
}
}
//---------------------------------------------------
void key2() //模拟量输出通道选择
{
static uchar i,j;
if(k2==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k2==0)
{
i=1;j=0;
channel++;
if(channel>3)channel=0;
}
}
}
}
else
{
i=0;
j=0;
}
}
//-----------------------------------------------------------
void key1() //模拟量输出按键
{
static uchar i,j;
if(k1==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k1==0)
{
i=1;j=0;
output_val=output_val+10;
}
}
}
}
else
{
i=0;
j=0;
}
}
//---------------------------------------------------
void key2() //模拟量输出通道选择
{
static uchar i,j;
if(k2==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k2==0)
{
i=1;j=0;
channel++;
if(channel>3)channel=0;
}
}
}
}
else
{
i=0;
j=0;
}
}
//---------------------------------------
void key3()
{
static uchar i,j;
if(k3==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k3==0)
{
i=1;j=0;
mode=1; //输入模式
}
}
}
}
else
{
i=0;
j=0;
}
}
void key3()
{
static uchar i,j;
if(k3==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k3==0)
{
i=1;j=0;
mode=1; //输入模式
}
}
}
}
else
{
i=0;
j=0;
}
}
//---------------------------------
void key4()
{
static uchar i,j;
if(k4==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k4==0)
{
i=1;j=0;
mode=2; //输出模式
}
}
}
}
else
{
i=0;
j=0;
}
}
//-----------------------------------------------------
void show_in()
{
displaychar(0,0,st1); // 第一行显示输入状态字符串
displayonechar(14,1,channel+48); //通道号选择
}
//--------------------------------------------------
void show_out()
{
displaychar(0,0,st2); //第一行显示输出状态字符串
displayonechar(14,1,' ');
}
//---------------------------------------------------
void show_value(uchar k) //显示数值
{
displayonechar(7,1,((k/100)+48));
displayonechar(8,1,((k%100/10)+48));
displayonechar(9,1,((k%10)+48));
}
void key4()
{
static uchar i,j;
if(k4==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k4==0)
{
i=1;j=0;
mode=2; //输出模式
}
}
}
}
else
{
i=0;
j=0;
}
}
//-----------------------------------------------------
void show_in()
{
displaychar(0,0,st1); // 第一行显示输入状态字符串
displayonechar(14,1,channel+48); //通道号选择
}
//--------------------------------------------------
void show_out()
{
displaychar(0,0,st2); //第一行显示输出状态字符串
displayonechar(14,1,' ');
}
//---------------------------------------------------
void show_value(uchar k) //显示数值
{
displayonechar(7,1,((k/100)+48));
displayonechar(8,1,((k%100/10)+48));
displayonechar(9,1,((k%10)+48));
}
//-----------------------------------
void main()
{
uchar temp; //显示模拟量值
port_init();
init1602();
ADC_write(0);
delay(1000);
while(1)
{
if(mode==1)
{
temp=ADC_read(channel); //从通道channel读取模拟量值给变量temp
delay(3);
show_in(); //显示输入状态字符串
show_value(temp);
key2(); //模拟输入通道按键
delay(3);
}
if(mode==2)
{
ADC_write(output_val); //模拟量输出值
show_out(); //显示模拟量输出状态字符串
show_value(output_val);
key1(); //模拟输出值按键
delay(3);
}
void main()
{
uchar temp; //显示模拟量值
port_init();
init1602();
ADC_write(0);
delay(1000);
while(1)
{
if(mode==1)
{
temp=ADC_read(channel); //从通道channel读取模拟量值给变量temp
delay(3);
show_in(); //显示输入状态字符串
show_value(temp);
key2(); //模拟输入通道按键
delay(3);
}
if(mode==2)
{
ADC_write(output_val); //模拟量输出值
show_out(); //显示模拟量输出状态字符串
show_value(output_val);
key1(); //模拟输出值按键
delay(3);
}
key3(); //输入模式
key4(); //输出模式
}
key4(); //输出模式
}
}
上一篇:AVR 1-99秒1602启停显示
下一篇:AVR单片机频率计设计 频率输入源STM32口
推荐阅读最新更新时间:2024-03-16 14:04
avr单片机 串口实现printf(使用变参函数)
#include #include #include typedef unsigned char uint8; static void usart_init(void) { UCSRA = 0x02; UCSRB = 0x18; UCSRC = 0x06; UBRRH = 0x00; UBRRL = 103; } static void put_char(uint8 data) { if (data == '/r') put_char(0x09); while ( !(UCSRA & (1 UDRE
[单片机]
AVR单片机入门系列(17)AVR IO输入之矩阵按键扫描程序
系统功能 使用AVR扫描4*4矩阵按键,一旦扫描到按键被按,做出被按的按键号指示。 硬件设计 关于AVR的I/O结构及相关介绍详见Datasheet,这里仅对作部分简单介绍,下面是AVR的I/O引脚配置表: AVR I/O 口引脚配置表 DDRXn PORTXn PUD I/O 方式 内部上拉电阻 引脚状态说明 0 0 X 输入 无效 三态(高阻) 0 1 0 输入 有效 外部
[单片机]
AVR单片机定时器输出PWM的设计及注意问题
一、定时/计数器PWM设计要点 根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点: 1.首先应根据实际的情况,确定需要输出的PWM频率范围,这个频率与控制的对象有关。如输出PWM波用于控制灯的亮度,由于人眼不能分辨42Hz以上的频率,所以PWM的频率应高于42Hz,否则人眼会察觉到灯的闪烁。 2.然后根据需要PWM的频率范围确定ATmega128定时/计数器的PWM工作方式。AVR定时/计数器的PWM模式可以分成快速PWM和频率(相位)调整PWM两大类。 3.快速PWM可以的到比较高频率的PWM输出,但占空比的调节精度稍微差一些。此时计数器仅工作在单程正向计数方式,
[单片机]
AVR单片机的RC5和RC6算法比较与改进
摘要:RC5及RC6是两种新型的分组密码。AVR高速嵌入式单片机功能强大,在无线数据传输应用方面很有优势。本文基于Atmega128高速嵌入式单片机,实现RC5和RC6加密及解密算法,并对算法进行汇编语言的优化及改进。根据实验结果。对两种算法的优热点进行比较和分析。
关键词:Atmega128 RC5 RC6 分组密码 混合密钥 Flash
引言
在无线局域网中,传输的介质主要是无线电波和红外线,任何具有接收能力的窍听者都有可能拦截无线信道中的数据,掌握传输的内容,造成数据泄密。因此,对于无线局域网来说,数据的加密是关键技术之一。
AVR高速嵌入式单片机是8位RISC MCU,执行大多数指令只需一个时钟周期,速度快(8M
[单片机]
AVR单片机按键检测
程序代码如下: #include avr/io.h #include util/delay.h int main(void) { DDRA=0XFF; PORTA=0XFF; DDRD=0X00; PORTD=0XFF; while(1) { if(PIND==0XFE) { _delay_ms(100); if(PIND==0XFE)PORTA=~PORTA; } } }
[单片机]
基于AVR单片机的可预置程控宽带直流功率放大电路设计
本文采用AVR单片机ATmegal28作为核心控制器,结合10位串行D/A芯片 TLC5615 、功率运放THS3092、可编程增益运放AD603以及其他相关电路,构成了可预置程控宽带直流功率放大电路。该电路系统增益调节范围为O~60 dB,步进间距为1 dB,频带为DC~10 MHz,输出电压有效值为10 V,矩阵键盘预置增益值步进,点阵液晶显示实时电压有效值,人机界面友好,操作简单方便。 1 系统总体方案 若采用可编程放大的思想,将输入的信号作为高速D/A转换器的基准电压,那么D/A转换器作为一个程控衰减器,对速度的要求很高。同时,为了实现O~60 dB增益可调,势必需要D/A转换器输出衰减最少60 dB以上。假设信
[单片机]
AVR单片机USART串口通信基本应用
/********************************************* File name : usart.c Chip type : ATmega16 Program type : Application Clock frequency : 11.0592MHz Memory model : Small 注意:发送采用查询方式,接收采用中断方式,在初始化程序中,需要将TXD设置成输出方式,RXD设置成输入方式,并使RXD的内部上拉有效 *********************************************/ #include mega16.
[单片机]
AVR单片机入门----MEGA端口操作
AVR端口是真正的双向端口,不像51伪双向。这也是AVR的一项优势,只是操作时大家注意DDRn就可以了。真正双向端口在模拟时序方面不如伪双向的方便。 DDRn PORTn PINn 解释:n为端口号:ABCDE DDRn:控制端口是输入还是输出,0为输入,1为输出。个人记忆方法:一比零大所以往外挤,即1为输出,0为输入。 PORTn:从引脚输出信号,当DDRn为1时,可以通过PORTn=x等端口操作语句给引脚输出赋值。 PINn:从引脚读输入信号,无论DDRn为何值,都可以通过x=PINn获得端口n的外部电平。 当引脚配置为输入时,若PORTxn 为 1“,上拉电阻将使能。内部上拉电阻的使用在键盘扫描的时候
[单片机]
小广播
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐
最新单片机文章
更多热门文章
更多每日新闻
更多往期活动
11月24日历史上的今天
厂商技术中心