ATMEGA16单片机班培训实例
- 格式:doc
- 大小:500.00 KB
- 文档页数:24
——————————————————————————第十四课ATmega16L的定时/计数器学习本教程节选自周兴华老师《手把手教你学AVR单片机C程序设计》教程,如需转载,请注明出处!读者可通过当当网、淘宝网等网站购买本教程,如需购买配书实验器材,可登陆周兴华单片机培训中心网购部自助购买!ATmega16L有两个8位定时/计数器(T/C0、T/C2)和一个16位定时/计数器(T/C1)。
每一个计数器都支持PWM(脉冲宽度调制)输出功能。
PWM输出在电机控制、开关电源、信号发生等领域有着广泛的应用。
ATmega16L的定时/计数器时钟是可以选择的。
它的时钟部分包括预分频器和一个多路选择器。
预分频器可被认为是单片机开发中一个有多级输出的分频器。
ATmegal6L用一个10位的计数器把输入时钟分为4种可选择的分频输出。
多路选择器可设置使用某一个分频输出,或者不使用分频输出和使用外部引脚输人时钟。
图9-1为预分频器的基本结构。
——————————————————————————图9-1 预分频器的基本结构9.2 ATmega16L定时/计数器的时钟选择1.使用系统时钟这种情况下使用系统时钟作为预分频器的输入,不过系统时钟的频率一般比较高,所以一般只能实现比较短的定时。
预分频比可通过设置TCCRx的CSx2、CSxl和CSx0来选定。
表9-1给出一个预分频设置值和分频比关系。
TCCRx同步计数器0和1Pck=CK 同步/异步计数器2 Pck=f(AS2)210CSx2CSx1CSx0Tck0,Tck1Tck2000Pck(系统时钟)Pck(系统时钟/异步时钟)001Pck/8Pck/8010Pck/64Pck/32011Pck/256Pck/64100Pck/1024Pck/128101引脚Tx下降沿Pck/256110引脚Tx上升沿Pck/512111Pck Pck/1024表9-1 预分频设置值和分频比关系2.使用异步时钟ATmegal6L的T/C2可以使用外部的异步时钟作为时钟源,这时可以在单片机的TOSC1和TOSC2——————————————————————————两个引脚之间接一个石英晶体或者陶瓷振荡器,和内部的振荡器连接起来。
A VR单片机(ATmega16)培训宗旨:引导为主培养编程思维时间分配(一学期):三分之一时间讲解;三分之二时间动手实验。
具体时间:星期六晚上6:00~9:00内容形式:1、软、硬件知识(一)讲解2、实验经验3、常用程序(思维)分析1、专业讲座(请资深讲师)(二)讲座2、课外讲座(如书记等)3、电影(专业性强的短片)(李世维讲座)1、硬件测试与软件使用(三)实验内容2、汇编语言编程3、A VR单片机内部资源的使用建议方法:先由指导老师讲解实验内容的原理、特点、应用、实践应用中的经验以及编程思维的分析,再由会员自己理解、自己验证、运用原理设计应用、调试程序。
在会员动手的过程中,由摇篮的部长(三名)从旁指导。
实验一软件和硬件的认识一、实验目的:1、掌握硬件原理。
2、初步掌握实验板的使用方法。
3、熟悉软件工作界面。
二、实验仪器:ATmage16实验板一块PC机一台三、实验内容及步骤:1、插上电源,按下开关。
观察批示灯是否点亮。
电源(可输入7~12V)ATmega16管脚图2、由原理可知I/O口的批示灯为低电平亮,在实验板上取地与I/O口相接,观察是否点亮。
I/O口LED显示与接口3、打开编程界面,点击各栏,认识各栏的用途。
A VRICC IDE 软件的工作界面4、输入以下程序:#include <iom16v.h>int main(void){DDRA = 0xff; /* all outputs */DDRB = 0xff; /* all outputs */DDRC = 0xff; /*all outputs */DDRD = 0xff; /*all outputs */PORTA = 0x00; /* 输出低电平*/PORTB = 0x00; /* 输出低电平*/PORTC = 0x00; /* 输出低电平*/PORTD = 0x00; /* 输出低电平*/while(1);}观察I/O口的灯是否被点亮。
atmega16单片机c语言程序设计经典实例中括号在C语言中用于表示数组、结构体、联合体和枚举类型等的定义和使用。
在ATmega16单片机的C语言程序设计中,我们经常会用到数组和结构体,因此本文将以中括号为主题,详细介绍ATmega16单片机上C语言程序设计的经典实例,包括数组的定义和使用、结构体的定义和使用、联合体的定义和使用以及枚举类型的定义和使用。
一、数组的定义和使用数组是一种用于存储一组相同类型的数据项的集合。
在ATmega16单片机上,我们可以使用数组来存储和操作多个引脚的状态、多个传感器的数据等。
1. 数组的定义在C语言中,可以使用方括号来定义一个数组。
下面是一个例子,定义了一个长度为5的整型数组:int array[5];其中,int表示数组的元素类型,array为数组名,[5]表示数组的长度。
2. 数组的初始化数组可以在定义的同时进行初始化。
例如,可以使用大括号将数组的元素初始化为指定的值。
下面是一个例子,将数组的元素初始化为1、2、3、4、5:int array[5] = {1, 2, 3, 4, 5};3. 数组的访问可以使用下标(在中括号内)来访问数组的元素。
数组的下标从0开始,最大值为数组长度减1。
下面是一个例子,访问数组的第一个元素和最后一个元素:int firstElement = array[0];int lastElement = array[4];可以使用循环结构来遍历数组的所有元素:for (int i = 0; i < 5; i++) {访问数组的第i个元素int element = array[i];其他操作}二、结构体的定义和使用结构体是一种可以存储不同类型数据项的数据结构。
在ATmega16单片机上,结构体可以用于存储和操作多个相关的数据项,比如传感器的位置和数值等。
1. 结构体的定义在C语言中,可以使用关键字struct来定义结构体。
下面是一个例子,定义了一个包含姓名和年龄的结构体:struct Person {char name[20];int age;};其中,Person为结构体名,name和age为结构体的成员。
Atmega16寄存器Atmega16寄存器一.引脚说明表1 引脚说明引脚序号 引脚名称 引脚功能PB5 8 位双向I/O 口, 具有可编程的内部上拉电阻。
其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。
作为输入使用时, 若内部上拉电阻使能,端口被外部电路拉低时将输出电流。
在复位过程中,即使系统时钟还未起振,端口A 处于高阻状态。
1MOSI SPI 总线的主机输出/ 从机输入信号PB6 8 位双向I/O 口2MISO SPI 总线的主机输入/ 从机输出信号PB7 8 位双向I/O 口3SCK SPI 总线的串行时钟4 RESET 复位输入引脚。
持续时间超过最小门限时间的低电平将引起系统复位。
5 VCC 数字电路的电源6 GND 地7 XTAL2 反向振荡放大器的输出端8 XTAL1 反向振荡放大器与片内时钟操作电路的输入端PD0 8 位双向I/O 口9RXD USART 输入引脚PD1 8 位双向I/O 口10TXD USART 输出引脚PD2 8 位双向I/O 口11INT0 外部中断0 的输入PD3 8 位双向I/O 口12INT1 外部中断1 的输入Atmega16寄存器PD4 8 位双向I/O 口13OC1B T/C1 输出比较B 匹配输出PD5 8 位双向I/O 口14OC1A T/C1 输出比较A 匹配输出PD6 8 位双向I/O 口15ICP1 T/C1 输入捕捉引脚PD7 8 位双向I/O 口16OC2 T/C2 输出比较匹配输出17 VCC 数字电路的电源18 GND 地PC0 8 位双向I/O 口19SCL 两线串行总线时钟线PC1 8 位双向I/O 口20SDA 两线串行总线数据输入/ 输出线PC2 8 位双向I/O 口21TCK JTAG 测试时钟PC3 8 位双向I/O 口22TMS JTAG 测试模式选择PC4 8 位双向I/O 口23TDO JTAG 测试数据输出PC5 8 位双向I/O 口24TDI JTAG 测试数据输入PC6 8 位双向I/O 口25TOSC1 定时振荡器引脚1PC7 8 位双向I/O 口26TOSC2 定时振荡器引脚227 AVCC 端口A与A/D转换器的电源。
ATmega16单片机的使用——实验一 Atmega16定时器T/C0实现按键扫描——实验二 ATmega16单片机的ADC使用举例指导老师:黄刚班级:0720222姓名:李锋锐学号:28试验《一》 Atmega16定时器T/C0实现按键扫描(一)实验目的:用ATmega16实现同时对两个按键定时扫描,要求扫描周期为10MS ,当AJ1按下,LED2点亮,并且BELL 蜂鸣声,当AJ1松开,LED2熄灭,BELL 不响;当AJ2按下,LED3点亮,并且BELL 发出蜂鸣声,当AJ2松开,LED3熄灭,BELL 不响。
(二)实验原理(硬件设计):如图5-37所示,端口PD.3、PD.4为输入端,分别接AJ1和AJ2;端口PD.6、PD.7为输出模式,分别接LED2和LED3;端口PA.4为输出,通过三极管T1来控制蜂鸣器。
图5-36 基于Atmega16单片机定时器的按键扫描电路图(三)实验原理(软件设计):选用外部7.3728MHz 的晶振为系统时钟,按键扫描间隔定位10ms ,定时器T/C0采用CTC 模式,T/C0时钟选择1024分频后的系统时钟,并启用中断。
利用CTC 模式的工作原理,OCR0应赋的值由以下方程确定:361010)10(1024103728.71-⨯=+⨯⨯⨯OCR 于是:)(即0x47710=OCR 。
允许比较匹配中断,在中断程序里做标志位设置,判断标志位满足条件时,程序再读取键盘的状态,确定有无键按下以及按下键的具体操作。
程序如下:(1) L5-6.c#include<iom16.h> #include"key.h"#define Led2 PORTD_Bit6//定义led2 #define Led3 PORTD_Bit7//定义led3 #define Bell PORTA_Bit4//定义bell unsigned char flag=0;void port_init(void);void timer0_init(void);//************************主程序****************************//void main(void){port_init();timer0_init();SREG_Bit7=1;//使能全局中断TCCR0=0x0D;// 定时器工作模式为CTC模式,定时器时钟源来自预分频器的1024分频 while(1){if(flag==1){flag=0;switch(read_key()){case 0:Led2 =1; // Led2灯不亮Led3=1; //Led3灯不亮Bell =0; //蜂鸣器不响break;case 1:Led2 =0; //led2灯亮Led3=1; //Led3灯不亮Bell =1; //蜂鸣器响break;case 2:Led2 =1; //led2灯不亮Led3=0; //Led3灯亮Bell =1; //蜂鸣器响break;}}}}//*******************端口初始化程序*****************************//void port_init(void){DDRD=0xc0;PORTD=0x18;//PD.3( AJ1 )和PD.4( AJ12)方向输入,上拉有效,PD.6(Led2)和//PD.7(Led3)方向输出DDRA=0x10;PORTA=0x00;//PA.4(Bell)方向输出}//******************定时器寄存器初始化程序*(***********************//void timer0_init(void){TCCR0=0x00;TCNT0=0x00;OCR0=0x47; //7.3728MHz的系统时钟(OCR0=0X48)10msTIMSK=0x02; //TC0比较匹配中断使能}//******************定时器0比较匹配中断服务程序***********************// #pragma vector=TIMER0_COMP_vect__interrupt void TIMER0_COMP_isr(void){SREG_Bit7=0;//关闭全局中断flag=1; //标志位置位SREG_Bit7=1; //打开全局中断}(2) key.h#include<iom16.h>#define AJ1 PIND_Bit3//定义按键1#define AJ2 PIND_Bit4//定义按键2unsigned char read_key(){static unsigned char key_state=0;unsigned char key_return=0;switch((key_state)){case 0:if(!AJ1||!AJ2){key_state=1;}break;case 1:if(!AJ1||!AJ2){switch((PIND&0x18)){case 0x10://AJ1按下,返回1key_return=1;break;case 0x08://AJ2按下,返回2key_return=2;break;}key_state=2;}else{key_state=0;}break;case 2:if(AJ1&&AJ2){key_state=0;}if(!AJ1){key_return=1;}if(!AJ2){key_return=2;}break;default: break;}return ( key_return);}四、实验结果:ATmega16可实现同时对两个按键定时扫描,扫描周期为10MS,当AJ1按下,LED2点亮,并且BELL蜂鸣声,当AJ1松开,LED2熄灭,BELL不响;当AJ2按下,LED3点亮,并且BELL发出蜂鸣声,当AJ2松开,LED3熄灭,BELL不响。
A VR单片机
(ATmega16)
培训宗旨:引导为主培养编程思维
时间分配(一学期):三分之一时间讲解;
三分之二时间动手实验。
具体时间:星期六晚上6:00~9:00
内容形式:
1、软、硬件知识
(一)讲解2、实验经验
3、常用程序(思维)分析
1、专业讲座(请资深讲师)
(二)讲座2、课外讲座(如书记等)
3、电影(专业性强的短片)(李世维讲座)
1、硬件测试与软件使用
(三)实验内容2、汇编语言编程
3、A VR单片机内部资源的使用
建议方法:先由指导老师讲解实验内容的原理、特点、应用、实践应用中的经验以及编程思维的分析,再由会员自己理解、自己验证、运用原理设计
应用、调试程序。
在会员动手的过程中,由摇篮的部长(三名)从旁
指导。
实验一软件和硬件的认识
一、实验目的:
1、掌握硬件原理。
2、初步掌握实验板的使用方法。
3、熟悉软件工作界面。
二、实验仪器:ATmage16实验板一块
PC机一台
三、实验内容及步骤:
1、插上电源,按下开关。
观察批示灯是否点亮。
电源(可输入7~12V)
ATmega16管脚图
2、由原理可知I/O口的批示灯为低电平亮,在实验板上取地与I/O口相接,观察是否点亮。
I/O口LED显示与接口
3、打开编程界面,点击各栏,认识各栏的用途。
A VRICC IDE 软件的工作界面
4、输入以下程序:
#include <iom16v.h>
int main(void)
{
DDRA = 0xff; /* all outputs */
DDRB = 0xff; /* all outputs */
DDRC = 0xff; /*all outputs */
DDRD = 0xff; /*all outputs */
PORTA = 0x00; /* 输出低电平*/
PORTB = 0x00; /* 输出低电平*/
PORTC = 0x00; /* 输出低电平*/
PORTD = 0x00; /* 输出低电平*/
while(1);
}
观察I/O口的灯是否被点亮。
实验二I/O口的输入与输出
一、实验目的:
1、了解IO口的结构;
2、熟悉IO口的特性;
3、掌握IO口的控制。
二、实验仪器:ATmage16实验板一块
PC机一台
三、实验原理:
作为通用数字I/O 使用时,A VR 所有的I/O 端口都具有真正的读- 修改- 写功能。
这意味着用SBI 或CBI 指令改变某些管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻) 时不会改变其他管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻)。
输出缓冲器具有对称的驱动能力,可以输出或吸收大电流,直接驱动LED。
所有的端口引脚都具有与电压无关的上拉电阻。
并有保护二极管与VCC 和地相连,如Figure23 所示。
在控制I/O时,分别由方向寄存器DDRX与数据寄存器PORTX控制I/O的状态,如下表。
Figure 23. I/O 引脚等效原理图。