iom16V_h
AtmelStudio-6.0简易入门教程(精炼实用)
一、建议工程文件AtmelStudi6.0这个全新的环境使用起来极其不顺手,因为首先我对AtmelStudio以前的版本也根本没有使用经验,就根据很陌生,其次,这个新版本软件还根本没有人用,根本没有任何的相关教程资料,唯一可以参考的只是官网的比较简单的视频教程,还是英文讲解,反正没怎么搞透。
不过还是硬着头皮用下去,因为软件是免费的,而且当后来我知道代码编辑环境其实就是微软VS环境的时候,我就更不犹豫了,大家应该都了解VS的代码编写环境是很智能的,尤其自动补全功能。
现在,我已经能很熟练的使用AtmelStudio6.0软件了,随着使用我也更加喜欢玩AVR单片机做一些小作品了,而不再用普通51和STC了。
当使用熟练以后也就感觉到其实这个免费智能的编译环境其实是很简单的,那现在我就帮助更多喜欢使用AVR而没用使用AtmelStudio软件的同学们轻松越过这一个门槛,进入一个美好的编程世界。
该软件的不足之处:一是软件相对较大,打开比较慢,但是运行还是比较顺利的;二是不支持山寨仿真器,这可苦了没钱的劳苦电工们了。
(不过我都是用ISP烧录调试,一般不用仿真)最下面附件有一个简单的LED_test工程文件,编译通过的。
大家可以试用。
下面开始介绍的软件工程的建立。
1. 软件总界面总体界面还是比较简洁的,和其他编译软件都是差不多的,而且和KEIL软件的界面是很相似的,使用很方便。
2. 新建工程新建工程很简单:FILE->NEW->Project 然后就看到下面的新建工程界面了,选择第一个GCC C Executable工程就可以,第二个GCC C static Library 是用来新建 .h文件的。
然后下面蓝圈1是C文件的名称,蓝圈2 Solution Name 是工程的文件,中间的Location是文件存放位置,自己选择合适的位置即可。
点击下面的OK3. 下面接着是单片机型号选择界面,选择合适的单片机就可以了。
(整理)单片机液晶屏C程序.
for(i=0;i<2;i++)
{
lcd_wdat(DIS41[i]);
}
}
else
{
PORTB&=~(1<<0);
lcd_pos(4,3);
for(i=0;i<2;i++)
{
lcd_wdat(DIS42[i]);
}
}
////////*******“运行”显示**************************
}
DDRC=0xFF;
PORTD&=~(1<<3);
}
//******************************************************************
void lcd_wcmd(uchar cmd)
{
lcd_busy();
DDRD=0xF8;
PORTD&=~(1<<5);
{
lcd_wcmd(0x30); //基本指令操作
lcd_wcmd(0x30);
delay(1);
lcd_wcmd(0x0c); //显示开,关光标
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
//*****************************************************************
lcd_pos(4,6);
(2)可能造成轻度环境影响的建设项目,编制环境影响报告表,对产生的环境影响进行分析或者专项评价;for(i=0;i<4;i++)
详解RS485通讯程序代码及技术介绍
} } //主函数 void main() { DDRD|=BIT(PD2); //PORTD|=BIT(PD2); USART_Init(); //UART_Puts("\r\n 你发送的字符串是:");//发送字符串 PORTD&=~BIT(PD2); DDRD|=BIT(PD2); while(1) { if(RX_Flag)
{
PORTD|=BIT(PD2);
//UART_Puts();
USART_Send('1');
//USART_Send(RX_Buffer);
RX_Flag=0;
PORTD&=~BIT(PD2);
PORTD|=BIT(PD2);
//UART_Puts();
USART_Send('2');
//USART_Send(RX_Buffer);
HART 网络:HART 是由现在的艾默生提出一个过度性总线标准,他主要是在 4~20 毫安电流信号上面叠加数字信号,物理层采用 BELL202 频移键控技术,以 实现部分智能仪表的功能,但此协议不是一个真正意义上开放的标准,要加入他 的基金会才能拿到协议,加入基金会要一部分的费用。技术主要被国外几家大公 司垄断,近两年国内也有公司再做,但还没有达到国外公司的水平。现在有很大 一部分的智能仪表都带有 HART 圆卡,都具备 HART 通讯功能。但从国内来看还没 有真正利用其这部分功能,最多只是利用手操器对其进行参数设定,没有发挥出 HART 智能仪表应有的功能,没有联网进行设备监控。从长远来看由于 HART 通信 速率低组网困难等原因,HART 仪表的采购量会程下滑趋势,但由于 HART 仪表已 经有十多年的历史现在在装数量非常的大,对于一些系统集成商来说还有很大的 可利用空间。
红外NEC编码及调制解调
遥控器在按键按下后,周期性地发出同一种 32 位二进制码,周期约为 108ms。一组码本身的持续时 间随它包含的二进制“0”和“1”的个数不同而不同,大约在 45~63ms 之间。 当一个键按下超过 36ms, 振荡器使芯片激活, 将发射一组 108ms 的编码脉冲,这 108ms 发射代码由 一个起始码(9ms),一个结果码(4.5ms),低 8 位地址码(9ms~18ms),高 8 位地址码(9ms~18ms),8 位数据码(9ms~18ms)和这 8 位数据的反码(9ms~18ms)组成。如果键按下超过 108ms 仍未松开,接 下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。 3 接收器及解码 一体化红外线接收器是一种集红外线接收和放大于一体,不需要任何外接元件,就能完成从红外线 接收到输出与 TTL 电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线 遥控和红外线数据传输。 红外一开始发送一段 13.5ms 的引导码,引导码由 9ms 的高电平和 4.5ms 的低电平组成,跟着引导 码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由 9ms 的高电平,2.25ms 的低电平,跟着是一个短脉冲,本程序经过试用,能解大部分遥控器的编码! //串口通信程序 //向 pc 串口发送数据 //pc 端使用 超级终端 建立连接 //9600 8 位数据 1 位停止 #include <iom16v.h> #include <macros.h> #include "uart0.h" #define uint unsigned int #define uchar unsigned char uchar irr_b=0,s_s=0; uchar wb=0,a=0,ds=0; long da=0; uchar d1,d2,d3,d4; uchar ten_1,ten_2,ten_3,ten_4,i;
AVR——Mega16制作的电子时钟(仿真图+源程序)
{ fen=0; shi++; if(shi==24)
{ shi=0; } }
}
TCNT1H=0X8f; TCNT1L=0X80; }
绥化学院电子协会 2010 级耿国辉
QQ:835751934
PORTA=0X00; PORTC=0X00; PORTB=0X07; }
/*************定时器初始化*************/ void timer1_init(void)
{ TCCR1B=0X04; //256 分频 TCNT1H=0X8f; TCNT1L=0X80; TIMSK|=BIT(2); //定时器中断使能位 SREG|=BIT(7); //设置总中断 } /*************按键扫描*****************/ void key_scan() {
PORTA=0X00;
PORTA=table[fen/10];
//5
PORTC=tab[3];
delay(1);
PORTA=0X00;
PORTA=0x40;
பைடு நூலகம்
//6
PORTC=tab[2];
delay(1);
PORTA=0X00;
PORTA=table[shi%10];
//7
PORTC=tab[1];
delay(1);
PORTA=0X00;
PORTA=table[shi/10];
//8
PORTC=tab[0];
delay(1);
PORTA=0X00;
} /************主函数*****************/ void main(void) { init(); //初始化 timer1_init(); while(1)
AVR控制矩阵键盘,12864显示简单计算器
delay(1);//延时消抖
if((PINB&0x01)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖
key=0;
write_data(0x30+key);
while((!PINA&0X01));
if(s==1)
{
{h++;}
if(s!=1)
{
w++;}
}
}
// 按键10加法按键
if((PINB&0x04)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x04)==0)//确实有按键按下
#include<de<macros.h>
#define uint unsigned int
#define uchar unsigned char
#define RS_0 (PORTA&=~BIT(7))
#define RS_1 (PORTA|=BIT(7))
delay(1);//延时消抖
// 按键8
if((PINB&0x01)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x01)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖
key=2;
write_data(0x30+key);
while((!PINA&0X04));//等待按键松开
AVR软件,m16系列基础教程
讲座专家:Tensilica公司中国区代表——李冉【高手坐堂】系列之可配置处理器技术入门专家讲座活动进行中……《复杂SOC设计》免费赠送!具体活动地址:/thread-66904-1-1.html【高手坐堂】系列之万人学习51单片机!专家:老练 【老练淘宝店】具体活动地址:/thread-66169-1-1.html【高手坐堂】系列之让我们学学A VR! 专家:老练 【老练淘宝店】具体活动地址:/thread-66668-1-1.htmlA VR讲座:第一讲:AVR软件、工具、m16的基础知识第一步 安装ICCAVR第二步 安装stdio第三步 介绍avr c语言的语法1、一个简单的AVR程序#include <iom16v.h>#include <macros.h>void main(){PORTA = 0x0F; //给PA口赋值,让PA口低四位为1,高四位为0while(1) ;}本程序的作用是把PA口的值设为0x0F。
a、程序中以#号开头的语句#include <iom16v.h> 是包含特定的头文件,叫预处理指令,iom16v表示使用的是mega16,macros.h包含了必须的avr操作命令。
b、C语言的程序是由函数构成的,如上面的那个void main(),前面的void表明函数没有返回值。
每一个c程序里面里有且只有一个main()函数,系统启动后就从main()开始运行。
c、函数内部的内容以大括号“{”和"}"扩起来,每句语句用分号“;”结束,若分号前面没有内容,编译之后也无任何操作语句。
d、C程序中可以加入一些说明文字,单行以双斜扛“//”开始,如果是多行,就用"/*"开始,以“*/”结束,如 /*注释 */ 。
e、函数可以有参数,一律放在小括号内。
f、利用C语言可以轻松的对AVR的设备组件进行操作,如程序中的PORTA = 0x0F;g、任何一个AVR C程序都必须是一个无限循环,否则程序会沿着程序存储区一直运行,直至溢出程序存储区,程序从头运行。
ICCAVR 和AVR Stdio之间的转化
列出ICC AVR 过渡到 AVR STUDIO时要注意的几个问题1.头文件更改ICCAVR使用的是“#include <iom16v.h>”AVR STUDIO更改为“#include <avr/io.h>”在ICC中使用不同MCU的头文件是不同的,在AVR studio中所有MCU的头文件都用“#include <avr/io.h>”2.AVR studio中延时函数可直接使用“#include <util/delay.h>”头文件中的延时函数:void _delay_us (double __us);void _delay_ms(double __ms);两个函数的参数均为double型的,通常使用整数延时即可。
(函数最大延时时间是有限制的,参考“util/delay.h”)3.中断函数写法不同在ICC 中断函数名可以自定义列出ATmega16的向量表:#define IT_RESET 1#define IT_INT0 2#define IT_INT1 3#define IT_TIMER2_COMP 4#define IT_TIMER2_OVF 5#define IT_TIMER1_CAPT 6#define IT_TIMER1_COMPA 7#define IT_TIMER1_COMPB 8#define IT_TIMER1_OVF 9#define IT_TIMER0_OVF 10#define IT_SPI_STC 11#define IT_USART_RXC 12#define IT_USART_UDRE 13#define IT_USART_TXC 14#define IT_ADC 15#define IT_EE_RDY 16#define IT_ANA_COMP 17#define IT_TWI 18#define IT_INT2 19#define IT_TIMER0_COMP 20#define IT_SPM_RDY 21#pragma interrupt_handler user_fuc:Interrupt vector number如:#pragma interrupt_handler Time2:iv_TIMER2_COMPvoid Time2(){}AVR studio中需添加“#include <avr/interrupt.h>”头文件且中断函数名不能自定义如:#include <avr/interrupt.h>ISR(SIG_OVERFLOW0) //定时器/计数器0溢出中断(ICC AVR 过渡到 AVR STUDIO4.一些库函数的不同ICC AVR studionop() asm("nop")WDR() asm("wdr") CLI() cli()SEI() sei()。
led灯明暗变化_单片机源代码
void LEDon()
{
PORTB&=~BIT(0);
}
void on_or_off()
{
int c;
c = num%50;
if (c>=ontime)
{
LEDoff();
}
else
{
LEDon();
}
}
PORTA&=~BIT(PA2); //PA2输出低电平,DU拉低,段选LED流水灯锁存
}
void main()
{
segg();
TCCR1B=0X04;
TCNT1H=0XFF;
TCNT1L=0Xfd;
TIMSK|=BIT(2);
SREG|=BIT(7);
void miao()
{
if(num==100000)
num=0;
num++;
TCNT1H=0XFF;
TCNT1L=0Xfd;
}
void segg()//关数码显示管函数 可以自己设计数码管示显什么数字,新手没有学过数码管模块,本函数请暂时不要看
{
DDRA|=BIT(PA3); //PA3设置为输出状态
DDRA|=BIT(PA4); //PA4设置为输出状态
DDRB=0xff; //PB口设置为输出状态
PORTB=0xff; //发送模码
PORTA|=BIT(PA3); //PA3输出高电平,DU拉高
PORTA&=~BIT(PA3); //PA3输出低电平,DU拉低,段选锁存
uint ontime;
void up_down()
AVR笔记:外部中断
A VR学习笔记之【外部中断】【一】Mega16共有三个外部中断,外部中断相比定时器而言它的寄存器比较少,因此相对比较简单。
我们现在只关心需要用的部分,其他的暂且放弃不管。
和外部中断相关的特殊功能寄存器有:①MCU控制寄存器(MCUCR)在上面八位的寄存器中,白色的部分使我们要关心的,灰色部分就不用管了。
资料上对后面四位(第四位)的作用有介绍。
ISC11与ISC10控制中断1的触发方式。
下表为ISC10/11的值对应触发方式:SC11与ISC10控制中断0的触发方式。
下表为ISC00/01的值对应触发方式:我们在使用外部中断0和1的时候,其触发方式的设置便是通过以上ISC的不同值实现的。
至于INT2下面有介绍。
②MCU控制与状态寄存器(MCUCSR)这个寄存器只有一个BIT与外部中断相关。
ISC2,我们通过和INT0/1的对比可以发现ISC的后缀数字命名只有规律的,这会方便我们记忆。
同时在说明文档上说了很长一段关于ISC2的说明:他的意思说早了,他也就是想说:ISC=0的话INT2是下降沿出发中断,ISC=1是上升沿出发。
这才是应该说明的最重要的点。
他后面还说了:(1)如果你让ISC=0那么外部的低电平必须保持到当前正在运行的指令运行结束才会出发,换一句意思就是,如果外部时间过短,有可能导致INT2不被触发。
(2)他又说明,如果改变ISC2的值的话有可能触发中断,导致误判,因此如果你想改变其中断触发方式的话,首先把通用中断控制寄存器(GICR)里面控制INT2的中断开关关了,这样便不会触发中断了。
③通用中断控制寄存器(GICR)他就是个中断开关。
前面三位依次赋值便会打开响应中断。
当然总中断开关也要打开才行(SREG|=BIT(7))。
④通用中断标志寄存器(GIFR)他就是一个中断标志,我们也就是说在中断发生的时候中断对用的标志会变为1,此时程序会自动转到中断程序子函数。
然后有硬件自动清零,以等待下一次的中断发生。
AtmelStudio-6.0简易入门教程(精炼实用)
一、建议工程文件AtmelStudi6.0这个全新的环境使用起来极其不顺手,因为首先我对AtmelStudio以前的版本也根本没有使用经验,就根据很陌生,其次,这个新版本软件还根本没有人用,根本没有任何的相关教程资料,唯一可以参考的只是官网的比较简单的视频教程,还是英文讲解,反正没怎么搞透。
不过还是硬着头皮用下去,因为软件是免费的,而且当后来我知道代码编辑环境其实就是微软VS环境的时候,我就更不犹豫了,大家应该都了解VS的代码编写环境是很智能的,尤其自动补全功能。
现在,我已经能很熟练的使用AtmelStudio6.0软件了,随着使用我也更加喜欢玩AVR单片机做一些小作品了,而不再用普通51和STC了。
当使用熟练以后也就感觉到其实这个免费智能的编译环境其实是很简单的,那现在我就帮助更多喜欢使用AVR而没用使用AtmelStudio软件的同学们轻松越过这一个门槛,进入一个美好的编程世界。
该软件的不足之处:一是软件相对较大,打开比较慢,但是运行还是比较顺利的;二是不支持山寨仿真器,这可苦了没钱的劳苦电工们了。
(不过我都是用ISP烧录调试,一般不用仿真)最下面附件有一个简单的LED_test工程文件,编译通过的。
大家可以试用。
下面开始介绍的软件工程的建立。
1. 软件总界面总体界面还是比较简洁的,和其他编译软件都是差不多的,而且和KEIL软件的界面是很相似的,使用很方便。
2. 新建工程新建工程很简单:FILE->NEW->Project 然后就看到下面的新建工程界面了,选择第一个GCC C Executable工程就可以,第二个GCC C static Library 是用来新建 .h文件的。
然后下面蓝圈1是C文件的名称,蓝圈2 Solution Name 是工程的文件,中间的Location是文件存放位置,自己选择合适的位置即可。
点击下面的OK3. 下面接着是单片机型号选择界面,选择合适的单片机就可以了。
遥控小车说明书
遥控小车设计说明书作品内容简介本概要设计说明书是针对电子设计的课程要求而编写。
目的是对该项目进行总体设计,在明确系统需求的基础上划分系统的功能模块,进行系统开发的分工,明确各模块的接口,为进行后面的详细设计和实现做准备。
满足无线遥控爱好者对智能小车的设计要求,想通过这份概要设计给爱好者一个好的设计思路,设计方法进行参考。
本课题设计的遥控玩具车主要有三大模块组成:无线发射模块、无线接收模块和驱动模块。
我们的设计以mega16芯片为核心,无线遥控发射/接收模块为315模块,驱动芯片为L298N 。
驱动电动机正反转的电路连接无线遥控接收电路构成一个驱动模块驱动电动机的前进、后退、左转和右转和各种微调控制。
经过实践证明,我们的设计可以很好的实现题目给出的要求,并且在其要求上我们又进一步进行了完善,是设计具有更好的实用和参考价值。
关键字:mega16芯片, L298N 芯片, 315无线发射/接收模块, PT2262,PT22721、研制背景及意义面向所有无线遥控爱好者,对智能小车感兴趣,想借此提高动手能力的用户。
随着电子技术、计算机技术和制造技术的飞速发展,数码相机、DVD 、洗衣机、汽车等消费产品越来越呈现光电机一体化、智能化、小型化等趋势。
各种智能化小车在市场玩具中也占一个很大的比例。
因此,遥控加职能的技术研究、应用都是非常有意义而且有很高的市场价值的。
只能小车,也称轮式机器人,是一种以汽车电子为背景,涵盖控制、模式识别、传感技术、电子、计算机、机械等多学科的科技创新性设计,一般主要由路径识别、速度采集、角度控制及车速控制等模块组成。
本次课题准备设计一种单片机电路实现小车具有前行、左转向、右转向、后退四个功能的只能小车。
2、设计方案图1-13、工作原理与性能分析(1)315发送接收模块模块315发送接收模块性能:工作频率:315MHz/433MHz。
调制方式: 调幅方式发射。
发射距离: 50-120 米(根据工作电压而定)。
用PC端口控制红灯亮灭,用PD端口控制绿灯亮灭,设置17种不同的闪亮模式。
实训课报告系统要求:用PC端口控制红灯亮灭,用PD端口控制绿灯亮灭,设置17种不同的闪亮模式。
软件设计:默认内部1M晶振#include<iom16v.h>#define uchar unsigned char i;unsigned char disp[]={0x00,0xFF,0x0F,0xF0,0x33,0xCC,0x11,0xEE,0xAA,0x55,0x77,0xFF,0xDD,0xBB,0 x01,0x03,0x07};unsigned char disk[]={0xFF,0x00,0x0F,0xF0,0x33,0xCC,0x11,0xEE,0xAA,0x55,0x77,0xFF,0xDD,0xBB,0 x01,0x03,0x07};void delay_ms(unsigned int i){unsigned int a;unsigned char b;for (a = 0; a < i; a++){for (b = 1; b; b++){;}}}/****************************************************************************** 主函数****************************************************************************/ void main(void){uchar;DDRC=0xFF;PORTC=0xFF;DDRD=0xFF;PORTD=0xFF;while (1){for (i = 0; i < 17; i ++){ /*从左到右*/PORTC=disp[i]; /*某一位置低*/PORTD=disk[i];delay_ms(200); /*延时*/} } }硬件设计:C0C1C2C3C4C5C6C7D0D1D2D3D4D5D6D8C 1C 2C 3C 4C 5C 6C 7D 0D 1D 2D 3D 4D 5D 6D 7C 0PB0/T0/XCK 1PB1/T12PB2/AIN0/INT23PB3/AIN1/OC04PB4/SS 5PB5/MOSI 6PB6/MISO 7PB7/SCK 8RESET 9XTAL212XTAL113PD0/RXD 14PD1/TXD 15PD2/INT016PD3/INT117PD4/OC1B 18PD5/OC1A 19PD6/ICP120PD7/OC221PC0/SCL 22PC1/SDA 23PC2/TCK 24PC3/TMS 25PC4/TDO 26PC5/TDI 27PC6/TOSC128PC7/TOSC229PA7/ADC733PA6/ADC634PA5/ADC535PA4/ADC436PA3/ADC337PA2/ADC238PA1/ADC139PA0/ADC040AREF 32AVCC30U1ATMEGA16R1200kR2200kR3200kR4200kR5200kR6200kR7200kR8200kR9200kR10200kR11200kR12200kR13200kR14200kR15200kR16200kD1LED-BIRG D2LED-BIRG D3LED-BIRG D4LED-BIRG D5LED-BIRG D6LED-BIRG D7LED-BIRG D8LED-BIRGD9LED-BIRG D10LED-BIRG D11LED-BIRG D12LED-BIRG D13LED-BIRG D14LED-BIRG D15LED-BIRG D16LED-BIRG思考:如何用一个数组控制红绿灯?#include<iom16v.h>#define uchar unsigned char i; unsigned char disp[]={0x00,0xFF,0x0F,0xF0,0x33,0xCC,0x11,0xEE,0xAA,0x55,0x77,0xFF,0xDD,0xBB,0x01,0x03,0x07,0xFF,0x00,0x0F,0xF0,0x33,0xCC,0x11,0xEE,0xAA,0x55,0x77,0xFF,0xDD,0xBB,0x01,0x03,0x07};void delay_ms(unsigned int i) {unsigned int a; unsigned char b;for (a = 0; a < i; a++) {for (b = 1; b; b++) { ; } }}/****************************************************************************** 主函数****************************************************************************/ void main(void){uchar;DDRC=0xFF;PORTC=0xFF;DDRD=0xFF;PORTD=0xFF;while (1){for (i = 0; i < 17; i ++){ /*从左到右*/PORTC=disp[i]; /*某一位置低*/PORTD=disp[i+17];delay_ms(200); /*延时*/}。
LCD液晶显示程序
//功能:LCD液晶显示程序,采纳8位数据接口#include <iom16v.h>#include <macros.h> //库函数头文件,代码中引用了_nop()函数// 概念操纵信号端口#define E 2#define RW 1#define RS 0//sbit RS=0xB0; //P3.0 sbit RS=P3^0;//sbit RW=0xB1; //P3.1//sbit E= 0xB2; //P3.2// 声明挪用函数void lcd_w_cmd(unsigned char com); //写命令字函数void lcd_w_dat(unsigned char dat); //写数据函数unsigned char lcd_r_start(); //读状态函数void int1(); //LCD初始化函数void delay(unsigned char t); //可控延时函数void delay1(); //软件实现延时函数,5个机械周期void gong(void);void main() //主函数{unsigned char lcd[]="yin hai chang";unsigned char i;PORTC=0xff; // 送全1到P0口DDRC=0xff;PORTB=0xff; // 送全1到P0口DDRB=0xff;int1(); // 初始化LCDdelay(255);lcd_w_cmd(0x80); // 设置显示位置delay(255);for(i=0;i<13;i++) // 显示字符串{lcd_w_dat(lcd[i]);delay(200);}gong();lcd_w_cmd(0x8f);lcd_w_dat(0x00);while(1); // 原地踏步}//函数名:delay//函数功能:采纳软件实现可控延时//形式参数:延不时刻操纵参数存入变量t中//返回值:无void delay(unsigned char t){unsigned char j,i;for(i=0;i<t;i++)for(j=0;j<50;j++);}//函数名:delay1//函数功能:采纳软件实现延时,5个机械周期//形式参数:无//返回值:无void delay1(){_NOP();_NOP();_NOP();}//函数名:int1//函数功能:lcd初始化//形式参数:无//返回值:无void int1(){lcd_w_cmd(0x3c); // 设置工作方式lcd_w_cmd(0x0f); // 设置光标lcd_w_cmd(0x01); // 清屏lcd_w_cmd(0x06); // 设置输入方式lcd_w_cmd(0x80); // 设置初始显示位置}//函数名:lcd_r_start//函数功能:读状态字//形式参数:无//返回值:返回状态字,最高位D7=0,LCD操纵器空闲;D7=1,LCD操纵器忙unsigned char lcd_r_start(){unsigned char s;PORTB=PINB|(1<<RW); //RW=1; //RW=1,RS=0,读LCD状态delay1();PORTB=PINB&(~(1<<RS)); //RS=0;delay1();PORTB=PINB|(1<<E); //E=1; //E端时序delay1();s=PINC; //从LCD的数据口读状态delay1();PORTB=PINB&(~(1<<E));//E=0;delay1();// RW=0;delay1();return(s); //返回读取的LCD状态字}//函数名:lcd_w_cmd//函数功能:写命令字//形式参数:命令字已存入com单元中//返回值:无void lcd_w_cmd(unsigned char com){unsigned char i;do { // 查LCD忙操作i=lcd_r_start(); // 挪用读状态字函数i=i&0x80; // 与操作屏蔽掉低7位delay(2);} while(i!=0); // LCD忙,继续查询,不然退出循环PORTB=PINB&(~(1<<RW));//RW=0;delay1();PORTB=PINB&(~(1<<RS));//RS=0; // RW=0,RS=0,写LCD命令字delay1();PORTB=PINB|(1<<E); //E=1; //E端时序delay1();PORTC=com; //将com中的命令字写入LCD数据口delay1();PORTB=PINB&(~(1<<E));//E=0;delay1();// RW=1;delay(255);}//函数名:lcd_w_dat//函数功能:写数据//形式参数:数据已存入dat单元中//返回值:无void lcd_w_dat(unsigned char dat){unsigned char i;do { // 查忙操作i=lcd_r_start(); // 挪用读状态字函数i=i&0x80; // 与操作屏蔽掉低7位delay(2);} while(i!=0); // LCD忙,继续查询,不然退出循环PORTB=PINB&(~(1<<RW)); //RW=0;delay1();PORTB=PINB|(1<<RS); //RS=1; // RW=1,RS=0,写数据delay1();PORTB=PINB|(1<<E); //E=1; // E端时序delay1();PORTC=dat; // 将dat中的显示数据写入LCD数据口delay1();PORTB=PINB&(~(1<<E)); //E=0;delay1();// RW=1;delay(255);}void gong(void){lcd_w_cmd(0x40);lcd_w_dat(0x1f);lcd_w_cmd(0x41);lcd_w_dat(0x1f);lcd_w_cmd(0x42);lcd_w_dat(0x04); lcd_w_cmd(0x43); lcd_w_dat(0x04); lcd_w_cmd(0x44); lcd_w_dat(0x04); lcd_w_cmd(0x45); lcd_w_dat(0x1f); lcd_w_cmd(0x46); lcd_w_dat(0x1f); lcd_w_cmd(0x47); lcd_w_dat(0x00); }。
ADC数据采集显示实验
工程基础实验与训练中心实验报告
那么仅需读取 ADCH 就足够了。否 则必须先读出 ADCL 再读 ADCH ,其中 MUX4~0: 模拟通道与增益选择位。 (3)ADC 控制和状态寄存器 A - ADCSRA:其中 ADEN: ADC 使 能位;ADSC: ADC 转换启动位;ADATE: ADC 自动触发使能位;ADIF: ADC 中断标志;ADIE: ADC 中断使能; ADPS2~0: ADC 预分频器 选择位。 (4)特殊功能 IO 寄存器 - SFIOR:其中 ADTS2~0: ADC 自动触 发源;Res: 保留位。
如下图,使用软件 PROTEUS 画出原理图。 因为在实际中没有 AVR 的开发板,所以使用软件来模型出,来 显示。 当然也要了解这个软件的使用方法。 因此,在下面的图形中能够显示出 ADC 的数据采集与显示,所 以如下图:
4
工程基础实验与训练中心实验报告
三、程序流程图 开始
1602初始化
检测是否
实验原理及主要工作: 一、实验原理
ATmega16 内部的 ADC 拥有很多的特点,更具这些特点可以知 道本次实验的有些内容的要求。本次试验是数据采集和显示,用 ADC 转换器来进行数据的采集,并在 1602 的液晶显示屏上显示出数据采 集的结果。
要做本次实验还需了解 ATmega16 内部的 ADC 的寄存器,ADC 有以下几个寄存器: (1)多路复用器选择寄存器 - ADMUX :其中 REFS1/REFS0: 参考电压源选择设置;ADLAR: ADC 转换结果 对齐选择位。 (2)ADC 数据寄存器 - ADCL 及 ADCH:读取 ADCL 之后, ADC 数据寄存器一直要等到 ADCH 也被读出才可以进行数据更 新。因此,如果转换结果为左对齐,且要求的精度不高于 8 比特,
mega16程序典例
}
}
void delay_nms(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
delay_1ms();
}
/************************循迹程序*********************************************/
void white(void);//盲区循迹辅助函数
void led(char);//一般循迹程序,输入行走格数
void led1(char);//一般循迹程序,输入行走格数
void led2(char);//后退循迹,输入行走格数
void turnleft(void);//左转
void turnright(void);//右转
case 0X02:PORTA=0X11;break;
case 0X0C:PORTA=0X24;break;//右偏
case 0X08:PORTA=0X24;break;
case 0X04:PORTA=0X24;break;
}
}
else if(key>=0X20)
{
PORTA=0X30;
delay_nms(10);
PORTA&=~BIT(PA0);
ADMUX=0X27;//使用外部参考电压,右对齐,ADC0选择7通道
ADCSR=0X80;//控制寄存器,adc使能,取消中断,2分频
ADCSR|=BIT(6);// ADCR代表数字6,启动ADE
while(!(ADCSR&(BIT(4))));//ADIF对应4,将第四位置位,其余为0
16位pwm
//两个值向不同方向变化 //PWMA 宽度减小,PWMB 宽度增加 //上下限
参考链接:/news/2010-05/2133.htm
Байду номын сангаас
* *
//两路 PWM,匹配清零 //快速 PWM 模式,位数可调,预分频 1 //计数上限值,此数为 16 位 PWM
void init_devices(void) { port_init(); //端口初始化 timer1_init(); //TC1 初始化 MCUCR = 0x00; GICR = 0x00; } //主函数 void main(void) { unsigned int a=32768,b=32768; init_devices(); //器件初始化 OCR1A=a; OCR1B=b; while(1) { a-=10; b+=10; if(a<=20) { a=65530; b=5; } OCR1A=a; OCR1B=b; delay_ms(20); } } //匹配初值
pd4输出pwmbpd5输出pwma产生的pwm频率为8m65536约122hzincludeiom16vhincludemacrosh延时函数
********************************************/ * 工作频率:内部 8M * * 编 译 器:ICCAVR 6.31A * * 输 出:PD4 输出 PWMB,PD5 输出 PWMA * 产生的 PWM 频率为 8M/65536 约 122HZ ********************************************/ #include <iom16v.h> #include <macros.h> //延时函数:入口 time 需延时的 MS 数 void delay_ms(unsigned int time) { unsigned char c; for(;time;time--) { for(c=220;c;c--) { ; } } } //端口初始化 void port_init(void) { PORTA = 0xFF; DDRA = 0x00; PORTB = 0xFF; DDRB = 0xFF; PORTC = 0x00; DDRC = 0x00; PORTD = 0x00; DDRD = 0x30; } //TC1 初始化 void timer1_init(void) { TCCR1A = 0xA2; TCCR1B = 0x19; ICR1 = 0xFFFF; } //器件初始化
AVR的常用中断编程
实在没有财富了,才拿自己写的东西出来献丑。
平时自己并不常用A VR,所以没有写得很完全,这个是做参考用,如果您接纳了我这种写法,可以自己写完所有的东西自己建立一个固件库。
包含了三个文件,分别是interrupt.c、interruptt.h和MacroAndConst.h,如果有疑问或者见解可以发邮件给我,我的邮箱:349705262@。
现在粘贴如下:/*interrupt.h里面的内容*/#ifndef _INTERRUPT_H_#define _INTERRUPT_H_#include<iom16v.h>#include<macros.h>#include"MacroAndConst.h"#include"interrupt.h"extern void INT(uchar int_num,uchar sense_ctrl);/*函数名:exteral_int()(外部中断控制函数)参数:int_num(外部中断数),sense_ctrl(触发方式)外部中断的数int_num的取值为0和1,为0时是外部中断0,为1时是外部中断1sense_ctrl的取值如下:0:为低电平产生中断1:任意逻辑电平变化都产生中断2:下降沿产生中断3:上升沿产生中断功能:设置外部中断并使能外部中断函数编写流程:1、写MCU控制寄存器MCUCR,选择是外部中断0还是1,并且选择触发方式;2、写MCU控制与状态寄存器MCUCSR,选择使能外部中断。
调用例子:main(){INT(0,2);//设置外部中断0,下降沿触发中断SREG=0x80;//打开总中断while(1){}}#pragma interrupt_handler int0:2void int0()//外部中断0响应函数{//写执行语句}-----------------------------------------------------------------------------------*/extern void TCNT0_8bit(uchar timer_counter,uchar clock_select);/*函数名:TCNT0_8bit()(设置8位定时计数器为定时器)参数:timer_counter(定时计数器寄存器初始值),clock_select(时钟分频选择) clock_select可取一下值:0:无时钟,T/C 不工作1:1 分频( 没有预分频)2:8 分频( 来自预分频器)3:64 分频( 来自预分频器)4:256 分频( 来自预分频器)5:1024分频( 来自预分频器)6:时钟由T0 引脚输入,下降沿触发7:时钟由T0 引脚输入,上升沿触发功能:设置8位定时计数器并使能定时计数器函数编写流程:1、重置T/C控制寄存器,WGM0和WGM1为0,普通模式2、选择时钟源3、赋8位定时计数器初值4、溢出中断使能调用例子:void main(){TCNT0(142,5);//选择1024分频,初值为142SREG|=0x80;//打开总中断while(1){}}#pragma interrupt_handler int0:10void tcnt0(){TCNT0=142;//重新赋值//写需要执行的语句}-----------------------------------------------------------------------------------*/extern void TCNT1_16bit(uint tcnt1_val,uchar clock_select);/*函数名:TCNT1_16bit()(设置16为定时计数器为定时器)参数:tcnt1_val(TCNT1初始值),clock_select(时钟分频选择)clock_select可取一下值:0:无时钟,T/C 不工作1:1 分频( 没有预分频)2:8 分频( 来自预分频器)3:64 分频( 来自预分频器)4:256 分频( 来自预分频器)5:1024分频( 来自预分频器)6:时钟由T0 引脚输入,下降沿触发7:时钟由T0 引脚输入,上升沿触发功能:设置16位定时计数器并使能相应溢出中断函数编写流程:1、设置TCCR1A、TCCR1B寄存器2、选择时钟分频3、赋初始16位定时计数器值4、溢出中断使能调用例子:#pragma interrupt_handler tcnt0:9void main(){TCNT1_16bit(57722,5);SREG|=0x80;while(1){}}void tcnt0(){TCNT1=57722;//写相应语句}-----------------------------------------------------------------------------------*/extern void Input_Capture(void);/*------------------------------------------------------------------------------------------------*/extern void FAST_PWM_16bit(uchar clock_select,uint ICR1_val,uint OCR1A_val,uint OCR1B_val);/*函数名:FAST_PWM_16bit()(设置16位定时计数器的快速PWM功能)参数:clock_select(时钟分频选择),ICR1_val(ICR1寄存器的值),OCR1A_val(OCR1A寄存器的值),0CR1B_val(OCR1B寄存器的值)clock_select可取一下值:0:无时钟,T/C 不工作1:1 分频( 没有预分频)2:8 分频( 来自预分频器)3:64 分频( 来自预分频器)4:256 分频( 来自预分频器)5:1024分频( 来自预分频器)6:时钟由T0 引脚输入,下降沿触发7:时钟由T0 引脚输入,上升沿触发功能:设置16位定时计数器的快速PWM功能,快速PWM模式恒为14模式,此模式下TOP值恒设为ICR1寄存器中的值函数编写流程:1、设置PD4、PD5为输出2、设置TCCR1A、TCCR1B寄存器3、选择时钟分频4、赋值ICR1,OCR1A,OCR1B备注:PWM的频率可以计算如下:PWM频率=时钟频率/(分频数*(1+ICR1_val))PWM的占空比可计算如下:PWM占空比=OCR1A_val/ICR1 (PD5引脚输出)PWM占空比=OCR1B_val/ICR1 (PD4引脚输出)调用例子:void main(){FAST_PWM_16bit(3,1249,625,625);while(1){}}-----------------------------------------------------------------------------------*/#endif/*interrupt.c里面的内容*/#include"interrupt.h"void INT(uchar int_num,uchar sense_ctrl)//外部中断设置函数{switch(int_num){case 0: MCUCR|=sense_ctrl;//控制产生中断方式GICR|=0x40;//使能外部中断0break;case 1: MCUCR=MCUCR|(sense_ctrl*0x04);GICR|=0x80;break;case 2: MCUCSR=MCUCR||(sense_ctrl<<7);GICR=0x20;break;default:break;}}void TCNT0_8bit(uchar time_counter,uchar clock_select){TCCR0=0;//重置T/C控制寄存器,WGM0和WGM1为0,普通模式TCCR0|=clock_select;//选择时钟源TCNT0=time_counter;//初始化T/C寄存器TIMSK|=(1<<TOIE0);//溢出中断使能}void TCNT1_16bit(uint tcnt1_val,uchar clock_select){TCCR1A=0;//重置TCCR1ATCCR1B=0;//重置TCCR1B//普通模式TCCR1B|=clock_select;//选择时钟源TCNT1=tcnt1_val;//定时计数器初始化TIMSK|=(1<<TOIE1);//使能溢出中断}void Input_Capture(){TCCR1A=0;TCCR1B=0xc4;//使用输入噪声抑制器,输入捕捉为上升沿触发,时钟256分频TIMSK|=(1<<TICIE1);//输入捕捉中断使能TIMSK|=(1<<TOIE1);//T/C1溢出中断使能}void FAST_PWM_16bit(uchar clock_select,uint ICR1_val,uint OCR1A_val,uint OCR1B_val) {DDRD|=0x30;TCCR1A|=0XA2;//设置为快速PWM15模式,PD4、PD5口在匹配时输出电平翻转clock_select|=0x18;TCCR1B|=clock_select;ICR1=ICR1_val;OCR1A=OCR1A_val;OCR1B=OCR1B_val;}/*MacroAndConst.h里面的内容*/ #ifndef _MACRO_AND_CONST_H_ #define _MACRO_AND_CONST_H_typedef unsigned int uint;typedef unsigned char uchar; #endif。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*/
/* 2 wire serial interface */
#define TWBR (*(volatile unsigned char *)0x20)
#define TWSR (*(volatile unsigned char *)0x21)
#define ADCSR (*(volatile unsigned char *)0x26)
#define ADCSRA (*(volatile unsigned char *)0x26)
#define ADEN 7
#define ADSC 6
#define ADATE 5
#define DORD 5
#define MSTR 4
#define CPOL 3
#define CPHA 2
#define SPR1 1
#define SPR0 0
#define SPSR (*(volatile unsigned char *)0x2E)
#define CS21 1
#define CS20 0
/* Timer/Counter 1 */
#define ICR1 (*(volatile unsigned int *)0x46)
#define ICR1L (*(volatile unsigned char *)0x46)
#define WDTOE 4
#define WDE 3
#define WDP2 2
#define WDP1 1
#define WDP0 0
/* Timer/Counter 2 */
#define ASSR (*(volatile unsigned char *)0x42)
#define DDRD (*(volatile unsigned char *)0x31)
#define PORTD (*(volatile unsigned char *)0x32)
/* Port C */
#define PINC (*(volatile unsigned char *)0x33)
#define TXEN 3
#define UCSZ2 2
#define RXB8 1
#define TXB8 0
#define UCSRA (*(volatile unsigned char *)0x2B)
#define RXC 7
#define TXC 6
#define UCSRC (*(volatile unsigned char *)0x40)
#define URSEL 7
#define UMSEL 6
#define UPM1 5
#define UPM0 4
#define USBS 3
#define UCSZ1 2
#define ADFR 5 /*This definition was in old datasheet*/
#define ADIF 4
#define ADIE 3
#define ADPS2 2
#define ADPS1 1
#define ADPS0 0
#define AS2 3
#define TCN2UB 2
#define OCR2UB 1
#define TCR2UB 0
#define OCR2 (*(volatile unsigned char *)0x43)
#define TCNT2 (*(volatile unsigned char *)0x44)
#define UDRE 5
#define FE 4
#define DOR 3
#define OVR 3 /*This definition differs from the databook*/
#define PE 2
#define U2X 1
#define ICR1H (*(volatile unsigned char *)0x47)
#define OCR1B (*(volatile unsigned int *)0x48)
#define OCR1BL (*(volatile unsigned char *)0x48)
#define OCR1BH (*(volatile unsigned char *)0x49)
#define MUX1 1
#define MUX0 0
/* Analog Comparator */
#define ACSR (*(volatile unsigned char *)0x28)
#define ACD 7
#define ACBG 6
#define DDRB (*(volatile unsigned char *)0x37)
#define PORTB (*(volatile unsigned char *)0x38)
/* Port A */
#define PINA (*(volatile unsigned char *)0x39)
#define EERIE 3
#define EEMWE 2
#define EEWE 1
#define EERE 0
#define EEDR (*(volatile unsigned char *)0x3D)
#define EEAR (*(volatile unsigned int *)0x3E)
#define ADMUX (*(volatile unsigned char *)0x27)
#define REFS1 7
#define REFS0 6
#define ADLAR 5
#define MUX4 4
#define MUX3 3
#define MUX2 2
#define TWWC 3
#define TWEN 2
#define TWIE 0
#define TWAR (*(volatile unsigned char *)0x22)
#define TWGCE 0
#define TWDR (*(volatile unsigned char *)0x23)
#define TWPS1 1
#define TWPS0 0
#define TWCR (*(volatile unsigned char *)0x56)
#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define DDRA (*(volatile unsigned char *)0x3A)
#define PORTA (*(volatile unsigned char ห้องสมุดไป่ตู้)0x3B)
/* EEPROM */
#define EECR (*(volatile unsigned char *)0x3C)
/* ADC */
#define ADC (*(volatile unsigned int *)0x24)
#define ADCL (*(volatile unsigned char *)0x24)
#define ADCH (*(volatile unsigned char *)0x25)
#define ACO 5
#define ACI 4
#define ACIE 3
#define ACIC 2
#define ACIS1 1
#define ACIS0 0
/* USART */
#define UBRRHI (*(volatile unsigned char *)0x40)
#define TCCR2 (*(volatile unsigned char *)0x45)
#define FOC2 7
#define WGM20 6
#define COM21 5
#define COM20 4
#define WGM21 3
#define CS22 2
#ifndef __iom16v_h
#define __iom16v_h
/* ATmega16 header file for
* ImageCraft ICCAVR compiler
*/
/* last changed 2004/12/19
2008/07/03 checked for new chip M16A
#define MPCM 0
#define UDR (*(volatile unsigned char *)0x2C)
/* SPI */
#define SPCR (*(volatile unsigned char *)0x2D)
#define SPIE 7
#define SPE 6
#define SPIF 7
#define WCOL 6
#define SPI2X 0
#define SPDR (*(volatile unsigned char *)0x2F)
/* Port D */
#define PIND (*(volatile unsigned char *)0x30)
#define DDRC (*(volatile unsigned char *)0x34)
#define PORTC (*(volatile unsigned char *)0x35)