登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 单片机中断应用

[复制链接]
发表于 2018-1-30 21:53:46 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机基础
学习安排: 学会使用单片机中断
开始时间: 2018-01-30
结束时间:
  废话不多说,直接进入正题。
  今天学会了使用单片机的中断功能,从而制成较为精准的计数器。所谓中断其实也是利用了单片机的定时器机制,
打开中断后硬件自动检测TF0(或TF1)的值,如果TF0=1,则自动进入编写好的中断函数,注意和定时器使用的最
大差别便是当TF0=1之后定时器应用需要软件置0,而中断应用是则由硬件自动置0。
  由于使用中断仍然需要定时器的功能,所以需要打开定时器,另外还有几个寄存器需要配置
IE1I%T@MDB244[D$BF]{ZCF.png
通过查询单片机手册得知在使用中断前需要配置EA和ET0根据数据手册说明,如果想使用T0中断,则必须使EA=1(
打开中断总开关)ET0=1(打开T0中断开关)然后再打开相应的定时器开关和配置好相应的TH0 和Tlingit0的值即可

还有一点需要注意就是中断函数的写法,定义中断函数后需要在后面加一句 interrupt x  这个x是根据向量地址算得的
算法是 x*8+3=向量地址  T0中断的向量地址是:0x000B  T1中断的向量地址是:0x001B .根据以上分析,便可写出
一个利用中断函数的单片机程序了。

。。。
 楼主| 发表于 2018-1-30 21:55:27 | 显示全部楼层
下面是一个动态数码管计时器的程序
#include <stc12c5a60s2.h>

sbit ENLED = P1^1;

unsigned char code LedChar[] = {
        0xc0,0xf9,0xa4,0xb0,0x99,
        0x92,0x82,0xf8,0x80,0x90};
unsigned char LedBuff[] = {
        0xff,0xff,0xff,0xff,0xff,0xff};

unsigned char i = 0;
unsigned int cnt = 0;
unsigned char flagls = 0;
       
void main()
{
        unsigned long sec = 0;
       
        AUXR = 0x80;
        ENLED = 0;
        TMOD = TMOD & 0xf0;
        TMOD = TMOD | 0x01;
        TH0 = 0x83;
        TL0 = 0x00;
        TR0 = 1;
        EA = 1;
        ET0 = 1;
        while(1)
        {
                if(flagls == 1)
                {
                        flagls = 0;
                        sec ++;
                        LedBuff[0] = LedChar[sec%10];
                        LedBuff[1] = LedChar[sec/10%10];
                        LedBuff[2] = LedChar[sec/100%10];
                        LedBuff[3] = LedChar[sec/1000%10];
                        LedBuff[4] = LedChar[sec/10000%10];
                        LedBuff[5] = LedChar[sec/100000%10];
                }
        }
}

void InterrupuTimer0() interrupt 1
{
        TH0 = 0x83;
        TL0 = 0x00;
        cnt ++;
        if (cnt >= 1000)
        {
                cnt = 0;
                flagls = 1;
        }
        P0 = 0xff;
        P2 = 0xfd-i;
        P0 = LedBuff[i];
        if(i<5)
                i++;
        else
                i = 0;
}
。。。
发表于 2018-1-31 00:49:25 | 显示全部楼层

RE: 单片机中断应用

        AUXR = 0x80;
        ENLED = 0;
        TMOD = TMOD & 0xf0;
        TMOD = TMOD | 0x01;
麻烦能不能讲一下这个是什么意思
好懒~~不想说~~~
 楼主| 发表于 2018-1-31 15:20:46 | 显示全部楼层
若水三千饮 发表于 2018-1-31 00:49
AUXR = 0x80;
        ENLED = 0;
        TMOD = TMOD & 0xf0;

AUXR是辅助寄存器是用来调节单片机定时器速率的,AUXR=0X80是1T模式,
。。。
 楼主| 发表于 2018-1-31 15:22:57 | 显示全部楼层
若水三千饮 发表于 2018-1-31 00:49
AUXR = 0x80;
        ENLED = 0;
        TMOD = TMOD & 0xf0;

TMOD=TMOD&0xf0,TMOD=TOMD|0x01 这两句实际上就是TMOD=0x01。但是这样写不会影响T1定时器的应用,算是算法的升级吧
。。。
发表于 2018-1-31 21:44:10 | 显示全部楼层
Hero丶 发表于 2018-1-31 15:22
TMOD=TMOD&0xf0,TMOD=TOMD|0x01 这两句实际上就是TMOD=0x01。但是这样写不会影响T1定时器的应用,算是算 ...

写0x01不能运行嘛
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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