1单片机外部中断应用
#include "reg51.h"
typedef unsigned int u8;
#define led P2 //整个P2口都被定义为led
sbit k3=P3^2;
sbit k4=P3^3;
void yanshi(u8 z)
{
while(z--);
}
void Int_Init()////外部中断配置
{
EA=1; //打开中断允许总控制位
EX0=1; //外部中断0中断允许位
IT0=1; //设置为脉冲触发,下降沿有效
}
void main() //主函数执行
{
led=0xff; //设置状态为全亮
Int_Init();
while(1); //while(1);是一条指令,它让单片机停在这个位置道
//一般用来检测中断,只有cpu收到中断指令,才会跳出while(1)
//进入中断服务子程序;
}
void int0 () interrupt 0 using 0//2.写此程序的时候要注意中断标准和中断号是否是对应的
{ //这里为外部中断0的中断函数
yanshi(1000);
if(k3==0)
{
led=~led; //这里将小灯的状态反转
}
}
写外部中断时应该看清楚电路图 P32,P33口是外部中断0和1的位置
2蜂鸣器
#include "reg51.h"
sbit fen=P1^5;
sbit k2=P3^0;
void dealy(int x)
{
while(x--);
}
void main()
{
while(1)
{
if(k1==0)//判断按键是否按下
{
dealy(100);
if(k1==0)//判断按键是否按下
{
fen=~fen;//执行蜂鸣器状态的反转,如果按键一直按,那么一直延时反转,就会响
dealy(10);
}
}
}
}
按照开发板的图片来蜂鸣器接的口为p1.5;
1.此时将外部中断与蜂鸣器连起来综合运用
#include "reg51.h"
typedef unsigned int u8;
sbit fen=P1^5;
sbit led=P2^0;
sbit k3=P3^2;
u8 z=0;
void dealy(u8 x)
{
while(x--);
}
void Int_Init()
{
EA=1; //打开中断允许总控制位
EX0=1; //外部中断0中断允许位
IT0=1; //设置为脉冲触发,下降沿有效
}
void main()
{
led=0;
Int_Init(); //调用外部中断的函数
while(1);
}
void int0 () interrupt 0
{
dealy(1000);
if(k3==0)
{
for(z=0;z<10000;z++)
{
fen=~fen;
dealy(10);
}
}
}
此时只需要按下k3将会有大约1s的蜂鸣器的叫声
3.按下k3闪烁不按高四位亮的中断应用
#include "reg51.h"
typedef unsigned int u8;
#define led P2 //定义整个2脚
sbit key=P3^2;
u8 z;
yanshi(u8 x)
{
while(x--);
}
void Int_Init()
{
EA=1;
EX0=1;
IT0=1;
}
void main()
{
led=0xf0;
Int_Init();
while(1);
}
void int0 () interrupt 0 using 0
{
yanshi(1000);
if(key==0)
{
for(z=0;z<8;z++)
{
yanshi(5000);
led=~led;
yanshi(5000);
}
}
}
4.定时器的 一些用法解析
4.定时器中断的一些详解(带程序)
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
u8 wei[3];
sbit LSA = P2^2;//138译码器端口定义
sbit LSB = P2^3;
sbit LSC = P2^4;
u8 code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71}; //0~F数码
u8 ge,shi=0,bai=0,c,z=1;
void delay(u8 x){while(x--);}
void Timer0_Init() //初始化定时器
{
TMOD = 0x01; //定时器0方式1
TH0 = 0;
TL0 = 0; //定时器的计数起点为0
TR0 = 1; //启动定时器0
}
void weishu()//各个位的位数显示
{
wei[0]=smgduan[ge];
wei[1]=smgduan[shi];
wei[2]=smgduan[bai];
}
void xs()//数字显示
{
u8 i;
for(i=0;i<z;i++)
{
switch(i)
{
case 0:
LSC = 0;LSB = 0;LSA = 0;break; //显示第1个数码管
case 1:
LSC = 0;LSB = 0;LSA = 1;break; //显示第2个数码管
case 2:
LSC = 0;LSB = 1;LSA = 0;break; //显示第3个数码管
}
P0=wei[i];//显示0-9的数值
delay(10); //延时,造成视觉暂留现象
P0 = 0x00; //数码管消隐
}
}
void main()
{
Timer0_Init();
while(1)
{
if(TF0 == 1) //检测定时器0是否溢出,每到65535次
{
TF0=0;
c++;
if(c==14) //71ms乘以14为1s
{
c=0;
ge++;
if(ge==10){ge=0;shi++;z=2;}//3个判断分别包含开启3个数码管显示
if(shi==10){shi=0;bai++;}
if(bai>0){z=3;}
}
}
weishu();//调用位数数字
xs();//显示数字
}
}
一个0-999的一秒加数器。
5.利用定时器中断调制输出占空比为0.3的pwm波
#include "reg52.h"
typedef unsigned int u8;
u8 z=0,x=0;
sbit pwm=P2^0;//定义pwm输出口
void Timer1Init()
{
TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
TH1 = 0xFF;
TL1 = 0xff; //1us
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void main()
{
Timer1Init();
while(1)
{
if(z>10000)//一个周期
{
z=0;
x=0;
}
if(x<=3000)//高电平的持续时间
{
pwm=1;
}else//低电平的持续时间
{
pwm=0;
}
}
}
void Time1(void) interrupt 3 //3 为定时器1的中断号
{
TH1 = 0xFF;
TL1 = 0xff; //1us
z++;
x++;
}