中断与定时计数器.docx
- 文档编号:7980013
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:14
- 大小:247.48KB
中断与定时计数器.docx
《中断与定时计数器.docx》由会员分享,可在线阅读,更多相关《中断与定时计数器.docx(14页珍藏版)》请在冰豆网上搜索。
中断与定时计数器
项目二:
ATmege16中断与定时/计数器
一、项目内容:
(1)、使用外部中断,实现按键控制LED亮灯
(2)、利用定时/计数器1实现电子时钟的设计与制作
(3)、利用定时/计数器1实现频率与占空比可调的PWM波形输出
二、项目目标:
(1)、掌握中断概念
(2)、掌握中断向量
(3)、掌握外部中断的使用
(4)、掌握定时/计数器1的使用
(5)、进一步熟悉C语言的编程技巧
三、项目任务:
1、按键控制的LED闪烁
(1)、任务内容:
根据外部中断的特点设计按键控制LED闪烁的电原理图
根据原理图使用万能板制作电路
编程实现按键控制LED闪烁
(2)、任务目标:
掌握外部中断寄存器的设置
进一步掌握I/O口的使用
(3)程序设计
#include"iom16v.h"//ICCAVR环境下的ATmega16库函数定义了所有的寄存器及其位的标号
#include"macros.h"
/**************************************************************************************
函数功能:
延时1ms(4M晶振,0.25微秒的指令执行周期)
入口参数:
无
函数说明:
(3×cnt_j+2)×cnt_i=(3×33+2)×40*0.25=1010(微秒),可以近似认为是1毫秒
***************************************************************************************/
voidDelay_1_ms(void)
{
unsignedcharcnt_i,cnt_j;
for(cnt_i=0;cnt_i<40;cnt_i++)
{
for(cnt_j=0;cnt_j<33;cnt_j++)
{
}
}
}
/**************************************************************************************
函数功能:
延时若干毫秒
入口参数:
n_ms
***************************************************************************************/
voidDelay_n_ms(unsignedintn_ms)
{
unsignedintcnt_i;
for(cnt_i=0;cnt_i { Delay_1_ms(); } } #pragmainterrupt_handlerINT0_isr: 0x02 INT0_isr()//中断后从右向左显示 { unsignedcharcnt_i; SEI();//全局中断使能 while (1) { for(cnt_i=0;cnt_i<8;cnt_i++) { PORTA=(1< Delay_n_ms(200); } } } zy()//从左到右显示 { unsignedcharcnt_i; while (1) { for(cnt_i=8;cnt_i>0;cnt_i--) { PORTA=(1<<(cnt_i-1)); Delay_n_ms(200); } } } main() {CLI();//关中断 DDRA=0xff;//方向输出 PORTA=0xFF;//电平设置 DDRD=0x00;//方向输入 PORTD=0xFF; GICR|=(1< MCUCR|=(1< SEI();//全局中断使能 zy(); } (4)、仿真图 (5)、原理图 (6)、电路板图 2、电子时钟的设计与制作 (1)、任务内容: 利用定时/计数器1溢出中断设计并制作一个电子时钟 电子时钟显示的时间可以用按键进行设置 (2)、任务目标: 掌握定时/计数相关寄存器的设置 掌握定时/计数1中相关寄存器使用 进一步掌握1602字符点阵液晶显示模块的使用 进一步掌握独立式键盘的使用 (3)、程序设计 #include"iom16v.h" #include"macros.h" #defineLCM_RS_1PORTB|=(1<<0) #defineLCM_RS_0PORTB&=(~(1<<0)) #defineLCM_RW_1PORTB|=(1<<1) #defineLCM_RW_0PORTB&=(~(1<<1)) #defineLCM_E_1PORTB|=(1<<2) #defineLCM_E_0PORTB&=(~(1<<2)) unsignedcharSys_Time_Hou=23,Sys_Time_Min=59,Sys_Time_Sec=55; unsignedcharLCM_Num_Table[]={'0','1','2','3','4','5','6','7','8','9'}; voidDelay_1_us(void) { NOP(); NOP(); NOP(); NOP(); } voidDelay_n_us(unsignedintn_us) { unsignedintcnt_i; for(cnt_i=0;cnt_i { Delay_1_us(); } } voidDelay_1_ms(void) { unsignedcharcnt_i,cnt_j; for(cnt_i=0;cnt_i<40;cnt_i++) { for(cnt_j=0;cnt_j<33;cnt_j++) { } } } voidDelay_n_ms(unsignedintn_ms) { unsignedintcnt_i; for(cnt_i=0;cnt_i { Delay_1_ms(); } } unsignedcharLCM_Re_BAC() { unsignedcharstatus; DDRA=0x00; LCM_RS_0; LCM_RW_1; LCM_E_1; Delay_n_us (1); status=PINA; LCM_E_0; returnstatus; } voidLCM_Wr_CMD(unsignedcharcmd_dat) { while(LCM_Re_BAC()>=0x80); DDRA=0xFF; LCM_RS_0; LCM_RW_0; LCM_E_1; PORTA=cmd_dat; Delay_n_us (1); LCM_E_0; } voidLCM_Wr_DAT(unsignedchardis_dat) { while(LCM_Re_BAC()>=0x80); DDRA=0xFF; LCM_RS_1; LCM_RW_0; LCM_E_1; PORTA=dis_dat; Delay_n_us (1); LCM_E_0; Delay_n_us(40); } voidLCM_1602_Init(void) { LCM_Wr_CMD(0x38);Delay_n_ms(5); LCM_Wr_CMD(0x38); Delay_n_ms(5); LCM_Wr_CMD(0x38); Delay_n_ms(5); LCM_Wr_CMD(0x0c); Delay_n_ms(5); LCM_Wr_CMD(0x06); Delay_n_ms(5); LCM_Wr_CMD(0x01); Delay_n_ms(5); } voidLCM_Show_Time(unsignedchartime_hou,unsignedchartime_min,unsignedchar time_sec) { unsignedcharhou_shi,hou_ge,min_shi,min_ge,sec_shi,sec_ge; hou_shi=time_hou/10; hou_ge=time_hou%10; min_shi=time_min/10; min_ge=time_min%10; sec_shi=time_sec/10; sec_ge=time_sec%10; LCM_Wr_CMD(0x80); LCM_Wr_DAT('B'); LCM_Wr_DAT('e'); LCM_Wr_DAT('i'); LCM_Wr_DAT(''); LCM_Wr_DAT('j'); LCM_Wr_DAT('i'); LCM_Wr_DAT('n'); LCM_Wr_DAT('g'); LCM_Wr_DAT(''); LCM_Wr_DAT('t'); LCM_Wr_DAT('i'); LCM_Wr_DAT('m'); LCM_Wr_DAT('e'); LCM_Wr_DAT(': '); LCM_Wr_CMD(0xc0); LCM_Wr_DAT(LCM_Num_Table[hou_shi]); LCM_Wr_DAT(LCM_Num_Table[hou_ge]); LCM_Wr_DAT(': '); LCM_Wr_DAT(LCM_Num_Table[min_shi]); LCM_Wr_DAT(LCM_Num_Table[min_ge]); LCM_Wr_DAT(': '); LCM_Wr_DAT(LCM_Num_Table[sec_shi]); LCM_Wr_DAT(LCM_Num_Table[sec_ge]); } unsignedcharGet_Key_Val() { unsignedcharkey_val; key_val=PIND; do { Delay_n_ms(4); } while(key_val==PIND); switch(key_val) { case0xfe: key_val=1;break; case0xfd: key_val=2;break; case0xfb: key_val=3;break; case0xf7: key_val=4;break; case0x7f: key_val=8;break; case0xbf: key_val=7;break; case0xdf: key_val=6;break; case0xef: key_val=5;break; default: key_val=0;break; } returnkey_val; } voidTime1_1sOVR_Init(void) { TCCR1B=0x00; TCNT1H=0xF0; TCNT1L=0xBE; TIMSK=0x04; TCCR1A=0x00; TCCR1B=0x05; } #pragmainterrupt_handlerTimer1_1sOVF_Isr: 9 voidTimer1_1sOVF_Isr(void) { TCNT1H=0xF0; TCNT1L=0xBE; Sys_Time_Sec++; if(Sys_Time_Sec==60) { Sys_Time_Sec=0; Sys_Time_Min++; if(Sys_Time_Min==60) { Sys_Time_Min=0; Sys_Time_Hou++; if(Sys_Time_Hou==24) { Sys_Time_Hou=0; } } } LCM_Show_Time(Sys_Time_Hou,Sys_Time_Min,Sys_Time_Sec); } voidmain(void) { unsignedcharkey_value; CLI(); DDRA=0xFF; PORTA=0xFF; DDRB=0xFF; PORTB=0xFF; DDRD=0x00; PORTD=0xFF; LCM_1602_Init(); Time1_1sOVR_Init(); SEI();LCM_Show_Time(Sys_Time_Hou,Sys_Time_Min,Sys_Time_Sec); while (1) { key_value=Get_Key_Val(); switch(key_value) { case1: { Sys_Time_Hou++; if(Sys_Time_Hou==24)Sys_Time_Hou=0; } break; case2: {Sys_Time_Min++; if(Sys_Time_Min==60)Sys_Time_Min=0; }break; } } } (4)、仿真图 (5)、原理图 (6)、电路板图 3、频率与占空比可调的PWM波 (1)、任务内容: 编程产生一列频率与占空比可调的PWM波,并在显示器上显示出来 (2)、任务目标: 掌握定时/计数器1比较匹配输出模式寄存器设置 掌握快速PWM工作模式 (3)、程序设计 #include"iom16v.h"//ICCAVR环境下的ATmega16库函数定义了所有的寄存器及其位的标号 #include"macros.h" #defineSystem_MCU_F4000000 /****************************************************************************** *TC1初始化 *快速PWM频率: Fpwm=Fsystem/(N×(1+TOP)) *******************************************************************************/ voidTimer1_PWM_Init(unsignedintf_pwm,unsignedcharoc1a_duty,unsignedcharoc1b_duty) { DDRD|=0x30; //停止TC1工作 TCCR1B=0x00; //频率设置 ICR1=(unsignedint)(System_MCU_F/f_pwm-1); //占空比设置 OCR1A=(unsignedint)((System_MCU_F/100)*oc1a_duty/f_pwm-1); OCR1B=(unsignedint)((System_MCU_F/100)*oc1b_duty/f_pwm-1); /*WGM位组合: 14,ICR为TOP*/ //比较匹配时清0,TOP时置1 TCCR1A=(1< //开始工作,不分频 TCCR1B=(1< } voidmain(void) { Timer1_PWM_Init(1000,20,80); } (4)、仿真图 附、实物图 四、小结 本项目我们学习了按键控制的LED闪烁,电子时钟的设计与制作,频率与占空比可调的PWM波。 本章课题为ATmega16中断与定时/计数器。 所以就必须掌握什么叫中断、中断向量及外部中断的使用。 利用ATmega16中断控制LED的闪烁的程序编写中,用到了许多的寄存器,如MCU控制寄存器控制与MCU状态寄存器等。 所以要了解与熟悉MCU控制寄存器包含中断促发位与通用MCU功能,如ISC11与ISC10产生不同的中断。 在语句#pragmainterrupt_handlerINT0_isr: 0x02中,函数名是INT0,0x02是中断向量号,它的功能是确定使用哪个中断源。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中断 定时 计数器
![提示](https://static.bdocx.com/images/bang_tan.gif)