找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2294|回复: 1
收起左侧

单片机实验 定时器的应用实验

[复制链接]
ID:146314 发表于 2016-11-5 20:54 | 显示全部楼层 |阅读模式
之前做过的实验   
通过P3.4和P3.5来调节发生频率
  1. #include "reg52.h"

  2. sbit BeepPin                =P2^5; //定义蜂鸣器引脚

  3. sbit IncKey                        =P3^4; //定义按键引脚
  4. sbit DecKey                        =P3^5;

  5. #define FOSC                (11059200L)        //Hz
  6. #define WANTTIME        (10)                 //ms
  7. #define VTHX                (65536-WANTTIME*FOSC/12000)/256        //计算定时初值
  8. #define VTLX                (65536-WANTTIME*FOSC/12000)%256

  9. #define BEEPON                (0)         //使蜂鸣器发声的电平
  10. #define BEEPOFF                (1)         //使蜂鸣器不发声的电平

  11. #define INCKEY                (1)         //定义键值
  12. #define DECKEY                (2)
  13. #define NOKEY                (3)

  14. #define TRUE                (1)         //定义真常量
  15. #define FALSE                (0)         //定义假常量

  16. //定义延时运行值变量和设置值变量
  17. unsigned int DelayTime_Run,DelayTime_Set;
  18. unsigned char TimeIsUpFlag; //定义时间到标志变量
  19. bit BeepOutValue; //控制蜂鸣器的输出变量,用于刷新到BeepPin

  20. //初始化函数
  21. void Init(void)
  22. {
  23. DelayTime_Set=100; //为各变量赋初值
  24. TimeIsUpFlag=TRUE;

  25. BeepOutValue=BEEPOFF;

  26. IncKey=1; //关闭按键口线内部的锁存器
  27. DecKey=1;

  28. TMOD=0x01;        //初始化定时器T0
  29. TL0=VTLX;
  30. TH0=VTHX;

  31. ET0=1;         //使用T0中断
  32. EA=1;

  33. TR0=1;         //启动T0
  34. }

  35. //清除时间到标志变量
  36. void ClearTimeUpFlag(void)
  37. {
  38. TimeIsUpFlag=FALSE;
  39. }

  40. //读取时间到标志变量的值
  41. unsigned char GetTimeUpFlag(void)
  42. {
  43. return(TimeIsUpFlag);
  44. }

  45. //设置延时时间
  46. //xTime为延时时间,范围1~65535
  47. void SetDelayTime(unsigned int xTime)
  48. {
  49. DelayTime_Run=xTime;
  50. }

  51. //按键函数
  52. //返回为值为相应键的键值或NOKEY
  53. unsigned char Key(void)
  54. {
  55. unsigned char RetValue=NOKEY;

  56. if(IncKey==0) RetValue=INCKEY;
  57. if(DecKey==0) RetValue=DECKEY;

  58. while((IncKey==0)||(DecKey==0));

  59. return(RetValue);
  60. }

  61. //主函数
  62. void main(void)
  63. {
  64. unsigned char Temp; //声明局部变量

  65. Init(); //调用初始化函数

  66. while(1){
  67.   Temp=Key(); //调用按键函数
  68.   switch(Temp){        //处理按键
  69.    case INCKEY:
  70.                                 DelayTime_Set+=10;
  71.                                    break;
  72.    case DECKEY:
  73.                                 if(DelayTime_Set>0)
  74.                                  DelayTime_Set-=10;
  75.                                    break;
  76.    default: ;
  77.   }

  78.   BeepOutValue^=1; //蜂鸣器输出变量状态取反
  79.   BeepPin=BeepOutValue;        //刷新蜂鸣器
  80.   ClearTimeUpFlag(); //清除时间到标志
  81.   SetDelayTime(DelayTime_Set); //设置延时时间
  82.   while(GetTimeUpFlag()==FALSE); //等待时间到
  83.   //此处的循环会导致对按键的响应速度变慢!
  84.   //解决办法:多按一会再放手
  85. }
  86. }

  87. //T0的中断服务函数
  88. void T0Int(void) interrupt 1
  89. {
  90. TL0=VTLX; //恢复定时初值
  91. TH0=VTHX;

  92. if(DelayTime_Run>0) //操作延时运行值变量,其到0时时间到
  93.   {DelayTime_Run--; TimeIsUpFlag=FALSE;}
  94. else
  95.   TimeIsUpFlag=TRUE; //时间到,设置时间到标志
  96. }
复制代码


03实验三 定时器.zip

20.82 KB, 下载次数: 3, 下载积分: 黑币 -5

回复

使用道具 举报

ID:259398 发表于 2017-12-11 20:11 | 显示全部楼层
很不错,解决了我的难题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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