基于Atmega16的定时器实验
一、实验目的
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绘制的电路原理图。
图5-1 实验电路图
2. 描述所设计程序的总体设计思路
本程序在主函数中循环刷新数码管,来显示定时器的实时计数值。并编写一个20ms定时器中断函数,在定时器中断函数中设置了一个累加值,每次进入定时器中断中都判断累加值是否达到目标值,如果达到就做相应操作并将累加值清;零。
同时设置了两个按键中断,用于改变定时器中断中的累加值,以实现按键控制500ms,1000ms的递增速度。
3. 根据所设计的程序顶层结构,对主函数、中断函数、关键功能子函数的设计思路进行简单描述,并给出各函数的流程图。
本程序,设置了三个中断,分别为定时器溢出终端,以及两个按键中断。其中两个按键中断用于控制定时器溢出中断中的累加值,来达到500ms和1000ms定时的效果。并编写了一个数码管显示函数来实时显示定时器的计数值。
定时器中断中用于对累加值做处理,在到达了相应的定时条件之后对数码管显示的数组做相应的处理。
在主函数中只需要初始化好相关的外设再循环扫描显示数码管即可显示计数值。
//**************************************************************************************
//文件名:定时器
//功能描述:两位数码管循环显示0~59,进行秒计时
//系统时钟频率12MHz,TC0采用普通模式,定时器溢出时间为10ms,1024分频。
//硬件连接:单片机PD0~PD3接四个独立按键,PA3和PA4分别接两个74HC573锁存器,再接数码管。
//调试状态:正常运行,正常执行功能
//**************************************************************************************//文件包含
#include <iom16v.h>
#include <macros.h>//宏定义
#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计数
uchar number_model;//函数声明
void delay(uint ms); //延时函数
void LEDshow(uchar LEDBuf[6]); //数码管显示函数
void IO_Init(); //IO初始化函数
void Timer0_Init(); //T/C0初始化函数//中断函数
void Timer0_isr(void) ; //T/C0溢出中断服务函数//通用功能子函数
//**************************************************************************************
//函数名:延时函数
//输入参数:ms
void delay(uint ms) //延时函数
{uint p,q;for(p=0;p<ms;p++){for(q=0;q<1141;q++);}
} //数码管模块子函数
//**************************************************************************************
//函数名:数码管显示函数
//功能:在数码管上显示出对应的数字。0-5位数码管显示数据放在LEDBuf[]中,存放0-9数字格式
//输入参数:LEDBuf[]
void LEDshow(uchar LEDBuf[6])
{ uchar i;for(i=0;i<6;i++) //循环扫描一次{ //数码管位选程序PORTB=WeiXuan[i]; //选择第i位数码管PORTA|=BIT(PA4); //PA4输出高电平,位选端拉高PORTA&=~BIT(PA4); //PA4输出低电平,位选端拉低,位选锁存//数码管段选程序 PORTB=DuanXuan[LEDBuf[i]]; //输出段选PORTA|=BIT(PA3); //PA3输出高电平,段选端拉高PORTA&=~BIT(PA3); //PA3输出低电平,段选端拉低,段选锁存 delay(1);}
}//初始化子函数
//**************************************************************************************
//函数名:IO引脚初始化函数
//功能:数码管、锁存器设为输出状态
void IO_Init(void)
{ DDRA|=BIT(PA3); //PA3设置为输出状态DDRA|=BIT(PA4); //PA4设置为输出状态DDRB=0xFF; //PB口设置为输出状态 PORTD = 0XFF; //使能上拉电阻 MCUCR=0x0A; //下降沿INT0,下降沿INT1GICR|=0b11000000; //允许INT0
}//中断初始化函数
void Timer0_Init(void)
{TCCR0=0x05; //普通模式,OC0不输出,1024分频TCNT0=21; //初值为138,定时10msTIFR=0x01; //T/C0溢出标志SREG=0x80;
}//T/C0溢出中断服务函数
//**************************************************************************************
//功能:1s计数,到1s数码管数字个位加一
#pragma interrupt_handler Timer0_TOV_ISR:iv_TIM0_OVFvoid Timer0_TOV_ISR(void)
{TCNT0=50;if(sencond_cnt<number_model) {sencond_cnt++; }else {sencond_cnt=0; LEDBuf[5]++; if(LEDBuf[5]==10) {LEDBuf[5]=0; LEDBuf[4]++; if(LEDBuf[4]==10) {LEDBuf[4]=0; }}}
}void main(void)
{IO_Init(); //调用IO初始化函数Timer0_Init(); //调用中断初始化函数while(1){LEDshow(LEDBuf); }
}#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{TIMSK=0x01; //T/C0溢出中断使能number_model=50;}#pragma interrupt_handler int1_isr:iv_INT1
void int1_isr(void)
{TIMSK=0x01; //T/C0溢出中断使能number_model=25;
}
基于Atmega16的定时器实验相关推荐
- 基于Atmega16的人机交互实验
一.实验目的 1. 掌握多位数码管动态显示编程方法. 2. 掌握矩阵键盘编程方法. 二.实验内容 1. 验证课堂例题 编译下载运行课堂例题--"LED数码管动态显示"(IO_ex4 ...
- 基于Atmega16的GPIO实验(以流水灯为例)
一.实验目的 1. 掌握AVR单片机开发平台的搭建方法. 2. 掌握GPIO的编程方法. 二.实验内容 1. 验证课堂例题 编译下载运行课堂例题--"LED流水灯"和"按 ...
- 51单片机定时器实验(汇编)
基于AT89C51的定时器实验,汇编语言,分享出来是希望各位能共同学习.附上注释希望能认真研究,若有错误请指出,谢谢. 一.实验目的 掌握单片机定时器的使用方法. 掌握中断的使用方法. 二.实验内容 ...
- 基于STM32F103ZET6库函数定时器中断实验
基于STM32F103ZET6库函数定时器中断实验 STM32F1 通用定时器简介 定时器相关的库函数主要集中在固件库文件 stm32f10x_tim.h 和 stm32f10x_tim.c 文件中 ...
- 基于ATMEGA16单片机的空调控制器
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87853101 源码获取 主要内容: ...
- 基于STM32的步进电机实验
目录 基于STM32的步进电机实验 步进电机介绍 步进电机基础知识 步进电机参数说明 例题说明 基于28BYJ步进电机的介绍 28BYJ步进电机的配置流程 电机工作状态与引脚的关系 四相八拍的正向旋转 ...
- 【正点原子MP157连载】第十七章 通用定时器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- 嵌入式STM32--实验三 、通用定时器实验
嵌入式STM32--实验三 .通用定时器实验 一.实验目的 二.实验原理 1.STM32通用定时器概述 2.时基单元 3.工作模式 4.时钟选择 三.实验内容 3.1.结合按键中断和定时器编程实现以下 ...
- linux终端定时器实验报告,定时器实验报告.doc
定时器实验报告 实验六 定时器 / 计数器 一.实验目的 ⒈ 学会8253芯片和微机接口的原理和方法.掌握8253定时器/计数器的工作方式和编程原理. 二.实验内容 用8253的0通道工作在方式3,产 ...
最新文章
- python入门必备10个坑_适合 Python 初学者的一些技巧和坑
- 如何创建计算机视觉场景训练数据
- img should be PIL Image. Got <class ‘numpy.ndarray‘>
- 英伟达收购Mellanox接近尾声,将成英伟达史上最大收购案
- UOJ #149 [NOIP 2015] 子串
- xsl调用java方法传参_Java中的XSL转换:一种简单的方法
- 修改mysql锁空间大小
- 字节跳动自研重度游戏;中国移动前董事长谈飞信失败;Linux 5.3-rc3 发布 | 极客头条...
- 聊天宝解散罗永浩退出;三大运营商回应提速降费;天猫 iPhone XS 最高降 2000 | 极客头条...
- 秩和比RSR法算法C语言,论文:应用EXCEL实现秩和比法的计算及其评价-中大网校论文网...
- 大一计算机期末考试操作题word,Word大一计算机考试操作题
- finalcut剪切快捷键_【FCPX】Final Cut Pro X 常用快捷键大全
- vba手机号码归属_手机号码归属地查询
- dfuse 开放其 EOSIO 堆栈的源代码
- 《Miss Talk》第07期:对话拓课云联合创始人兼CTO 王晓伟
- mathmatica使用入门
- 设置app icon角标
- vs2017 15.5.x dll调试不成功问题
- RFC1945 超文本传输协议--HTTP/1.0 之一
- yolact模型DCNv2模块编译错误解决方法