中断及定时器实现24时 时钟,程序如下:

#include <reg52.h>

#define PORTLEN P0

sbit bit_select = P2^0;

sbit seg_select = P2^1;

unsigned char src[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned char qrc[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

unsigned char second1[8];

unsigned char shi = 0;

unsigned char fen = 0;

unsigned char miao = 0;

void timer0_init(void)

{

EA = 1;  //打开总中断

TMOD |= 0x01; //设置工作方式

TH0 = (65536 - 20000) / 256;

TL0 = (65536 - 20000) % 256;  //设置定时器初值,1ms产生一次中断

ET0 = 1;   //打开定时器中断

TR0 = 1;   //打开定时器,开始每隔1ms加1

} //打开计时器开始加1,当TH0 =0xff,TL0=0xff时,TF0(单片机内部定时器的溢出标志位,一般无需手动置位)由0置1,触发中断,并重新置0.

然后向cpu请求中断,cpu响应的话就跳转到中断函数,即void timer0_isr() interrupt 1

void timer1_init(void)

{

EA = 1;

TMOD |= 0x10;

TH1 = (65536 - 1000) / 256;

TL1 = (65536 - 1000) % 256;

ET1 = 1;

TR1 = 1;

}

void main()

{

timer0_init();

timer1_init();

while(1);

}

//while(1)相当于死循环,这边有个注意点,两个timer放while里外的区别,后文中具体讲解。

void display()

{

static unsigned char i = 0;

PORTLEN = 0x0;   //消重影

seg_select = 1;

seg_select = 0;

PORTLEN = 0xff;

bit_select = 1;

bit_select = 0;

PORTLEN = second1[i];

seg_select = 1;

seg_select = 0;

PORTLEN = qrc[i];

bit_select = 1;

bit_select = 0;

i++;

if(8 == i)

{

i = 0;

}

}

void timer0_isr() interrupt 1

{

static unsigned char i = 0;

TH0 = (65536 - 20000) / 256;

TL0 = (65536 - 20000) % 256;   //设置定时器初值,每隔20ms产生一次中断

i++;

if(50 == i)

{

i = 0;

miao++;

if(60 == miao)

{

miao = 0;

fen++;

if(60 == fen)

{

fen = 0;

shi++;

if(24 == shi)

{

shi = 0;

}

}

}

}

second1[0] = src[shi / 10];

second1[1] = src[shi % 10];

second1[2] = 0x40;

second1[3] = src[fen / 10];

second1[4] = src[fen % 10];

second1[5] = 0x40;

second1[6] = src[miao / 10];

second1[7] = src[miao % 10];

}

void timer1_isr() interrupt 3

{

TH1 = (65536 - 1000) / 256;

TL1 = (65536 - 1000) % 256;

display();

}

//interrupt   x跟在interrupt   后面的x值是中断号,就是说这个函数对应第几个中断端口,在51中0   外部中断0 ;  1   定时器0 ;2   外部中断1 ;3   定时器1 ;4   串行中断

实际上编译的时候就是把你这个函数的入口地址方到这个对应中断的跳转地址

————————————————————————————————

接下来来讲讲while了,用A,B分别代替timer0_init  time1_init 两个函数,A+,B+表示两个中断服务程序。

①A,B执行完继续执行A,但要注意的是,A,B的执行 只是在执行的最后打开了定时器,可以近乎当作A结束开始定时器累加,然后同理B,但是B一结束又到A,A中TH,TL重新给值导致一直在中断,并未进入中断服务函数,这里要修改的话,就需要加入一个自己的delay延时函数,给他时间进入中断服务程序,但是这样意义也不是多大不如第二种

②第二种的话,则是,A,B,执行完,就一直在while里,等到A,B发出中断响应,按照优先级进入中断服务程序,等中断服务程序按其内中断结束,返回while里,(在中断服务程序里已再次给初值,定时器开启后不自动关)B一直在刷新display,A则是给temp数组给值。

上图右侧 看作执行时间是错误的,忘了改了,中断服务程序里的1ms和20ms只是再次赋初值

如有错误理解,还请留言

中断及定时器实现时钟功能相关推荐

  1. STM32入门笔记04_TIM定时器+案例:TIM定时器定时中断、定时器外部时钟

    TIM定时器 TIM简介 TIM(Timer) 定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器.预分频器.自动重装寄存器的时基单元,在72MHz(系统主频)计数时 ...

  2. stm32学习笔记 TIM定时器中断1.定时器基本定时功能(含代码)

    TIM定时器分四个部分 目录 一.定时器基本定时功能 二.定时器输出比较功能 三.定时器输入捕获功能 四.定时器编码接口 一.定时器基本定时功能 RCC时钟树 SystmInit函数 外部晶振出问题会 ...

  3. 关于用51单片机内部定时器实现时钟和闹钟功能的概述

    关于用51单片机内部定时器实现时钟和闹钟功能的概述 仅个人观点,欢迎大家相互学习和讨论 STC89C52单片机,内部配置了三个定时器,T0\T1\T2,其中T2定时器我们几乎不用,或者说很少用到.我们 ...

  4. STM32理论 —— ADC、存储、定时器、时钟、中断

    文章目录 1. ADC 1.1 ADC相关寄存器 1.1.1 ADC 控制寄存器1(ADC_CR1) 1.1.2 ADC 控制寄存器2(ADC_CR2) 1.1.3 ADC 采样时间寄存器(ADC_S ...

  5. 51单片机定时器及其应用(1)(时钟功能)

    51单片机定时器及其应用(1)(时钟功能)   STC89C51单片机有2个定时器,叫做定时器0和定时器1,可以用作普通定时器,计数器.普通定时器可以用来进行中断定时,波特率发生等,计数器可以用来对脉 ...

  6. 使用 FlipClock.js 制作精美的时钟、定时器和倒计时功能

    FlipClock.js 被创建出来是因为其他的解决方案不够抽象,不能够在不重写的代码的情况下提供了深层次的自定义.有些库的参数过多,而另外一些则是脚本中的硬编码太多,不够灵活. 在参考许多现有的解决 ...

  7. STM32-通用定时器基本定时功能

    1.     STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器.其中系统嘀嗒定时器是前文中所 ...

  8. 实现定时中断_EPIT 定时器,仅需做到如下几步,即可轻松配置使用

    EPIT 的全称是: Enhanced Periodic Interrupt Timer,直译过来就是增强的周期中断定时器,它主要是完成周期性中断定时的.学过 STM32 的话应该知道, STM32 ...

  9. pic单片机内部时钟校准c语言,PIC系列单片机片内定时器实时时钟的实现(转)

    PIC系列单片机片内定时器实时时钟的实现(转) (2008-08-11 14:24:59) 标签: 杂谈 1. 1 振荡频率的考虑 工作频率为4MHz 的单片机, 选择32. 768kHz 的晶振显然 ...

最新文章

  1. Flex 颜色对照表_16进制
  2. Leetcode 769. Max Chunks To Make Sorted
  3. 磁盘镜像工具Guymager
  4. 一入职!就遇到MySQL亿级大表优化....
  5. python语言程序设计编程题_《python语言程序设计》_第一章编程题
  6. java 中覆 写tostring_如何在Java中正确覆盖toString()?
  7. idea 转普通项目为maven 项目
  8. 部署php项目到linux
  9. 呵呵呵,一周这么来也不错
  10. Linux笔记19.postfix邮件服务器配置安装
  11. Immutable 操作在 React 中的实践
  12. django中自定义了manager函数,使用的时候报错AttributeError: 'Manager' object has no attribute 'title_count'...
  13. 内存卡坏了怎么修复?内存卡恢复也不难
  14. 推荐几个编程学习网站
  15. Three.js基础探寻七——Lamber材质与Phong材质
  16. 江苏省赛 JSCPC2018 K. 2018
  17. 考研350什么水平计算机,考研350分的难度相当于高考考什么水平?很多人都不知道...
  18. php视频画面区域裁剪,怎么裁剪视频画面
  19. java tongpaiyu danliantiao_五年级语文第一学期词语表
  20. Lighthouse performance scoring

热门文章

  1. 对战坦克大战(vc++)
  2. 大数据项目实战之数据仓库:用户行为采集平台——第4章 用户行为数据采集模块
  3. Vue SSR之服务端渲染
  4. 如何挖掘360下拉词,怎么删除360下拉负面词
  5. 判断一字符串是不是对称的
  6. excel表格 固定表头 表格主体滚动 动画制作
  7. Unity + StepVR 空间定位 + Oculus Quest 头盔 + VRTRIX 手套 全套开发记录
  8. 数据挖掘算法-关联算法-Apriori
  9. 设计模式学习笔记(三)工厂模式中的简单工厂、工厂方法和抽象工厂模式之间的区别
  10. 复变函数与积分变换(二)学习笔记[调和,解析,常见初等函数]