中断触发定时器:99秒计时+99秒倒计时

控制/MCU

1813人已加入

描述

  #include

  code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  unsigned char Dis_Shiwei;

  unsigned char Dis_Gewei;

  void delay(unsigned int cnt)

  {

  while(--cnt);

  }

  main()

  {

  TMOD |=0x01; //10ms in 12M crystal,工作在模式一,16位定时器

  TH0=0xd8;

  TL0=0xf0;

  IE= 0x82; //打开中断

  TR0=1; //打开定时开关

  while(1)

  {

  P0=Dis_Shiwei;

  P2=0;

  delay(300);

  P0=Dis_Gewei;

  P2=1;

  delay(300);

  }

  }

  void tim(void) interrupt 1 using 1

  {

  statIC unsigned char second,count;

  TH0=0xd8;

  TL0=0xf0;

  count++;

  if (count==100) //100x10ms

  {

  count=0;

  second++;

  if(second==100)

  second=0;

  Dis_Shiwei=tab[second/10];

  Dis_Gewei=tab[second%10];

  }

  }

  /*

  定时器设定为:TH0=0xd8;TL0=0xf0;经确定时10ms。从程序开始执行,每当主程序中的16位数发生溢出则触发中断,主程序保护现场并调用中断子程序,也可以写为:TH0=(65536-10000)/256;TL0=(65536-10000)%256。秒脉冲的产生要求精确定时1s,实际情况可能有延误。

  1 0000 0000 0000 0000

  1101 1000 1111 0000

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

  0010 0111 0001 0000

  Time=16(1+16+32+64+512)=16*625=10000us=10ms

  主函数中的关于定时器和中断的控制位:

  TMOD |=0x01; //模式选择

  TH0=0xd8; //高8位

  TL0=0xf0; //低8位

  IE= 0x82; //打开中断

  TR0=1; //打开定时开关(定时器运行控制位,置“1”启动定时器0)

  TMOD |= 0x01; //使用模式1,16位定时器

  TH0=0x00;

  TL0=0x00;

  EA=1; //总中断打开

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

  TR0=1; //定时器开关打开

  */

  ______________________________________________

  功能:99秒倒计时

  时间:2010—7—18

  ______________________________________________

  #include

  code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  unsigned char Dis_Shiwei;

  unsigned char Dis_Gewei;

  void delay(unsigned int cnt)

  {

  while(--cnt);

  }

  main()

  {

  TMOD |=0x01; //10ms in 12M crystal

  TH0=0xd8;

  TL0=0xf0;

  IE= 0x82;

  TR0=1;

  while(1)

  {

  P0=Dis_Shiwei;

  P2=0;

  delay(300);

  P0=Dis_Gewei;

  P2=1;

  delay(300);

  }

  }

  void tim(void) interrupt 1 using 1

  {

  statIC unsigned char second=99,count;

  TH0=0xd8;

  TL0=0xf0;

  count++;

  if (count==100)

  {

  count=0;

  second--;

  if(second==0)

  {

  second=99;

  }

  Dis_Shiwei=tab[second/10];

  Dis_Gewei=tab[second%10];

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分