您的位置 首页 新能源

单片机完成一分钟定时器功用的规划

单片机实现一分钟定时器功能的设计-2个定时中断,2个按钮中断

#include

#define SEG P2 //数码管 断码口

#define SCANP P1 //数码管 com扫描口

sbit OC = P0^0; //定义573锁存器使能口,我是用的573驱动7段数码管

sbit PB0=P3^2; //按钮0

sbit PB1=P3^3; //按钮1

2个守时中止,2个按钮中止

#include

#define SEG P2 //数码管 断码口

#define SCANP P1 //数码管 com扫描口

sbit OC = P0^0; //界说573锁存器使能口,我是用的573驱动7段数码管

sbit PB0=P3^2; //按钮0

sbit PB1=P3^3; //按钮1

/********************

常识:

IE寄存器

TCON寄存器

TMOD 寄存器

第一个守时器

********************/

#define count_M1 50000 // 0.05s MODE 1 一个机器周期1us 这儿12MHZ 机器周期=1/(12/12) 守时时刻=守时个数*机器周期=50000*1us =0.05s

#define TH_M1 (65536-count_M1)/256 //MODE 1 高4位

#define TL_M1 (65536-count_M1)%256 //MODE 1 低4位

int count_T0=0; /***界说中止次数,第一个中止***/

/**********************

第2个守时器

**********************/

#define count_M2 250 //MODE 2 250*1us = 0.25s

#define TH_M2 (256-count_M2) //方法2 高4位

#define TL_M2 (256-count_M2) //方法1 低4位

char count_T1=0; /***界说中止次数 ,第2个中止***/

char code TAB[10]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67 }; // 共阴极

char disp[2]={ 0x3f,0x3f }; // 数码管开端显现 0 0

char seconds=0;

char scan=0;

void delay(void);

main()

{

OC = 0; //锁存置0 ,点亮数码管

IE=0x8f; // 1000 1111 1000敞开总中止 1111敞开4个中止

TCON=0x00; //低电平0触发

TMOD=0x21; // 0010 0001 TImer1选用方法2 TImer0选用方法1

TH0=TH_M1; //T0高4位 MODE 1

TL0=TL_M1; //T0低4位 MODE 1

TR0=0; //不发动 T0

TH1=TH_M2; //设置T1主动加载值,计数值 MODE2

TL1=TL_M2; // T1 MODE2

TR1=1; //发动T1

P3 =0xff; //设置按钮输入

while(1);

}

/**************

中止0 核算并显现秒数

***************/

void T0_1s(void) interrupt 1

{

TH0=TH_M1;

TL0=TL_M1;

if (++count_T0==20) //中止计数20次 0.05*20 = 1S

{

count_T0=0;

seconds++;

if (seconds==60)

seconds=0;

}

disp[1]=TAB[seconds/10]; //十位

disp[0]=TAB[seconds%10]; //个位

}

/***********************

中止1 扫描

************************/

void T1_8ms(void) interrupt 3

{ if (++count_T1==32) //0.25us * 32 ==8ms

{

count_T1=0;

if (++scan==3) //不能超过十位

scan=1;

SEG=0xff;

SCANP=~scan;

SEG=disp[scan-1];

}

}

/************************

按钮 0 中止 码表开端/暂停

*************************/

void int0_sw(void) interrupt 0

{

TR0=~TR0; //发动/暂停守时器

while(PB0==0);

delay(); //延时去颤动

}

/************************

中止1 按钮 1 复位

************************/

void int1_RST(void) interrupt 2

{

while(PB1==0);

delay();

seconds=0;

disp[0]=disp[1]=0xc0;

}

void delay(void) //延时去颤动

{

int i;

for(i=0;i《2400;i++); // 2400 * 8 = 19200us = 20ms

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/345583.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部