
一、实验目的
1. 理解单片机定时器的工作原理。
2. 掌握定时器溢出中断实现定时的编程方法。
二、实验内容
1. 验证课堂例题
编译下载运行课堂例题——“T/C0溢出中断”(T0秒表),查看运行结果。理解程序的编程思想和程序执行过程。
2. 设计程序
参考上述例题的电路和编程思路,自行设计电路,包括六位数码管、2个按键,完成数码管显示和按键控制数码管数字累加速度。
具体要求如下:
(1)定时器溢出时间为20ms;
(2)上电复位后,数码管显示“000000”并保持,直到有按键按下;
(3)数码管后两位循环显示0-99;
(4)按下K1键后,数字以每0.5s加1的速度递增;按下K2键后,数字以每1s加1的速度递增。
在设计报告中,需进行总体设计思路描述,给出所涉及到的主程序、中断程序、关键功能子函数的流程图和设计代码。描述程序调试结果及出现的问题。
三、实验结果
1. 在下方贴出使用Proteus绘制的电路原理图。
2. 描述所设计程序的总体设计思路(包括根据任务划分的程序顶层结构、各任务的设计思路、各任务间的数据传递,如何解决关键问题等)
程序顶层结构:程序顶层包含各类头文件,定义相应变量,声明各个函数。
各任务的设计思路:首先编写延迟函数,初始化函数,然后编写数码管刷新函数,定时中断函数,按键检测函数key。
各任务间的数据传递;定时中断函数将定时时长传递给数码管显示函数,显示各时刻的定时值。
关键问题:不改变初值情况下改变定时时长
解决办法:定义一个全局变量count,按键按下改变count的值,以此来改变计时时长。
3.根据所设计的程序顶层结构,对主函数、中断函数(如果没有使用中断可不写)、关键功能子函数的设计思路进行简单描述,并给出各函数的流程图(用Visio画)
主函数:IO初始化,中断初始化,循环按键检测函数以及数码管显示函数。
定时计数器中断函数:TCNT0=21,按键按下后开始计数,计数在数码管后两位显示,在0-99之间循环计数。
按键检测函数:判断PIND端口的返回值来确定是否有按键按下,按键按下就开启中断,通过改变count的值来改变计数器计数时间。
4. 给出(3)中相关函数的实现代码(在ICCAVR中进行编程,以截屏贴图方式放入实验报告中,注意规范性,必须加注释)
//文件包含
#include
#include
//宏定义
#define uchar unsigned char
#define uint unsigned int
//全局变量定义
uchar const DuanXuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴级数码管显示0-9
uchar const WeiXuan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //调用第0-5位数码管亮
uchar LEDBuf[6]={0,0,0,0,0,0}; //存放数码管显示数据,0-9数字格式
uchar sencond_cnt=0; //用于1s计数
uint count=0;
//函数声明
void delay(uint ms); //延时函数
void LEDshow(uchar LEDBuf[6]); //数码管显示函数
void IO_Init(); //IO初始化函数
void Timer0_Init(); //T/C0初始化函数
//主函数
void main();
//中断函数
void Timer0_TOV_ISR(); //T/C0溢出中断服务函数
//通用功能子函数
//**************************************************************************************
//函数名:延时函数
//输入参数:ms
void delay(uint ms) //延时函数
{
uint p,q;
for(p=0;p
4.给出程序调试结果(如程序调试成功,实现所要求功能,需要同时提交ICCAVR文件和Proteus文件;如不能调试成功,请说明错误现象并分析原因)
能完成以下要求:
(1)定时器溢出时间为20ms;
(2)上电复位后,数码管显示“000000”并保持,直到有按键按下;
(3)数码管后两位循环显示0-99;
(4)按下K1键后,数字以每0.5s加1的速度递增;按下K2键后,数字以每1s加1的速度递增。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)