找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2448|回复: 17
收起左侧

这个单片机程序是怎么完成中断的?

  [复制链接]
ID:424805 发表于 2018-11-27 08:51 | 显示全部楼层 |阅读模式
#include <STC15F2K60S2.H>
#define u8  unsigned char
#define u16  unsigned int
#define u32  unsigned long
u16 i;
u32 ss;
u8 code table_d[10]= {0x3f,0x06,0x5b,0x4f,0x66,\
                      0x6d,0x7d,0x07,0x7f,0x6f};
u8 code table_w[8] = {0X01,0X02,0X04,0X08,\
                      0X10,0X20,0X40,0X80};
void Timer0Init(void)  //5???@11.0592MHz
{
AUXR |= 0x80;  //????????1T??
TMOD &= 0xF0;  //??????????
TL0 = 0xcd;    //?????????
TH0 = 0xd4;    //?????????
TF0 = 0;    //???TF0???
TR0 = 1;     //?????0??????
IE=0X82;
}
void main(void)
{
      u8 k;
  u8 num[8] = {0};
     P0=0X00;
     P27=0;
  Timer0Init();
  while(1)
  {
  for(k=0;k<8;k++)
  {
      num[0] = table_d[ss%10];
   num[1] = table_d[ss%100/10];
   num[2] = table_d[ss%1000/100];
   num[3] = table_d[ss%10000/1000];
   num[4] = table_d[ss%100000/10000];
   num[5] = table_d[ss%1000000/100000];
   num[6] = table_d[ss%10000000/1000000];
   num[7] = table_d[ss%100000000/10000000];
   P26=0;
      P25=1;
   P0 =num[k];
   P26 = 1;         
   P25 = 0;
   P0 = ~table_w[k];
   }
  }
  }
void Timer0_Rountine(void)  interrupt 1
{
i++;
if(i==1000)
{
i=0;
ss++;
}
}





回复

使用道具 举报

ID:94031 发表于 2018-11-27 09:42 | 显示全部楼层
这程序里有一个定时0中断处理程序,main里开启了这个中断,定时器在内部是硬件系统工作,到定时计数为0时会停止主程序,触发定时0中断处理程序,中断处理完后又回到主程序循环。
回复

使用道具 举报

ID:7485 发表于 2018-11-27 10:23 | 显示全部楼层
正常啊。定时器溢出产生中断。

在“Timer0Init”函数里有“赋初值”,但是中断里面没有再赋初值,那么就是从“0”开始了。估计这一点和编写程序的初衷不一致。
回复

使用道具 举报

ID:255382 发表于 2018-11-27 10:59 | 显示全部楼层
STC15F中断程序是定义16位自动重装,所以在中断程序里面就不用在赋初值了.
回复

使用道具 举报

ID:424805 发表于 2018-11-27 16:30 | 显示全部楼层
xuyaqi 发表于 2018-11-27 09:42
这程序里有一个定时0中断处理程序,main里开启了这个中断,定时器在内部是硬件系统工作,到定时计数为0时会 ...

是这样的,在main里读取到中断初始化完后(THTL在自加,溢出时进入中断函数)进入到whil循环中,当我的中断函数i加到1000时,执行整个中断函数,然后中断返回main中的while循环里。    是不是?
回复

使用道具 举报

ID:424805 发表于 2018-11-27 17:35 | 显示全部楼层
ahshmj 发表于 2018-11-27 10:23
正常啊。定时器溢出产生中断。

在“Timer0Init”函数里有“赋初值”,但是中断里面没有再赋初值,那么就 ...

当执行完在main里的中断初始化后(THTL自加,加满会进入到中断服务程序。)进入到while中,由于我中断服务程序中I=1000才能执行完所有的中断服务程序;没有执行完的话,会中断返回在主程序while中。但是我的数码管为什么会造成中断呢?应该对数码管没有中断啊!
回复

使用道具 举报

ID:424805 发表于 2018-11-27 17:36 | 显示全部楼层
dyjsc 发表于 2018-11-27 10:59
STC15F中断程序是定义16位自动重装,所以在中断程序里面就不用在赋初值了.

当执行完在main里的中断初始化后(THTL自加,加满会进入到中断服务程序。)进入到while中,由于我中断服务程序中I=1000才能执行完所有的中断服务程序;没有执行完的话,会中断返回在主程序while中。但是我的数码管为什么会造成中断呢?应该对数码管没有中断啊!
回复

使用道具 举报

ID:91101 发表于 2018-11-27 23:43 | 显示全部楼层
这个中断是由定时器0(Timer0)产生的,也就是定时器0溢出后,CPU会进入中断处理函数执行(进入的过程中会打断当前的程序执行),中断函数执行完毕后回回到之前的程序断电。
回复

使用道具 举报

ID:434663 发表于 2018-11-28 01:33 | 显示全部楼层
Timer0Init   这个是定时器中断,,,,,
还有是外部中断,,得分清楚
回复

使用道具 举报

ID:434676 发表于 2018-11-28 08:33 | 显示全部楼层

Timer0Init   这个是定时器中断,还有是外部中断,,得分清楚
回复

使用道具 举报

ID:434374 发表于 2018-11-28 08:56 | 显示全部楼层
终端使能,进入中断函数!
回复

使用道具 举报

ID:424805 发表于 2018-11-28 09:31 | 显示全部楼层
zjf0000 发表于 2018-11-28 08:56
终端使能,进入中断函数!

当执行完在main里的中断初始化后(THTL自加,加满会进入到中断服务程序。)进入到while中,由于我中断服务程序中I=1000为定时器1s中断才能去执行完所有的中断服务程序;没有执行完的话,会中断返回在主程序while中。但是我的数码管为什么会造成1s的中断!
回复

使用道具 举报

ID:24900 发表于 2018-11-28 09:32 | 显示全部楼层
使能之后,完成中断就自动会出来的
回复

使用道具 举报

ID:434736 发表于 2018-11-28 09:43 | 显示全部楼层
定时器
回复

使用道具 举报

ID:432823 发表于 2018-11-28 09:44 | 显示全部楼层
zeroL 发表于 2018-11-27 17:36
当执行完在main里的中断初始化后(THTL自加,加满会进入到中断服务程序。)进入到while中,由于我中断服 ...

先分清是要定时中断,还是外部中断,中断号要选择正确。若是定时中断,按程序发生了嵌套中断,51是不能进行的,程序进入死机状态。
回复

使用道具 举报

ID:434735 发表于 2018-11-28 09:51 | 显示全部楼层
void Timer0_Rountine(void)  interrupt 1  这个是中断函数,是一个定时器中断,在“Timer0Init”函数里有“赋初值”
回复

使用道具 举报

ID:214223 发表于 2018-11-28 10:51 | 显示全部楼层
定时器T0中断
回复

使用道具 举报

ID:424805 发表于 2018-11-28 16:15 | 显示全部楼层
谢谢大家,我的问题已经解决了,我没注意it,麻烦了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表