AVR单片机_实验1:单片机基本输入输出实验

曾巧文 发布于:2012-4-26 18:54 分类:AVR单片机 标签: 实验 单片机 AVR


1 实验目的

了解ICCAVR 集成开发环境的使用和了解ATmega16单片机管脚的输入输出寄存器。

2 实验内容

1、建立一个新的工程。

2、建立一个C源文件,并添加到工程中。

3、设置开发环境相关选项。

4、编译工程。

5、熟悉Mega16的基本输入输出相关功能,并设计跑马灯和按键检测试验;

3 实验预习要求

仔细阅读ATmega16单片机的数据手册,了解管脚的输入输出寄存器的设置P48;教材P63跑马灯部分。

  1. 实验步骤

  2. 启动ICCAVR集成开发环境,选择【Project】->【New】,建立一个工程并保存,工程名字自定义,不能使用中文。见下图:

  3. 选择【File】->【New】建立一个新文件并添加到工程中,见下图:

  4. 选择【Project】->【Optoins…】,设置【Paths】和【Target】选项卡,【Paths】选项下的"Include Paths"为ICCAVR的安装目录下的include文件夹,"Library Paths"为ICCAVR安装目录下的lib文件夹。【Target】选项下的"Device Configuration"选择为目标MCU,本实验选用"ATmega16"。如下图:

    AVR

    【Paths】选项卡

    AVR

    【Target】选项卡

  5. 打开工程文件"ATMEGA16MAIN.PRJ",查看LED.h和LED.c以及main.c文件,了解PORTX和DDRX寄存器的设置。在main.c文件下添加相应代码,选择【Project】->【Rebuild All】编译工程,通过PROGISP程序下载程序到单片机,观察实验现象。详细的设置和下载参照视频文件。
  6. 思考

  7. 修改LED.c中runLed函数,观察实验现象。
  8. 添加按键输入功能,按键按下后出现相关的现象。

 

实验一 单片机基本输入输出(GPIO)实验





1 实验目的

掌握ICCAVR 集成开发环境的使用;

了解ATmega16单片机管脚的输入输出寄存器的使用方法;

2 实验内容

建立一个工程,实现流水灯的功能,并通过ISP下载到单片机中,观察实验效果。

3 采用AVR单片机基本输入输出接口设计跑马灯实验,并写出实验代码

注:LED0--LED7对应的IO分别是PC0-PC7,SW8对应的IO是PD3,见实验板原理图。

 

//ICC-AVR application builder : 2012-4-19 18:53:34
// Target : M16
// Crystal: 4.0000Mhz

#include <iom16v.h>
#include <macros.h>

void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0xFF; //m103 output only
 DDRC  = 0xFF;
 PORTD = 0x00;
 DDRD  = 0x00;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

delay_ms()
{
   unsigned short i;
   for(i = 0; i < 50000; i++)
   {
      _NOP();
   }
}

int main()
{
   unsigned char position;
   init_devices();
   while(1)
   {
        for(position = 0; position <= 8; position++)
		{
		   PORTC = ~(1 << (8-position));
		   delay_ms();
		}
   }
}

    

4     思考题:通过GPIO读取按键(SW8)的状态,实现如下功能:单片机刚启动后,跑马灯从右向左循环闪烁,当按下SW8后,跑马灯从左向右循环闪烁,松开SW8后,跑马灯恢复为从右向左循环闪烁,依次类推。请写出相关代码(或描述设计思想)。

//ICC-AVR application builder : 2012-4-19 18:53:34
// Target : M16
// Crystal: 4.0000Mhz

#include <iom16v.h>
#include <macros.h>

void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0xFF; //m103 output only
 DDRC  = 0xFF;
 PORTD = 0x00;
 DDRD  = 0x00;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

delay_ms()
{
   unsigned short i;
   for(i = 0; i < 50000; i++)
   {
      _NOP();
   }
}

int main()
{
   unsigned char position, j;
   init_devices();
   while(1)
   {
       if(!(PIND & (1 << 3)))//判断pind3是否按下
	      j++;//通过j来记录按下sw8的次数,然后通过判断按下为偶数 还是奇数来判断选择什么状态
		  if(j % 2 == 1)
		  { 
              for(position = 0; position <= 8; position++)
		      {
		          PORTC = ~(1 << (position));
		          delay_ms();
		      }
	      }
	   
	      else
	      {
		
	          for(position = 0; position <= 8; position++)
		       {
		          PORTC = ~(1 << (8 - position));
		          delay_ms();
		       }
	      }
    } 
   
}

5 思考题:如何实现,当第一次按下SW8后,跑马灯从左向右循环闪烁,再次按下SW8后,跑马灯从右向左循环闪烁。

 

//ICC-AVR application builder : 2012-4-19 18:53:34
// Target : M16
// Crystal: 4.0000Mhz

#include <iom16v.h>
#include <macros.h>

void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0xFF; //m103 output only
 DDRC  = 0xFF;
 PORTD = 0x00;
 DDRD  = 0x00;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

delay_ms()
{
   unsigned short i;
   for(i = 0; i < 50000; i++)
   {
      _NOP();
   }
}

int main()
{
   unsigned char position;
   init_devices();
   while(1)
   {
       if(!(PIND &= (1 << 3)))//判断其中的pd3是否为0
	   {
           for(position = 0; position <= 8; position++)
		   {
		      PORTC = ~(1 << (position));
		      delay_ms();
		   }
	   }
	   
	   else
	   {
		
	      for(position = 0; position <= 8; position++)
		  {
		     PORTC = ~(1 << (8-position));
		     delay_ms();
		  }
	   }
   }
}





版权所有:《曾巧文博客-关注互联网IT技术,记录生活点滴》 => 《AVR单片机_实验1:单片机基本输入输出实验
本文地址://qiaowen.net/post-1183.html
除非注明,文章均为 《曾巧文博客-关注互联网IT技术,记录生活点滴》 原创,欢迎转载!转载请注明本文地址,谢谢。

有 5061 人浏览,获得评论 0 条

发表评论:

Powered by emlog 粤ICP备12040901号

>>本作品采用-知识共享署名-非商业-禁止演绎-协议-进行许可 |站点地图 | | | | 开放分类目录 |