秋季学期AVR 单片机应用技术实验报告Word文档下载推荐.docx
《秋季学期AVR 单片机应用技术实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《秋季学期AVR 单片机应用技术实验报告Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
实验类型:
验证型
2,实验目的:
用户可以通过此程序的学习,初步掌握单片机的IO端口操作。
3,实验步骤:
用一条8pin的数据线连接PA口的JP51和跑马灯的JP32。
控制较大的延时,通过PA口8位先依次从右向左置零控制8路LED灯依次点亮,再从左向右置零控制8路LED灯回亮,构成跑马形式,以初步掌握单片机的I\O端口操作
4,实验框图:
5,实验代码:
5,运行结果:
程序运行结果截图及相应说明说明:
8路LED灯从下至上逐个亮,然后从从上至下逐个亮,形成跑马形式
(实验1)
实验2继电器控制
1,实验类型:
验证性
2,实验内容:
一根1pin的数据线连接PA口的PA0和继电器的JP18,用pa口的第0位轮流输出高低电平控制继电器的吸合,目的是掌握通用I\O口的位操作
3,实验框图:
硬件电路连接图(没有则不写)、软件流程图
硬件电路连接图
ATmega16
软件流程图(硬件连接图略)
置各种初值,
并while
(1)
4.程序代码:
5,运行结果:
可以听到继电器吸合产生的啪啪声,如果延时变短,啪啪声也将更急促。
(实验2)
实验38路指示灯读出8路开关的状态
PB口读入8路开关的状态,以此为条件,PD口控制相应开关对应的指示灯亮,目的是理解单片机数和位的概念以及数据传递的概念,并掌握通用I\O口的输入
/*******************************************************************
*******************************************************************/
//PB口按键接8路按键jp37,PD口接8路指示灯jp32
#defineucharunsignedchar
#defineuintunsignedint
#definePB00
#definePB11
#definePB22
#definePB33
#definePB44
#definePB55
#definePB66
#definePB77
#definePD00
#definePD11
#definePD22
#definePD33
#definePD44
#definePD55
#definePD66
#definePD77
#include<
mega16.h>
voidkey()
{
if((PINB&
(1<
<
PB0))==0)/*判断按键状态,按键按下时其电位为0*/
{
PORTD=~(1<
PD0);
/*portd引脚低电平,点亮指示灯,也是共阳极*/
}
PB1))==0)
{
PD1);
if((PINB&
PB2))==0)
PD2);
PB3))==0)
PD3);
PB4))==0)/*判断按键状态*/
PD4);
/*点亮指示灯*/
PB5))==0)
PD5);
PB6))==0)
PD6);
PB7))==0)
PD7);
}
voidmain()
DDRD=0xff;
//输出方式
PORTD=0xff;
//全灭
DDRB=0x00;
//输入方式PORTB=0xff;
//上拉电阻有效while
(1){key();
}
按开关0,指示灯0亮;
按开关1,指示灯1亮,依次类推,按开关7,指示灯7亮.
(实验3)
实验4数码管静态扫描
1,实验类型:
2,实验内容:
PA口的低四位与74LS47(数码管译码器)的输入端连接,通过置PA口低四位为0b0000~0b1001使数码管静态输出1~9,目的是熟悉数码管的静态显示操作
3,实验框图:
软件流程图
当前值加1并延迟后
赋值给porta[0:
3]
no当前值大于9?
Yes
4,程序代码:
程序代码及相应的详细注释
//74ls47的jp19的A,B,C,D接到单片机的PA0,PA1,PA2,PA3数码管轮流显示0-9
//头文件
/*********************************************************
**
*N*ms延时函数*
***********************************************************/voiddelayms(uintn)
{uinti=0,j=0;
for(i=0;
i<
n;
i++)for(j=0;
j<
100;
j++);
*主函数*
***********************************************************/intmain(void)
uchark;
DDRA=0x0F;
//置PA口输出PORTA=0x00;
while
(1)
for(k=0;
k<
10;
k++)
PORTA=k;
//数码管有间隔地依次显示0~9
delayms(300);
会看到一个数码管会顺次显示0到9.
(实验4)
实验5数码管动态扫描显示01234567
验证性实验内容:
pa口作输出到数码管的电平,PD口则选通数码管的某一个;
延时极短的时间,然后改变pa口的输入,PD口选通另一个数码管,再延时极短的时间,这样依次选通8个数码管,造成动态显示0~7,由于间隔时间极短8个数码管同时显示01234567,目的是进一步熟练通用I\O口的操作和动态数码管显示的操作。
实验框图:
流程图
程序代码:
//PA口接数码管数据jp5,PD口接数码管位选jp8
#defineucharunsignedchar#defineuintunsignedintconstuchardis_code[10]={0x28,0x7e,0x0a2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};
/*共阳极,认为该数码管是共阳极的*/
uchardis_buf[8];
//显存缓冲区基地址uchardis_index;
//显示索引,用于标识当前显示的数码管和缓冲区的偏移量。
uchardis_digit;
//位选通值,用于选通当前数码管的数值。
/********************************************************
**********************************************************/
voiddelayms(uintn)
i++)for(j=0;
250;
j++)
;
/*******************************************************
*********************************************************/intmain(void)
uchari;
DDRA=0xFF;
//置PA口输出
PORTA=0xFF;
DDRD=0x00;
//置PD口输出PORTD=0xFF;
for(i=0;
8;
i++)//准备显示数据
{dis_buf[i]=dis_code[i+1];
//至低会显示1
dis_digit=0x01;
//预置位码初值,。
dis_index=0;
PORTA=dis_buf[dis_index];
//输出段码PORTD=dis_digit;
//输出位码delayms
(1);
dis_digit=(dis_digit<
1)//修改位码dis_index++;
if(dis_index==8)//8个数码管是否全部扫描完一遍?
//重装初值dis_index=0;
PORTD=0xff;
//关闭所有数码管
/*********************************************************/
运行结果:
8个数码管同时显示,显示为12345678.(程序稍微改下会显
示01234567)
(实验5)