单片机学习资料7.docx
《单片机学习资料7.docx》由会员分享,可在线阅读,更多相关《单片机学习资料7.docx(25页珍藏版)》请在冰豆网上搜索。
单片机学习资料7
七Atmega8单片机训练课题
课题一Atmega8单片机输出端口练习
一、目的:
1、掌握用C语言定义AVR单片机引脚的输出功能;
2、熟悉用二进制计数的方法;
3、初步了解用AVRStudio4模拟调试AVR应用程序;
4、初步掌握用ISIS软件仿真电路;
二、要求:
用Atmega8单片机PB0、PB2、PB3三个I/O口,点亮相应的发光二极管。
三、仿真电路图:
图7-1
图7-1
四、实训内容和步骤:
1、用ICCAVR编辑、编译下列C程序:
/*******************************************************
项目:
ATmega8单片机输出端口练习
芯片类型:
ATmega8
时钟:
8.000MHz
作者:
刘天旺
功能:
点亮PB0、PB1、PB2口的发光二极管
*******************************************************/
#include//调用Tmega8寄存器头文件
/*******************************************************
主函数
*******************************************************/
voidmain()
{
DDRB=0B00000111;//定义PB0-PB2为输出
while
(1)//循环运行
PORTB=0B00000111;//PB0-PB2输出高电平
}
2、用AVRStudio4模拟调试上述程序。
3、利用ISIS软件,根据图7-1画出仿真电路,并将编译正确的、后缀为.cof的程序烧录后进行仿真。
四、讨论题:
1、利用ICCAVR编辑C程序时,每条语句后的“;”是在英文状态输入,还是在中文状态输入。
如果改为在中文状态输入,结果是怎样的?
2、在第一次编译程序时,提示栏给你提出了哪些错误提示,你是如何解决的?
3、如何编辑一C程序,PB1、PB3、PB5、PB7上的发光二极管。
课题二Atmega8单片机输入端口练习
一、目的:
1、掌握用C语言定义AVR单片机引脚的输入功能,并理解打开上拉电阻的含义;
2、理解if…else条件判断语句;
3、初步掌握用AVRStudio4模拟调试AVR应用程序;
4、掌握用ISIS软件仿真电路;
二、要求:
按住S1,D1点亮;松开S1,D1熄灭。
三、仿真电路图:
图7-1
四、实训内容和步骤:
1、用ICCAVR编辑、编译下列C程序:
/*******************************************************
项目:
ATmega8单片机输入端口练习
芯片类型:
ATmega8
时钟:
8.000MHz
作者:
刘天旺
功能:
按住S1,D1点亮;松开S1,D1熄灭
*******************************************************/
#include//调用Tmega8寄存器头文件
/*******************************************************
主函数
*******************************************************/
voidmain()
{
DDRB=0B00000001;//定义PB0为输出
DDRD=0B00000000;//定义PD0-PD7为输入
PORTD=0B00000100;//打开PD2的上拉
while
(1)//循环运行
{
if((PIND&0B00000100)==0B00000000)//判断S1是否按住
PORTB|=0B00000001;//如果按住,PB0输出高电平
else//否则
PORTB&=0B11111110;//PB0输出低电平
}
}
2、用AVRStudio4模拟调试上述程序。
3、利用ISIS软件,对上述程序进行仿真。
四、讨论题:
1、在利用AVRStudio4软件单步调试过程中,如何处理if((PIND&0B00000100)==0B00000000),才能使调试过程按要求顺利完成?
2、编译程序时,提示栏给你提出了哪些错误提示,你是如何解决的?
课题三自锁控制
一、目的:
1、理解算法的概念,基本掌握用流程图表示算法以及用流程图指导编程;
2、理解while循环语句以及它与if条件判断语句的异同;
3、逐步引导学生利用弱电控制强电;
二、要求:
按一下S1,即使松手后,D1一直被点亮,只有等到按一下S2后,D1才熄灭。
这里,S1相当于电力拖动控制线路中的启动按钮,S2相当于停止按钮。
三、仿真电路图:
图7-1
四、实训内容和步骤:
1、画出实现上述功能的流程图;
2、根据所画的流程图编辑、编译C程序:
/*******************************************************
项目:
自锁控制
芯片类型:
ATmega8
时钟:
8.000MHz
作者:
刘天旺
功能:
按一下S1,D1一直被点亮,直到按以下S2,D1才熄灭
*******************************************************/
#include//调用Tmega8寄存器头文件
/*******************************************************
系统初始化函数
*******************************************************/
voidsys_init(void)
{
DDRB=0X01;//定义PB0为输出
PORTB=0X00;//PB0输出低电平
DDRD=0X00;//定义PD0-PD7为输入
PORTD=0X0C;//打开PD2-PD3上拉
}
/*******************************************************
主函数
*******************************************************/
voidmain()
{
sys_init();//调用初始化函数
while
(1)//循环运行
{
if((PIND&0X04)==0X00)//判断S1是否按下
PORTB=0X01;//如果按下PB0输出高电平
while((PIND&0X08)==0X00)//当S2按下
PORTB=0X00;//PB0输出低电平
}
}
2、用AVRStudio4模拟调试上述程序。
3、利用ISIS软件,对上述程序进行仿真。
4、将后缀为.hex的程序烧录到实验板上,分别按S1和S2,验证能否达到自锁的目的。
5、检查无误后驳接到电拖板,在教师指导下通电测试。
四、讨论题:
1、如果将程序中的while改为if,情况怎样?
2、编译程序时,提示栏给你提出了哪些错误提示,你是如何解决的?
课题四联锁正反转控制
一、目的:
1、进一步学习用流程图表示算法以及用流程图指导编程;
2、进一步理解while循环语句;
二、要求:
按一下S1,D1被点亮(正转);按一下S2后,D2被点亮(反转);按一下S3,D1、D2均熄灭(停止)。
三、仿真电路图:
图7-1
四、实训内容和步骤:
1、用ICCAVR编辑、编译下列C程序:
/*******************************************************
项目:
联锁正反转控制
芯片类型:
ATmega8
时钟:
8.000MHz
作者:
刘天旺
功能:
按一下S1,D1被点亮(正转);按一下S2,D2被点亮(反转);按一下S,D1、D2均熄灭(停止)。
*******************************************************/
#include//调用Tmega8寄存器头文件
/*******************************************************
系统初始化函数
*******************************************************/
voidsys_init(void)
{
DDRB=0X03;//定义PB0、PB1为输出
PORTB=0X00;//PB0、PB1输出低电平
DDRD=0X00;//定义PD0-PD7为输入
PORTD=0X1C;//打开PD2-PD4上拉
}
/*******************************************************
主函数
*******************************************************/
voidmain()
{
sys_init();//调用初始化函数
while
(1)//循环运行
{
while((PIND&0X10)==0X00)//当S3按下
PORTB=0X00;//PB0、PB1输出低电平
while((PIND&0X04)==0X00)//当S1按下
{
if((PIND&0X04)==0X00)//如果S1按下
PORTB=0X01;//PB0输出高电平
while((PIND&0X10)==0X00)//当S3按下
PORTB=0X00;//PB0-PB7输出低电平
}
while((PIND&0X08)==0X00)//当S2按下
{
if((PIND&0X08)==0X00)//如果S2按下
PORTB=0X02;//PB1输出高电平
while((PIND&0X10)==0X00)//当S3按下
PORTB=0X00;//PB0-PB7输出低电平
}
}
}2、用AVRStudio4模拟调试上述程序。
3、利用ISIS软件,对上述程序进行仿真。
4、将后缀为.hex的程序烧录到实验板上,分别按S1、S2、S3,进行验证。
5、检查无误后驳接到电拖板,在教师指导下通电测试。
四、讨论题:
1、你能否编写出更加优化的程序?
2、编译程序时,提示栏给你提出了哪些错误提示,你是如何解决的?
课题五延时闪烁控制(软件延时)
一、目的:
1、正确理解for循环语句;
2、掌握C语言定义及调用延时函数的方法;
二、要求:
通电后,D1-D7延时闪烁。
三、仿真电路图:
图7-1
四、实训内容和步骤:
1、用ICCAVR编辑、编译下列C程序:
/*******************************************************
项目:
延时闪烁控制
芯片类型:
ATmega8
时钟:
8.000MHz
作者:
刘天旺
功能:
通电后,D1—D7延时闪烁。
*******************************************************/
#include//调用Tmega8寄存器头文件
/*******************************************************
系统初始化函数
*******************************************************/
voidsys_init(void)
{
DDRB=0XFF;//定义PB0-PB7为输出
PORTB=0X00;//PB0-PB7输出低电平
}
/*******************************************************
延时函数
*******************************************************/
voiddelay(void)
{
inti,j;
for(i=0;i<500;i++)
for(j=0;j<1000;j++);
}
/*******************************************************
主函数
*******************************************************/
voidmain()
{
sys_init();//调用初始化函数
while
(1)//循环运行
{
PORTB=0XFF;//PB0-PB7输出高电平,点亮D1-D7
delay();//调用延时函数
PORTB=0X00;//PB0-PB7输出低电平,关闭D1-D7
delay();//调用延时函数
}
}
2、用AVRStudio4模拟调试上述程序(为提高仿真效率,在仿真之间先将延迟时间缩短)。
3、利用ISIS软件,对上述程序进行仿真。
四、讨论题:
1、如何调整LED闪烁的快慢?
2、调用延时函数时,将其改为“Delay();”,编译时会产生什么现象。
3、编译程序时,提示栏给你提出了哪些错误提示,你是如何解决的?
课题六广告灯控制
一、目的:
1、掌握C语言按位移动的定义方式;
2、巩固C语言软件延时的定义方法;
二、要求:
通电后,D1-D7先从右到左依次产生亮、灭变化,然后从左到右依次产生亮、灭变化,如此循环。
三、仿真电路图:
图7-1
四、实训内容和步骤:
1、用ICCAVR编辑、编译下列C程序:
/*******************************************************
项目:
广告灯控制
芯片类型:
ATmega8
时钟:
8.000MHz
作者:
刘天旺
功能:
通电后,D1-D7先从右到左依次产生亮、灭变化,然后从左到右依次产生亮、灭变化,如此循环。
*******************************************************/
#include//调用Tmega8寄存器头文件
/*******************************************************
系统初始化函数
*******************************************************/
voidsys_init(void)
{
DDRB=0XFF;//定义PB0-PB7为输出
PORTB=0X00;//PB0-PB7输出低电平
}
/*******************************************************
延时函数(延迟约0.1秒)
*******************************************************/
voiddelay(void)
{
inti,j;//定义两个整形变量
for(i=0;i<500;i++)
for(j=0;j<1000;j++);
}
/*******************************************************
LED点亮函数
*******************************************************/
voidLED_ON(inta)
{
PORTB=(0X01<delay();//调用延时函数
}
/*******************************************************
主函数
*******************************************************/
voidmain()
{
inti;//定义一个整形变量
sys_init();//调用系统初始化函数
while
(1)//循环运行
{
for(i=0;i<8;i++)//左移8次
LED_ON(i);//调用LED点亮函数
for(i=8;i>0;i--)//右移8次
LED_ON(i);//调用LED点亮函数
}
}
2、用AVRStudio4模拟调试上述程序(为提高仿真效率,在仿真之间先将延迟时间缩短)。
3、利用ISIS软件,对上述程序进行仿真。
四、讨论题:
1、试编写先从左到右,然后从右到左循环变化的流水广告等控制程序?
2、编译程序时,提示栏给你提出了哪些错误提示,你是如何解决的?
课题七0-99循环显示控制
一、目的:
1、进一步学习用流程图表示算法以及用流程图指导编程;
2、进一步理解while循环语句;
二、要求:
通电后,两位数码管循环显示0-99。
三、仿真电路图:
图7-2
图7-2
四、实训内容和步骤:
1、用ICCAVR编辑、编译下列C程序:
/*******************************************************
项目:
0-99循环显示控制
芯片类型:
ATmega8
时钟:
8.000MHz
作者:
刘天旺
功能:
通电后,两位数码管循环显示0-99
*******************************************************/
#include//调用Tmega8寄存器头文件
#pragmadata:
code//声明定义一个BCD字型表
constunsignedtabs[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90};
#pragmadata:
data//声明定义一个数组
unsignedcharledbuff[2]={0,0};
/*******************************************************
系统初始化函数
*******************************************************/
voidsys_init(void)
{
DDRB=0XFF;//定义PB0-PB7为输出
DDRC=0X03;//定义PC0-PC1为输出
}
/*******************************************************
延时函数(大约延迟4ms)
*******************************************************/
voiddelay(void)
{
inti,j;//定义两个整形变量
for(i=0;i<4;i++)//两个for循环嵌套,大约消耗4ms
for(j=0;j<1000;j++);
}
/*******************************************************
数码管刷新显示
*******************************************************/
voidled_display(void)
{
unsignedchari;//定义一个无符号字符型变量
for(i=0;i<2;i++)
{
PORTB=tabs[ledbuff[i]];//从BCD字型码中查表
PORTC=(0X01<
delay();//调用延时函数
PORTC=0X00;//关闭显示
}
}
/*******************************************************
主函数
*******************************************************/
voidmain(void)
{
inti=0;//定义一个整形变量i
sys_init();//调用系统初始化函数
while
(1)//循环运行
{
i++;
ledbuff[0]=i%10;//i除以10的余数位赋给ledbuff[0]
ledbuff[1]=i/10;//i除以10的整数位赋给ledbuff[1]
if(i>99)//判断I是否大于99
{
i=0;//如果i>99,则i、ledbuff[0]、ledbuff[1]清零
ledbuff[0]=0;
ledbuff[1]=0;
}
led_display();//调用数码管显示函数
}
}
2、用AVRStudio4模拟调试上述程序。
3、利用ISIS软件,对上述程序进行仿真。
四、讨论题:
1、试编写0—9999循环显示的控制程序。
2、编译程序时,提示栏给你提出了哪些错误提示,你是如何解决的?
课题八中断实验
一、目的:
1、掌握中断的概念。
2、初步掌握利用C语言定义中断的方法;
二、要求:
通电后,D1-D7全部被点亮;当按住S1时,只有D1、D3、D5、D7被点亮;松开S1后,又全部被点亮。
三、仿真电路图:
图7-1
四、实训内容和步骤:
1、用ICCAVR编辑、编译下列C程序:
/*******************************************************
项目:
中断实验
芯片类型:
ATmega8
时钟:
8.000MHz
作者:
刘天旺
功能:
通电后,D1-D7全部被点亮;当按住S1时,只有D1、D3、D5、D7被点亮;松开S1后,又全部被点亮(使用外部中断INT0)。
*******************************************************/
#include//调用Tmega8寄存器头文件
#include//调用Tmega8寄存器头文件
/*******************************************************
系统初始化函数
*******************************************************/
voidsys_init(void)
{
DDRB=0Xff;//定义PB0—PB1为输出
PORTB=0Xff;//PB0-PB7输出高电平
DDRD=0X00;//定义D0-PD7输入
PORTD=0X04;//打开PD2内部上拉
GICR=0X40;//外部中断INT0使能
SEI();//全局中断使能
}
/************************************