0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >工业控制 > 基于51单片机的计时器设计方案

基于51单片机的计时器设计方案

来源: elecfans
2021-01-28
类别:工业控制
eye 22
文章创建人 拍明

原标题:基于51单片机的计时器设计方案

  用51单片机定时器0的方式1计时,结果用4位数码管显示,分别为秒十位,秒个位,毫秒百位,毫秒十位。所以总共最大计时为1分钟,精确到了0.01s。同时,加上3个独立按键,分别控制秒表的清零,暂停和开始功能。

  按照模块化的思想,首先先把要用的函数和预定义写到一个头文件中,要用到的预定义和全局变量如下:

  

image.png


  #include

  #defineucharunsignedchar

  sbitClear=P3^7;//按键实现清零

  sbitStop=P3^6;//按键实现暂停

  sbitReStart=P3^5;//按键实现开始

  sbitdula=P2^6;//段选线接P2^6口

  sbitwela=P2^7;//位选线接P2^7口

  //table数组中存储数码管显示0~F对应的编码

  ucharcodetable[]={

  0x3f,0x06,0x5b,0x4f,

  0x66,0x6d,0x7d,0x07,

  0x7f,0x6f,0x77,0x7c,

  0x39,0x5e,0x79,0x71};

  //计时时间,计时中断发生一次,则加1,最大为5999

  inttime;

  接下来是将要用到的函数声明:

  //用于动态扫描数码管的时间较短的延时函数

  voidShortDelay();

  //用于键盘消抖的时间较长的延时函数

  voidLongDelay();

  //初始化

  voidInital();

  //在数码管显示秒十位,秒个位,微秒百位,微秒十位

  //用拼音表示很不好,将就着看吧

  voidDisplay(ucharshimiao,uchargemiao,ucharbaiwei,ucharshiwei);

  //清零函数,按下清零键的时候调用

  voidClc();

  //暂停函数,按下暂停键时候调用

  voidStopTImer();

  //开始或重新开始函数,按下开始键时候调用

  voidReStartTImer();

  //键盘扫描函数,是否有键被按下,并且执行相应操作

  voidKeyScan();

  接下来是主函数:

  voidmain()

  {

  ucharshimiao,gemiao,baiwei,shiwei;

  Inital();//初始化

  while(1)

  {

  if(TIme==6000)//到了秒表最大值,自动归零

  {

  TIme=0;

  }

  //分解出要显示的各个数位

  shimiao=time/1000;

  gemiao=time%1000/100;

  baiwei=time%100/10;

  shiwei=time%10;

  //显示

  Display(shimiao,gemiao,baiwei,shiwei);

  ShortDelay();

  //键盘扫描,有键按下执行相应操作

  KeyScan();

  }

  }

  下面的工作就是要写相应的处理函数了:

  首先是两个延时函数:

  voidShortDelay()

  {

  uchara=100;

  while(a--);

  }

  voidLongDelay()

  {

  inta=5000;

  while(a--);

  }

  初始化函数:

  voidInital()

  {

  dula=0;

  wela=0;

  time=0;

  EA=1;

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

  TMOD=0x01;

  TH0=0xdc;

  TL0=0x01;//装载初值,计时方式1

  Clear=1;

  Stop=1;

  ReStart=1;//按键接口管脚输出高电平

  }

  在数码管上显示时间的函数:

  voidDisplay(ucharshimiao,uchargemiao,ucharbaiwei,ucharshiwei)

  {

  //输出秒十位

  wela=1;

  P0=0xfb;

  wela=0;

  P0=0xff;

  dula=1;

  P0=table[shimiao];

  dula=0;

  ShortDelay();

  //输出秒个位

  wela=1;

  P0=0xf7;

  wela=0;

  P0=0xff;

  dula=1;

  P0=table[gemiao];

  dula=0;

  ShortDelay();

  wela=1;

  P0=0xef;

  wela=0;

  P0=0xff;

  dula=1;

  P0=table[baiwei];

  dula=0;

  ShortDelay();

  wela=1;

  P0=0xdf;

  wela=0;

  P0=0xff;

  dula=1;

  P0=table[shiwei];

  dula=0;

  ShortDelay();

  }

  键盘扫描函数:

  voidKeyScan()

  {

  if(Clear==0)

  {

  LongDelay();//消抖

  if(Clear==0)//确实是被按下

  {

  //Dosomthing

  Clc();

  }

  }

  //Stop和ReStart检测方法相同

  if(Stop==0)

  {

  LongDelay();

  if(Stop==0)

  {

  //Dosomthing

  StopTimer();

  }

  }

  if(ReStart==0)

  {

  LongDelay();

  if(ReStart==0)

  {

  //Dosomthing

  ReStartTimer();

  }

  }

  }

  最后是3个按键按下后的处理函数:

  voidClc()

  {

  TR0=0;//计时暂时停止

  time=0;//时间归零

  Display(0,0,0,0);//显示0000

  ShortDelay();

  }

  voidStopTimer()

  {

  //计时暂时停止,仅此而已

  TR0=0;

  }

  voidReStartTimer()

  {

  //计时重新开始,仅此而已

  TR0=1;

  }


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯

方案推荐
基于MC33771主控芯片的新能源锂电池管理系统解决方案

基于MC33771主控芯片的新能源锂电池管理系统解决方案

AMIC110 32位Sitara ARM MCU开发方案

AMIC110 32位Sitara ARM MCU开发方案

基于AMIC110多协议可编程工业通信处理器的32位Sitara ARM MCU开发方案

基于AMIC110多协议可编程工业通信处理器的32位Sitara ARM MCU开发方案

基于展讯SC9820超低成本LTE芯片平台的儿童智能手表解决方案

基于展讯SC9820超低成本LTE芯片平台的儿童智能手表解决方案

基于TI公司的AM437x双照相机参考设计

基于TI公司的AM437x双照相机参考设计

基于MTK6580芯片的W2智能手表解决方案

基于MTK6580芯片的W2智能手表解决方案