#include<iom16.h>与#include<avr/io.h>区别,avr单片机的程序开头,两种效果一样吗?
#include<avr/io.h>是在128程序里的#include<iom16.h>是在16里的...
#include<avr/io.h>是在128程序里的
#include<iom16.h>是在16里的 展开
#include<iom16.h>是在16里的 展开
展开全部
/*****************************************************
CodeWizardAVR
http://www.avrdiy.com
Chip type : ATmega48V
Clock frequency : 1.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
INT0最好接一个4.7K的上拉电阻,按键对地有效
没有使用延时/通信语句,所以使用内部/外部时钟都可以
每按动INT0按键一次,PD3的电平就翻转一次
本例子没有考虑太多的按键防抖动功能*******************/
#include <mega48.h>
interrupt [2] void INT0_isr(void) //INT0的中断向量是2,请参考M48数据手册的48页
{
PORTD.3=~PORTD.3; //电平取反
EIFR|=1; //清除INT0中断触发标记,防止按键抖动
}
void main(void)
{
PORTD.2=1;
DDRD.2=0; //设置INT0端口为输入,上拉电阻有效
PORTD.3=0;
DDRD.3 =1; //设置PD3输出低电平,准备驱动蜂鸣器
EIMSK|=1; //打开INT0中断
EICRA|=3; //INT0上升沿触发
#asm("sei") //插入汇编语句,打开全局中断
while (1) //循环,等待中断
{
#asm("nop") //空操作的汇编代码,等待中断发生
};
}
ATMEGA48的ADC模数转换例子//www.avrdiy.com
//ADC结果由串口输出到电脑显示
#include <mega48.h>
#include <stdio.h>
#include <delay.h>
void main(void)
{
//外部时钟 7.3728MHz (请取消时钟8分频)
//串口初始化,波特率9600Hz,8个数据位,1个停止位,无奇偶校验,无中断使能
UCSR0B=8;
UCSR0C=6;
UBRR0L=47;
//*****************************************************************
ADMUX=96; //设置参考电压为AVCC,结构左对齐(就是8位精度)
ADCSRA|=135; //使能ADC,ADC时钟=系统时钟128分频
while (1)
{
unsigned char adc;
ADMUX=ADMUX&240|2; //清除已选择的ADC通道,选择新的ADC通道(0-7)
ADCSRA|=64; //启动单次ADC转换
while((ADCSRA&16)==0); //等待ADC转换结束
adc=ADCH; //结果左对齐只需读取高8位数据
ADCSRA|=16; //清除ADC转换结束标记
putchar(adc/100+48); //从串口输出ADC的百位数
putchar(adc/10%10+48); //从串口输出ADC的十位数
putchar(adc%10+48); //从串口输出ADC的个位数
delay_ms(500); //延时
putchar(13); //回车
putchar(10); //换行
}
}
ATMEGA8/ATMEGA16多机通讯例子
下面是一个M16的多机通讯例子,也适合M8,只需要修改头文件就可以了,本例子在3台机上测试并稳定通过
主机代码
/*
www.avrdiy.com AVR单片机DIY网 潘小艺 CVAVR1.25.9
通讯规则:
01:时钟7.3728 MHz/波特率9600/9个数据位/奇校验/1个停止位/硬件多机通讯功能/
02:通讯连接采用硬件MAX485,双向单工
03:MAX485的RE/DE并联接到单片机的PD2脚(高电平发送/低电平接收)
04:所有MAX485的A脚并联/B脚并联/D脚接TXD/R脚接RXD
05:每个上行/下行的数据包的字节个数都是一样的(通讯数据量)
06:数据包格式: 地址_数据1_数据2_数据3_数据n_CRC8校验码
07:所有单元的数据接收都是采用中断+查询的方式
08:总是由主机向从机下发一个数据包,从机收到数据包并校验正确后向主机回复一个数据包
09:不管是主机还是从机,如果收到的数据包有任何错误,都将丢弃该数据包,等效于没有接收
10:通讯采用主机轮询方式,从机之间不能相互通讯,必须通过主机才能交换数据
11:无效地址是0,主机地址是1,从机地址是11.12.13...广播地址是255
*/
#include <mega16.h>
#include <delay.h>
#include <usart.h>
#include <crc8.h>
#define amount 10 //设定通讯数据量
#define address 1 //请在这里设定本机地址
#define max485_out PORTD.2=1
#define max485_in PORTD.2=0
#define max485_RW_ok DDRD.2=1
unsigned char send[amount]; //发件箱
unsigned char inbox[amount]; //收件箱
unsigned char n=0; //记忆接收中断的次数
unsigned char x=0;
//**************************************************************************************
void usart_out(unsigned char *datas,unsigned char n)
{
unsigned char i=0;
max485_out; //使MAX485处于发送状态
while(i<n) //一共发送n个数据
{
if(i==0) UCSRB|=1; else UCSRB&=254;
UDR=*(datas+i); //装载数据开始发送
while((UCSRA&64)==0); //等待发送结束
UCSRA|=64; //清除发送结束标志
i++; //发送次数统计
}
max485_in; //使MAX485处于接收状态
}
//**************************************************************************************
interrupt[12] Rxd_isr(void) //接收中断
{
if( UCSRA&28 ){ n=UDR; n=0; UCSRA|=0x01; } else //接收出错就重新打开地址帧筛选功能
{
if( UCSRB&2 ) n=0; //检测到地址信息时计数清零
inbox[n]=UDR; n++; //把接收到的数据保存到收件箱
if( inbox[0]==address ) UCSRA&=254; else UCSRA|=0x01; //地址筛选
}
}
//**************************************************************************************
void main(void)
CodeWizardAVR
http://www.avrdiy.com
Chip type : ATmega48V
Clock frequency : 1.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
INT0最好接一个4.7K的上拉电阻,按键对地有效
没有使用延时/通信语句,所以使用内部/外部时钟都可以
每按动INT0按键一次,PD3的电平就翻转一次
本例子没有考虑太多的按键防抖动功能*******************/
#include <mega48.h>
interrupt [2] void INT0_isr(void) //INT0的中断向量是2,请参考M48数据手册的48页
{
PORTD.3=~PORTD.3; //电平取反
EIFR|=1; //清除INT0中断触发标记,防止按键抖动
}
void main(void)
{
PORTD.2=1;
DDRD.2=0; //设置INT0端口为输入,上拉电阻有效
PORTD.3=0;
DDRD.3 =1; //设置PD3输出低电平,准备驱动蜂鸣器
EIMSK|=1; //打开INT0中断
EICRA|=3; //INT0上升沿触发
#asm("sei") //插入汇编语句,打开全局中断
while (1) //循环,等待中断
{
#asm("nop") //空操作的汇编代码,等待中断发生
};
}
ATMEGA48的ADC模数转换例子//www.avrdiy.com
//ADC结果由串口输出到电脑显示
#include <mega48.h>
#include <stdio.h>
#include <delay.h>
void main(void)
{
//外部时钟 7.3728MHz (请取消时钟8分频)
//串口初始化,波特率9600Hz,8个数据位,1个停止位,无奇偶校验,无中断使能
UCSR0B=8;
UCSR0C=6;
UBRR0L=47;
//*****************************************************************
ADMUX=96; //设置参考电压为AVCC,结构左对齐(就是8位精度)
ADCSRA|=135; //使能ADC,ADC时钟=系统时钟128分频
while (1)
{
unsigned char adc;
ADMUX=ADMUX&240|2; //清除已选择的ADC通道,选择新的ADC通道(0-7)
ADCSRA|=64; //启动单次ADC转换
while((ADCSRA&16)==0); //等待ADC转换结束
adc=ADCH; //结果左对齐只需读取高8位数据
ADCSRA|=16; //清除ADC转换结束标记
putchar(adc/100+48); //从串口输出ADC的百位数
putchar(adc/10%10+48); //从串口输出ADC的十位数
putchar(adc%10+48); //从串口输出ADC的个位数
delay_ms(500); //延时
putchar(13); //回车
putchar(10); //换行
}
}
ATMEGA8/ATMEGA16多机通讯例子
下面是一个M16的多机通讯例子,也适合M8,只需要修改头文件就可以了,本例子在3台机上测试并稳定通过
主机代码
/*
www.avrdiy.com AVR单片机DIY网 潘小艺 CVAVR1.25.9
通讯规则:
01:时钟7.3728 MHz/波特率9600/9个数据位/奇校验/1个停止位/硬件多机通讯功能/
02:通讯连接采用硬件MAX485,双向单工
03:MAX485的RE/DE并联接到单片机的PD2脚(高电平发送/低电平接收)
04:所有MAX485的A脚并联/B脚并联/D脚接TXD/R脚接RXD
05:每个上行/下行的数据包的字节个数都是一样的(通讯数据量)
06:数据包格式: 地址_数据1_数据2_数据3_数据n_CRC8校验码
07:所有单元的数据接收都是采用中断+查询的方式
08:总是由主机向从机下发一个数据包,从机收到数据包并校验正确后向主机回复一个数据包
09:不管是主机还是从机,如果收到的数据包有任何错误,都将丢弃该数据包,等效于没有接收
10:通讯采用主机轮询方式,从机之间不能相互通讯,必须通过主机才能交换数据
11:无效地址是0,主机地址是1,从机地址是11.12.13...广播地址是255
*/
#include <mega16.h>
#include <delay.h>
#include <usart.h>
#include <crc8.h>
#define amount 10 //设定通讯数据量
#define address 1 //请在这里设定本机地址
#define max485_out PORTD.2=1
#define max485_in PORTD.2=0
#define max485_RW_ok DDRD.2=1
unsigned char send[amount]; //发件箱
unsigned char inbox[amount]; //收件箱
unsigned char n=0; //记忆接收中断的次数
unsigned char x=0;
//**************************************************************************************
void usart_out(unsigned char *datas,unsigned char n)
{
unsigned char i=0;
max485_out; //使MAX485处于发送状态
while(i<n) //一共发送n个数据
{
if(i==0) UCSRB|=1; else UCSRB&=254;
UDR=*(datas+i); //装载数据开始发送
while((UCSRA&64)==0); //等待发送结束
UCSRA|=64; //清除发送结束标志
i++; //发送次数统计
}
max485_in; //使MAX485处于接收状态
}
//**************************************************************************************
interrupt[12] Rxd_isr(void) //接收中断
{
if( UCSRA&28 ){ n=UDR; n=0; UCSRA|=0x01; } else //接收出错就重新打开地址帧筛选功能
{
if( UCSRB&2 ) n=0; //检测到地址信息时计数清零
inbox[n]=UDR; n++; //把接收到的数据保存到收件箱
if( inbox[0]==address ) UCSRA&=254; else UCSRA|=0x01; //地址筛选
}
}
//**************************************************************************************
void main(void)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询