手把手教学51单片机 | 第三课之 定时器中断
2022-03-16 来源:eefocus
1. 中断
(1)外部中断
打开总中断EA,选择外部中断EX0或EX1,因为ie可寻址,所以直接对EX0或者EX1操作,然后设置IT0(TCOD中)为电平触发还是跳变沿触发(上电默认寄存器0,为电平触发方式),然后写中断处理函数根据下表优先级确定 interrupt 后面的数字
(2)定时器中断
TMOD是定时器/计数器的工作方式寄存器,
TCON是控制寄存器,控制T0T1的启动和停止及设置溢出标志
如果选用01工作方式,TH TL是16位
2^16=65536
(65536-N)/256相当于一个能装65536的水桶舀出N单位的水,然后每1us加入1单位的水的时间,最后用了5000us=50ms
接下来是TCON的详解
//用定时器代替上节课的延迟子函数
#include #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; uchar num; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void Time0_delay(); void main() { wela=1; P0=0xc0; wela=0; while(1) { for(num=0;num<16;num++) { dula=1; P0=table[num]; dula=0; Time0_delay(); } } } void Time0_delay() { unsigned int i; TMOD&=0xF0;//有效避免打乱高四位 TMOD|=0X01;//最终TMOD= ABCD 0001 for(i=0;i<20;i++) { TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1;//开启定时器 while(!TF0);//延时50ms TF0=0;//溢出位清零 TR0=0;//关闭定时器 //重复20次就是1s } } 3.代码 //中断和定时器的综合运用 #include #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit d1=P1^0; uchar num,tt; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void main() { num=0; tt=0; TMOD=0x01;//设置定时器0为工作方式1 //赋初值 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;//打开总中断 ET0=1;//打开定时器0的中断 TR0=1;//启动定时器0,只要开着就会一直运作 wela=1; P0=0xfe;//第一位数码管 wela=0; dula=1; P0=0x3f;//避免乱码 先赋初值0 dula=0; while(1) { //20次就是1s 进行1次if if(tt==20) { tt=0; num++; if(num==16) num=0;//清零!!! dula=1; P0=table[num]; dula=0; } } } /*void delay(uint z) { uchar x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }*/ void exter0()interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; } 4.总结