单片机班培训Word文档格式.docx
《单片机班培训Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机班培训Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
3、打开编程界面,点击各栏,认识各栏的用途。
AVRICCIDE软件的工作界面
4、输入以下程序:
#include<
iom16v.h>
intmain(void)
{
DDRA=0xff;
/*alloutputs*/
DDRB=0xff;
DDRC=0xff;
/*alloutputs*/
DDRD=0xff;
PORTA=0x00;
/*输出低电平*/
PORTB=0x00;
PORTC=0x00;
PORTD=0x00;
while
(1);
}
观察I/O口的灯是否被点亮。
实验二I/O口的输入与输出
1、了解IO口的结构;
2、熟悉IO口的特性;
3、掌握IO口的控制。
二、实验仪器:
ATmage16实验板一块
三、实验原理:
作为通用数字I/O使用时,AVR所有的I/O端口都具有真正的读-修改-写功能。
这意味着用SBI或CBI指令改变某些管脚的方向(或者是端口电平、禁止/使能上拉电阻)时不会改变其他管脚的方向(或者是端口电平、禁止/使能上拉电阻)。
输出缓冲器具有对称的驱动能力,可以输出或吸收大电流,直接驱动LED。
所有的端口引脚都具有与电压无关的上拉电阻。
并有保护二极管与VCC和地相连,如Figure23所示。
在控制I/O时,分别由方向寄存器DDRX与数据寄存器PORTX控制I/O的状态,如下表。
Figure23.I/O引脚等效原理图
四、实验内容及步骤:
输入以下程序:
这个程序为流水灯
//*******************延时us
voiddelay_us(intt)
do
t--;
while(t>
1);
//*******************延时ms
voiddelay_ms(unsignedintt)
while(t!
=0)
delay_us(1142);
t--;
/*alloutputs*/
PORTA=0XFF;
PORTB=0XFF;
PORTC=0XFF;
PORTD=0XFF;
while
(1)
{//***IO口输出低电平有效,如:
0X01为十六进制数,二进制表示为00000001B,再取反
PORTA=~0X01;
delay_ms(1000);
//************延时1秒
PORTA=~0X02;
PORTA=~0X04;
PORTA=~0X08;
PORTA=~0X10;
PORTA=~0X20;
PORTA=~0X40;
PORTA=~0X80;
PORTA=0XFF;
PORTB=~0X01;
PORTB=~0X02;
PORTB=~0X04;
PORTB=~0X08;
PORTB=~0X10;
PORTB=~0X20;
PORTB=~0X40;
PORTB=~0X80;
PORTB=0XFF;
PORTC=~0X01;
PORTC=~0X02;
PORTC=~0X04;
PORTC=~0X08;
PORTC=~0X10;
PORTC=~0X20;
delay_ms(1000);
PORTC=~0X40;
PORTC=~0X80;
PORTC=0XFF;
PORTD=~0X01;
PORTD=~0X02;
PORTD=~0X04;
PORTD=~0X08;
PORTD=~0X10;
PORTD=~0X20;
PORTD=~0X40;
PORTD=~0X80;
}
观看现象是不是流水灯。
实验三外部中断
1、了解外部中断的库函数;
2、熟悉外部中断的特性;
3、掌握外部中断的使用。
外部中断通过引脚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引脚上的电平。
如果选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。
如果选择低电平触发方式,那么低电平必须保持到当前指令执行完成。
中断完成后回到被中断的位置。
通用中断控制寄存器GICR,控制外部中断使能位,具体如下:
四ICC软件中断程序书写格式及16中断向量表
16中断向量表
五实验步骤及内容:
输入程序:
本程序一开始是IO口中的A口以流水灯工作,一旦有外部中断请求,就是B口以流水灯工作,循环一次后回到被中断处继续运行。
程序如下:
macros.h>
while(t>
#pragmainterrupt_handlerINT_0:
2//外部中断0执行函数
voidINT_0(void)
{
voidmain(void)
DDRA=0xff;
/*输出*/
DDRB=0xff;
DDRC=0xff;
/*输出*/
DDRD=0xff;
MCUCR=0X02;
//定义外部中断INT0为下降沿产生中断请求
GICR=0X40;
//中断屏蔽寄存器开INT0
SEI();
//******开全局中断
for(;
;
)
{
PORTA=~0X01;
PORTA=~0X80;
实验四数码LED实验
1、了解数码管的原理;
2、熟悉数码管的使用;
3、掌握外部中断和数码管动态显示的应用。
二、实验仪器:
三、实验原理:
数码管原理图如下:
多个数码管的动态显示是利用人的眼睛在瞬间无法识别的原理来实现在,如电灯也是利用这个原理。
四、实验步骤及内容:
这个程序是数码管动态显示,按INT0键加1,一直到数码管显示为9999再重新计数。
实验程序如下:
#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;
{i++;
delay_ms(15);
//******键盘防抖动
voidmain(void)
PORTC=0X00;
MCUCR=0X02;
GICR=0X40;
)//****显示按键次数
{
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];
b=i%1000/100;
//取百位
PORTC=0X04;
PORTB=led[b];
q=i%10000/1000;
//取千位
PORTC=0X08;
PORTB=led[q];
/*for(i=0;
i<
4;
i++)
{
//取余
PORTC=|(1<
<
i);
g=i/10;
//取整
PORTC=0x00;
)*/
实验五键盘接口实验
2、熟悉键盘的程序原理;
3、掌握键盘的使用。
MEGA16实验板一块
在AVR单片机中,当I/O方向设置为输入,电平被设置为高电平时,一旦外部接入低电平,端口电平被拉低,电平变化会反映相应端口PINX寄存器中,利用这一特点,在键盘中采用设置行所对IO口为输出,高电平,列所对IO口为输入,高电平。
对行所对IO口电平逐个设置为低电平,此时列线上某列电平被拉低。
通过读取列线上电平,计算出所按键值。
四实验程序
/////////////////////////////延时///////////////////////////////////////////
voiddelay_us(intt)//us
voiddelay_ms(unsignedintt)//ms
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;
PORTD=~(1<
//第i为值为低电平
delay_us(500);
temp=PIND&
0XF0;
//temp取D口高四位的值
if(temp!
=0xf0)//如有键按下,延时15ms
delay_ms(15);
//延时用来消除显示抖动
temp=PIND&
0xf0;
//再读键盘
=0xf0)
temp&
=0xf0;
switch(temp)//计算键值
case0x70:
temp=15-(3-i)*4;
break;
case0xb0:
temp=14-(3-i)*4;
case0xd0:
temp=13-(3-i)*4;
case0xe0:
temp=12-(3-i)*4;
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(;
6;
{
PORTA=led_buff[i];
//PA口为段选
PORTC=(1<
//PC口为位选
delay_us(1000);
}
unsignedcharkey1,key2;
unsignedchari;
port_init();
)
key1=scan_key();
//键盘扫描
if(key1!
=0x7f)
do
key2=scan_key();
display();
while(key1==key2);
for(i=0;
5;
i++)//显示
led_buff[5-i]=led_buff[4-i];
//按下一次移一次
led_buff[0]=led[key1];
//做led显示转换
display();
//显示
实验六模数转换AD实验
2、熟悉A/D的特性;
3、掌握A/D的使用。
MEGA16实验板一块
#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};
/*....中断....*/
#pragmainterrupt_handlerADC_isr:
15
voidADC_isr(void)
V=ADCL;
V=(ADCH<
8)+V;
//读取转换数值
/*....系统初始化....*/
voidxhushihua(void)
DDRD=0XFF;
//位选
DDRB=0XFF;
//数码管
DDRA=0XFE;
//C0口电压输入
PORTD=0X00;
PORTB=0XC0;
PORTA=0X00;
ADCSRA|=(1<
ADEN);
//开启AD
SEI();
/*....AD初始化....*/
voidad_link(void)
ADCSRA|=(1<
ADSC)|(1<
ADIE);
//启动转换
ADPS0)|(1<
ADPS1);
//八分频
ADATE);
//开启连续模式使能
ADMUX=0X00;
//右对齐,基准电源VREF。
零通道
SFIOR=0X00;
//开启连续模式
/*....计算转换值....