中断与定时计数器Word文档下载推荐.docx
- 文档编号:21116290
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:14
- 大小:247.48KB
中断与定时计数器Word文档下载推荐.docx
《中断与定时计数器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《中断与定时计数器Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
入口参数:
无
函数说明:
(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;
n_ms;
Delay_1_ms();
}
#pragmainterrupt_handlerINT0_isr:
0x02
INT0_isr()//中断后从右向左显示
unsignedcharcnt_i;
SEI();
//全局中断使能
while
(1)
8;
PORTA=(1<
<
cnt_i);
Delay_n_ms(200);
zy()//从左到右显示
for(cnt_i=8;
cnt_i>
0;
cnt_i--)
{
(cnt_i-1));
main()
{CLI();
//关中断
DDRA=0xff;
//方向输出
PORTA=0xFF;
//电平设置
DDRD=0x00;
//方向输入
PORTD=0xFF;
GICR|=(1<
INT0);
//使能外部中断请求0
MCUCR|=(1<
ISC01);
//外部中断请下降沿触发
SEI();
//全局中断使能
zy();
(4)、仿真图
(5)、原理图
(6)、电路板图
2、电子时钟的设计与制作
(1)、任务内容:
利用定时/计数器1溢出中断设计并制作一个电子时钟
电子时钟显示的时间可以用按键进行设置
掌握定时/计数相关寄存器的设置
掌握定时/计数1中相关寄存器使用
进一步掌握1602字符点阵液晶显示模块的使用
进一步掌握独立式键盘的使用
(3)、程序设计
#include"
#defineLCM_RS_1PORTB|=(1<
0)
#defineLCM_RS_0PORTB&
=(~(1<
0))
#defineLCM_RW_1PORTB|=(1<
1)
#defineLCM_RW_0PORTB&
1))
#defineLCM_E_1PORTB|=(1<
2)
#defineLCM_E_0PORTB&
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();
voidDelay_n_us(unsignedintn_us)
n_us;
Delay_1_us();
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_RW_0;
PORTA=cmd_dat;
voidLCM_Wr_DAT(unsignedchardis_dat)
LCM_RS_1;
PORTA=dis_dat;
Delay_n_us(40);
voidLCM_1602_Init(void)
LCM_Wr_CMD(0x38);
Delay_n_ms(5);
LCM_Wr_CMD(0x38);
LCM_Wr_CMD(0x0c);
Delay_n_ms(5);
LCM_Wr_CMD(0x06);
LCM_Wr_CMD(0x01);
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'
);
e'
i'
'
j'
n'
g'
t'
m'
:
LCM_Wr_CMD(0xc0);
LCM_Wr_DAT(LCM_Num_Table[hou_shi]);
LCM_Wr_DAT(LCM_Num_Table[hou_ge]);
LCM_Wr_DAT(LCM_Num_Table[min_shi]);
LCM_Wr_DAT(LCM_Num_Table[min_ge]);
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;
case0xfb:
key_val=3;
case0xf7:
key_val=4;
case0x7f:
key_val=8;
case0xbf:
key_val=7;
case0xdf:
key_val=6;
case0xef:
key_val=5;
default:
key_val=0;
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)
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();
DDRB=0xFF;
PORTB=0xFF;
LCM_1602_Init();
Time1_1sOVR_Init();
while
(1)
key_value=Get_Key_Val();
switch(key_value)
case1:
if(Sys_Time_Hou==24)Sys_Time_Hou=0;
break;
case2:
{Sys_Time_Min++;
if(Sys_Time_Min==60)Sys_Time_Min=0;
}break;
3、频率与占空比可调的PWM波
编程产生一列频率与占空比可调的PWM波,并在显示器上显示出来
掌握定时/计数器1比较匹配输出模式寄存器设置
掌握快速PWM工作模式
#defineSystem_MCU_F4000000
/******************************************************************************
*TC1初始化
*快速PWM频率:
Fpwm=Fsystem/(N×
(1+TOP))
*******************************************************************************/
voidTimer1_PWM_Init(unsignedintf_pwm,unsignedcharoc1a_duty,unsignedcharoc1b_duty)
{
DDRD|=0x30;
//停止TC1工作
//频率设置
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<
COM1A1)+(1<
COM1B1)+(1<
WGM11);
//开始工作,不分频
TCCR1B=(1<
WGM13)+(1<
WGM12)+(1<
CS10);
voidmain(void)
Timer1_PWM_Init(1000,20,80);
附、实物图
四、小结
本项目我们学习了按键控制的LED闪烁,电子时钟的设计与制作,频率与占空比可调的PWM波。
本章课题为ATmega16中断与定时/计数器。
所以就必须掌握什么叫中断、中断向量及外部中断的使用。
利用ATmega16中断控制LED的闪烁的程序编写中,用到了许多的寄存器,如MCU控制寄存器控制与MCU状态寄存器等。
所以要了解与熟悉MCU控制寄存器包含中断促发位与通用MCU功能,如ISC11与ISC10产生不同的中断。
在语句#pragmainterrupt_handlerINT0_isr:
0x02中,函数名是INT0,0x02是中断向量号,它的功能是确定使用哪个中断源。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中断 定时 计数器