加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Interrupt(单片机中断)

(2012-04-14 01:06:15)
标签:

单片机中断

分类: [01]单片机

    所有的中断(外部中断,定时器中断……)运行的结果都是一样的:流水灯逐个点亮,当中断响应的时候,流水灯全部熄灭,当中断结束的时候,流水灯继续刚才的流动。 

    proteus原理图:

http://s15/middle/a05b986dgbd938a93b6be&690

1.外部中断:

  代码:

#include<reg52.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp;                      //声明一个全局变量
void delay(uint delay_time);
void main()
{
 EA=1;    //开总中断
 EX0=1;   //开外部中断0
 IT0=0;   //设置有效方式为低电平有效
 while(1)
 {
  uint i;
  P0=0XFE;
  delay(1000);
  for(i=0;i<7;i++)
  {
   P0=P0<<1;
   delay(1000);
  }
  P0=0xff;
  delay(1000);
 }
}

void delay(uint delay_time)
{
 uint x,y;
 for(x=delay_time;x>0;x--)
  for(y=112;y>0;y--)
  {;}
}

void INTERRUPT() interrupt 0   //中断后执行内容(这个不用声明)
{
 EA=0;
 temp=P0;             //temp做传递变量,保证中断结束后继续中断发生时的操作
 P0=0xff;
 delay(1000);
 P0=temp;
 EA=1;
}
proteus仿真结果:

http://s15/middle/a05b986dgbd93b7141ade&690
http://s10/middle/a05b986dgbd93c08e54e9&690
http://s7/middle/a05b986dgbd93ce8eb8b6&690

    

2.定时器中断

代码:

#include<reg52.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
uint n;                           //全局变量
uchar code table_led[]={         //这个亮灯的16进制码
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0xff};
void main()
{
 n=0;
 TH0=(65536-20000)/256;          //赋初值
 TL0=(65536-20000)%6;
 TMOD=0X01;                     //设置工作方式为工作方式1(16位计数器) 

 EA=1;                          //开总中断
 ET0=1;                         //开定时器中断0
 TR0=1;                         //启动定时器中断0
 while(1)
 {
  switch(n/50)                   //没20ms一次中断,20*50=1s
  {
   case 0: P0=table_led[8]; break;
   case 1: P0=table_led[0]; break;
   case 2: P0=table_led[1]; break;
   case 3: P0=table_led[2]; break;
   case 4: P0=table_led[3]; break;
   case 5: P0=table_led[8]; break;
   case 6: P0=table_led[4]; break;
   case 7: P0=table_led[5]; break;
   case 8: P0=table_led[6]; break;
   case 9: P0=table_led[7]; break;
  
 }
}

 

void INTERRUPT( )  interrupt 1
{
 TH0=(65536-20000)/256;
 TL0=(65536-20000)%6;
 n++;
 if(n==500)
 n=0;
}



 

 

   

0

阅读 收藏 喜欢 打印举报/Report
前一篇:running_nixietube
后一篇:单片机寄存器
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有