AVR单片机班培训内容mega16附源程序.docx
- 文档编号:26055079
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:33
- 大小:458.86KB
AVR单片机班培训内容mega16附源程序.docx
《AVR单片机班培训内容mega16附源程序.docx》由会员分享,可在线阅读,更多相关《AVR单片机班培训内容mega16附源程序.docx(33页珍藏版)》请在冰豆网上搜索。
AVR单片机班培训内容mega16附源程序
AVR单片机
(ATmega16)
培训宗旨:
引导为主培养编程思维
时间分配(一学期):
三分之一时间讲解;
三分之二时间动手实验。
具体时间:
星期六晚上6:
00~9:
00
内容形式:
1、软、硬件知识
(一)讲解2、实验经验
3、常用程序(思维)分析
1、专业讲座(请资深讲师)
(二)讲座2、课外讲座(如书记等)
3、电影(专业性强的短片)(李世维讲座)
1、硬件测试与软件使用
(三)实验内容2、汇编语言编程
3、AVR单片机内部资源的使用
建议方法:
先由指导老师讲解实验内容的原理、特点、应用、实践应用中的经验以及编程思维的分析,再由会员自己理解、自己验证、运用原理设计应用、调试程序。
在会员动手的过程中,由摇篮的部长(三名)从旁指导。
实验一软件和硬件的认识
一、实验目的:
1、掌握硬件原理。
2、初步掌握实验板的使用方法。
3、熟悉软件工作界面。
二、实验仪器:
ATmage16实验板一块
PC机一台
三、实验内容及步骤:
1、插上电源,按下开关。
观察批示灯是否点亮。
电源(可输入7~12V)
ATmega16管脚图
2、由原理可知I/O口的批示灯为低电平亮,在实验板上取地与I/O口相接,观察是否点亮。
I/O口LED显示与接口
3、打开编程界面,点击各栏,认识各栏的用途。
AVRICCIDE软件的工作界面
4、输入以下程序:
#include
intmain(void)
{
DDRA=0xff;/*alloutputs*/
DDRB=0xff;/*alloutputs*/
DDRC=0xff;/*alloutputs*/
DDRD=0xff;/*alloutputs*/
PORTA=0x00;/*输出低电平*/
PORTB=0x00;/*输出低电平*/
PORTC=0x00;/*输出低电平*/
PORTD=0x00;/*输出低电平*/
while
(1);
}
观察I/O口的灯是否被点亮。
实验二I/O口的输入与输出
一、实验目的:
1、了解IO口的结构;
2、熟悉IO口的特性;
3、掌握IO口的控制。
二、实验仪器:
ATmage16实验板一块
PC机一台
三、实验原理:
作为通用数字I/O使用时,AVR所有的I/O端口都具有真正的读-修改-写功能。
这意味着用SBI或CBI指令改变某些管脚的方向(或者是端口电平、禁止/使能上拉电阻)时不会改变其他管脚的方向(或者是端口电平、禁止/使能上拉电阻)。
输出缓冲器具有对称的驱动能力,可以输出或吸收大电流,直接驱动LED。
所有的端口引脚都具有与电压无关的上拉电阻。
并有保护二极管与VCC和地相连,如Figure23所示。
在控制I/O时,分别由方向寄存器DDRX与数据寄存器PORTX控制I/O的状态,如下表。
Figure23.I/O引脚等效原理图
I/O口LED显示与接口
四、实验内容及步骤:
输入以下程序:
这个程序为流水灯
#include
//*******************延时us
voiddelay_us(intt)
{
do
t--;
while(t>1);
}
//*******************延时ms
voiddelay_ms(unsignedintt)
{
while(t!
=0)
{
delay_us(1142);
t--;}
}
intmain(void)
{
DDRA=0xff;/*alloutputs*/
DDRB=0xff;/*alloutputs*/
DDRC=0xff;/*alloutputs*/
DDRD=0xff;/*alloutputs*/
PORTA=0XFF;
PORTB=0XFF;
PORTC=0XFF;
PORTD=0XFF;
while
(1)
{//***IO口输出低电平有效,如:
0X01为十六进制数,二进制表示为00000001B,再取反
PORTA=~0X01;
delay_ms(1000);//************延时1秒
PORTA=~0X02;
delay_ms(1000);
PORTA=~0X04;
delay_ms(1000);
PORTA=~0X08;
delay_ms(1000);
PORTA=~0X10;
delay_ms(1000);
PORTA=~0X20;
delay_ms(1000);
PORTA=~0X40;
delay_ms(1000);
PORTA=~0X80;
delay_ms(1000);
PORTA=0XFF;
PORTB=~0X01;
delay_ms(1000);//************延时1秒
PORTB=~0X02;
delay_ms(1000);
PORTB=~0X04;
delay_ms(1000);
PORTB=~0X08;
delay_ms(1000);
PORTB=~0X10;
delay_ms(1000);
PORTB=~0X20;
delay_ms(1000);
PORTB=~0X40;
delay_ms(1000);
PORTB=~0X80;
delay_ms(1000);
PORTB=0XFF;
PORTC=~0X01;
delay_ms(1000);
PORTC=~0X02;
delay_ms(1000);
PORTC=~0X04;
delay_ms(1000);
PORTC=~0X08;
delay_ms(1000);
PORTC=~0X10;
delay_ms(1000);
PORTC=~0X20;
delay_ms(1000);
PORTC=~0X40;
delay_ms(1000);
PORTC=~0X80;
delay_ms(1000);
PORTC=0XFF;
PORTD=~0X01;
delay_ms(1000);
PORTD=~0X02;
delay_ms(1000);
PORTD=~0X04;
delay_ms(1000);
PORTD=~0X08;
delay_ms(1000);
PORTD=~0X10;
delay_ms(1000);
PORTD=~0X20;
delay_ms(1000);
PORTD=~0X40;
delay_ms(1000);
PORTD=~0X80;
delay_ms(1000);
PORTD=0XFF;
}
}
观看现象是不是流水灯。
实验三外部中断
一、实验目的:
1、了解外部中断的库函数;
2、熟悉外部中断的特性;
3、掌握外部中断的使用。
二、实验仪器:
ATmage16实验板一块
PC机一台
三、实验原理:
外部中断通过引脚INT0与INT1或PCINT23..0触发。
只要使能了中断,即使引脚INT0与INT1或PCINT23..0配置为输出,只要电平发生了合适的变化,中断也会触发。
这个特点可以用来产生软件中断。
只要使能,PCINT23..16引脚上的电平变化将触发外部中断PCI2,PCINT14..8引脚上的电平变化将触发外部中断PCI1,PCINT7..0将触发外部中断PCI0。
PCMSK2、PCMSK1与PCMSK0寄存器则用来检测是哪个引脚上的电平发生了变化。
PCINT23..0外部中断的检测是异步的。
也就是说,和其他中断方式一样,这些中断也可以用来将器件从休眠模式唤醒。
INT0与INT1中断可以由下降沿、上升沿,或者是低电平触发。
具体由外部中断控制寄存器A–EICRA的设置来确定。
当INT0或INT1中断使能且设定为电平触发时,只要引脚电平被拉低,中断就会产生。
若要求INT0或INT1在信号下降沿或上升沿触发中断,则I/O时钟必须工作(请参见P23”时钟系统及其分布”了解更多信息)。
INT0与INT1的低电平中断检测是异步的。
也就是说它可以用来将器件从休眠模式唤醒。
在休眠过程(除了空闲
模式)中I/O时钟是停止的。
通过电平中断将MCU从掉电模式唤醒时,要保证低电平保持一定的时间以使MCU完成唤醒过程并触发中断。
如果触发电平在启动时间结束前就消失,MCU将被唤醒,但中断不会被触发。
启动时间由熔丝位SUT与CKSEL决定。
详见P23”系统时钟及其选项”。
外部中断控制寄存器MCUCR外部中断控制寄存器A包括决定中断触发方式的控制位。
位1,0–ISC01,ISC00:
中断触发方式控制0之位1与位0外部中断0由引脚INT0激发,如果SREG寄存器的I标志位和相应的中断屏蔽位置位的话。
触发方式如Table35所示。
在检测边沿前MCU首先采样INT0引脚上的电平。
如果选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。
如果选择低电平触发方式,那么低电平必须保持到当前指令执行完成。
中断完成后回到被中断的位置。
外部中断控制寄存器MCUCR外部中断控制寄存器A包括决定中断触发方式的控制位。
通用中断控制寄存器GICR,控制外部中断使能位,具体如下:
四ICC软件中断程序书写格式及16中断向量表
16中断向量表
五实验步骤及内容:
输入程序:
本程序一开始是IO口中的A口以流水灯工作,一旦有外部中断请求,就是B口以流水灯工作,循环一次后回到被中断处继续运行。
程序如下:
#include
#include
//*******************延时us
voiddelay_us(intt)
{
do
t--;
while(t>1);
}
//*******************延时ms
voiddelay_ms(unsignedintt)
{
while(t!
=0)
{
delay_us(1142);
t--;}
}
#pragmainterrupt_handlerINT_0:
2//外部中断0执行函数
voidINT_0(void)
{
PORTC=0XFF;
PORTB=~0X01;
delay_ms(1000);
PORTB=~0X02;
delay_ms(1000);
PORTB=~0X04;
delay_ms(1000);
PORTB=~0X08;
delay_ms(1000);
PORTB=~0X10;
delay_ms(1000);
PORTB=~0X20;
delay_ms(1000);
PORTB=~0X40;
delay_ms(1000);
PORTB=~0X80;
delay_ms(1000);
PORTB=0XFF;
}
voidmain(void)
{
DDRA=0xff;/*输出*/
DDRB=0xff;/*输出*/
DDRC=0xff;/*输出*/
DDRD=0xff;/*输出*/
PORTA=0XFF;
PORTB=0XFF;
PORTC=0XFF;
PORTD=0XFF;
MCUCR=0X02;//定义外部中断INT0为下降沿产生中断请求
GICR=0X40;//中断屏蔽寄存器开INT0
SEI();//******开全局中断
for(;;)
{
PORTA=~0X01;
delay_ms(1000);
PORTA=~0X02;
delay_ms(1000);
PORTA=~0X04;
delay_ms(1000);
PORTA=~0X08;
delay_ms(1000);
PORTA=~0X10;
delay_ms(1000);
PORTA=~0X20;
delay_ms(1000);
PORTA=~0X40;
delay_ms(1000);
PORTA=~0X80;
delay_ms(1000);
}
}
实验四数码LED实验
一、实验目的:
1、了解数码管的原理;
2、熟悉数码管的使用;
3、掌握外部中断和数码管动态显示的应用。
二、实验仪器:
ATmage16实验板一块
PC机一台
三、实验原理:
数码管原理图如下:
多个数码管的动态显示是利用人的眼睛在瞬间无法识别的原理来实现在,如电灯也是利用这个原理。
四、实验步骤及内容:
这个程序是数码管动态显示,按INT0键加1,一直到数码管显示为9999再重新计数。
实验程序如下:
#include
#include
intled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//*******显示符0,1,2,3,4,5,6,7,8,9,
unsignedinti;
intg,s,b,q;
//*******************延时us
voiddelay_us(intt)
{
do
t--;
while(t>1);
}
//*******************延时ms
voiddelay_ms(unsignedintt)
{
while(t!
=0)
{
delay_us(1142);
t--;}
}
#pragmainterrupt_handlerINT_0:
2//外部中断0执行函数
voidINT_0(void)
{i++;
delay_ms(15);//******键盘防抖动
}
voidmain(void)
{
DDRD=0xff;/*alloutputs*/
DDRC=0xff;/*alloutputs*/
DDRB=0xff;/*alloutputs*/
PORTB=0XFF;
PORTC=0X00;
PORTD=0XFF;
MCUCR=0X02;//定义外部中断INT0为下降沿产生中断请求
GICR=0X40;//中断屏蔽寄存器开INT0
SEI();//******开全局中断
for(;;)//****显示按键次数
{
if(i>9999)
i=0;
g=i%10;//取个位,取余
PORTC=0X01;
PORTB=led[g];
delay_ms
(1);
s=i%100/10;//取十位
PORTC=0X02;
PORTB=led[s];
delay_ms
(1);
b=i%1000/100;//取百位
PORTC=0X04;
PORTB=led[b];
delay_ms
(1);
q=i%10000/1000;//取千位
PORTC=0X08;
PORTB=led[q];
delay_ms
(1);
/*for(i=0;i<4;i++)
{
g=i%10;//取余
PORTC=|(1<
PORTB=led[g];
g=i/10;//取整
PORTC=0x00;;
)*/
}
}
实验五键盘接口实验
一、实验目的:
1、了解IO口的结构;
2、熟悉键盘的程序原理;
3、掌握键盘的使用。
二、实验仪器:
MEGA16实验板一块
PC机一台
三、实验原理:
在AVR单片机中,当I/O方向设置为输入,电平被设置为高电平时,一旦外部接入低电平,端口电平被拉低,电平变化会反映相应端口PINX寄存器中,利用这一特点,在键盘中采用设置行所对IO口为输出,高电平,列所对IO口为输入,高电平。
对行所对IO口电平逐个设置为低电平,此时列线上某列电平被拉低。
通过读取列线上电平,计算出所按键值。
四实验程序
#include
#include
/////////////////////////////延时///////////////////////////////////////////
voiddelay_us(intt)//us
{
do
t--;
while(t>1);
}
voiddelay_ms(unsignedintt)//ms
{
while(t!
=0)
{
delay_us(1142);
t--;
}
}
unsignedcharled[]={0X3F,/*0*///七段译码表
0X06,/*1*/
0X5B,/*2*/
0X4F,/*3*/
0X66,/*4*/
0X6D,/*5*/
0X7D,/*6*/
0X07,/*7*/
0X7F,/*8*/
0X6F,/*9*/
0X77,/*A*/
0X7C,/*b*/
0X39,/*C*/
0X5E,/*d*/
0X79,/*E*/
0X71,/*F*/
};//显示符0,1,2,3,4,5,6,7,8,9,
unsignedcharled_buff[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};//显示缓冲区
unsignedcharscan_key(void)//不做按键释放检查的键盘扫描函数
{
unsignedchari,temp;
DDRD=0X0F;//设置D口的高四位为输入,低四位为输出
PORTD=0XFf;//D口输出高电平
for(i=0;i<4;i++)
{
PORTD=~(1<
delay_us(500);
temp=PIND&0XF0;//temp取D口高四位的值
if(temp!
=0xf0)//如有键按下,延时15ms
{
delay_ms(15);//延时用来消除显示抖动
temp=PIND&0xf0;//再读键盘
if(temp!
=0xf0)
{
temp&=0xf0;
switch(temp)//计算键值
{
case0x70:
temp=15-(3-i)*4;break;
case0xb0:
temp=14-(3-i)*4;break;
case0xd0:
temp=13-(3-i)*4;break;
case0xe0:
temp=12-(3-i)*4;break;
default:
temp=0x7f;
}
returntemp;//返回temp
}
}
PORTD=0xff;
}
return0x7f;
}
voidport_init(void)//初始化IO
{
DDRA=0xff;
PORTA=0xff;
DDRC=0xff;
PORTC=0Xff;
DDRD=0x0f;
PORTD=0xff;
}
voiddisplay(void)//六位数码管显示
{
unsignedinti=0;
for(;i<6;i++)
{
PORTA=led_buff[i];//PA口为段选
PORTC=(1<
delay_us(1000);
PORTC=0X00;
}
}
voidmain(void)
{
unsignedcharkey1,key2;
unsignedchari;
port_init();
for(;;)
{
key1=scan_key();//键盘扫描
if(key1!
=0x7f)
{
do
{
key2=scan_key();
display();
}
while(key1==key2);
for(i=0;i<5;i++)//显示
led_buff[5-i]=led_buff[4-i];//按下一次移一次
led_buff[0]=led[key1];//做led显示转换
}
display();//显示
}
}
实验六模数转换AD实验
一、实验目的:
1、了解IO口的结构;
2、熟悉A/D的特性;
3、掌握A/D的使用。
二、实验仪器:
MEGA16实验板一块
PC机一台
三、实验原理:
四、实验步骤及内容:
#include
#include
#defineVREF4.950
unsignedintV=0;
floatVin=0;
unsignedcharled[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//0-9
unsignedcharled_putff[]={0X3F,0X3F,0X3F,0X3F};
//*******************延时us
voiddelay_us(intt)
{
do
t--;
while(t>1);
}
//*******************延时ms
voiddelay_ms(unsignedintt)
{
while(t!
=0)
{
delay_us(1142);
t--;}
}
/*....中断....*/
#pragmainterrupt_handlerADC_isr:
15
voidADC_isr(void)
{
V=ADCL;
V=(ADCH<<8)+V;//读取转换数值
}
/*....系统初始化....*/
Voidchushihua(void)
{
DDRD=0XFF;//位选
DDRB=0XFF;//数码管
DDRA=0XFE;//C0口电压输入
PORTD=0X00;
PORTB=0XC0;
PORTA=0X00;
ADCSRA|=(1< SEI(); } /*....AD初始化....*/ voidad_link(void) { ADCSRA|=(1< ADCSRA|=(1< ADCSRA|=(1< ADMUX=0X40;//右对齐,基准电源VREF。 零通道 SFIOR=0X0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AVR 单片机 培训 内容 mega16 源程序