找回密码
 立即注册
搜索
热搜: 中医 针灸 咳嗽
查看: 165|回复: 0

内部定时器中断

[复制链接]

3711

主题

1

回帖

1万

积分

管理员

积分
11937
发表于 2023-2-5 11:11:18 | 显示全部楼层 |阅读模式
MAIN.C
  1. /*
  2. 由T0 做定时器 中断记数

  3. */
  4. #include <reg52.h>
  5. #include "main.h"


  6. Ulong display_count=0; //显示的记数
  7. void main()
  8. {

  9.     Sys_init();      // 初始化参数
  10.     Set_Time0(1,3); // 设置定时器中断
  11.     //Set_Counter0(1);//开启关闭记数器
  12.     while (1) {

  13.                         display(display_count);
  14.     }
  15. }

  16. /*初始化参数*/
  17. void Sys_init()
  18. {
  19.     Machine_Cycle = 1 / Crystal * Clock_Cycle; // 初始化 机器周期
  20.     use_count     = 0;
  21. }

  22. /*
  23. 设置定时器
  24. 参数1数量:   时间数量
  25. 参数2单位: 1.微秒 2.毫秒 3.秒
  26. 参数3模式: 0.定时器 1.计数器
  27. */
  28. void Set_Time0(Ulong U_time, int mod)
  29. {

  30.     /*时间转换*/
  31.     if (mod == 3) {

  32.         Need_time_US = U_time * 1000 * 1000;

  33.     } else if (mod == 2) {

  34.         Need_time_US = U_time * 1000;

  35.     } else if (mod == 1) {

  36.         Need_time_US = U_time;
  37.     }
  38.     /*设置定时器*/

  39.     Need_time = (Ulong)(Need_time_US / Machine_Cycle) / 65535; // 获得溢出总量
  40.    

  41.     //设置中断
  42.     EA =1; //打开总中断
  43.     ET0 =1; //打开定时器0中断
  44.     TR0  = 1; //启动定时器0
  45.     TMOD = 0X01; //定时器工作模式1,16位定时模式

  46.     TH0  = (Ulong)(65535 - (Ulong)(Need_time_US / Machine_Cycle) % 65535) / 256; //(Need_time_US/Machine_Cycle)%65535 排除溢出位
  47.     TL0  = (Ulong)(65535 - (Ulong)(Need_time_US / Machine_Cycle) % 65535) % 256;

  48. }

  49. /*
  50. 设置记数器
  51. 参数1记数器开关:    1:开启 0.关闭

  52. */
  53. void Set_Counter0(int Counter_switch){
  54.     if (Counter_switch==0)
  55.     {
  56.        TR1 =0;
  57.         
  58.     }else{
  59.     TR1 =1;
  60.     TMOD |=0X50;
  61.     TH1 =0;
  62.     TL1 =0;
  63.     }
  64.    
  65. }

  66. void T0_Timer0() interrupt 1{
  67.    


  68.     if (Need_time ==use_count)//判断Need_time总耗微秒数 是不是消耗完  如果消耗完 进入重置阶段
  69.     {
  70.     TH0  = (Ulong)(65535 - (Ulong)(Need_time_US / Machine_Cycle) % 65535) / 256; //(Need_time_US/Machine_Cycle)%65535 排除溢出位
  71.     TL0  = (Ulong)(65535 - (Ulong)(Need_time_US / Machine_Cycle) % 65535) % 256;
  72.       
  73.        use_count=0;  //重置已消耗的数量
  74.        display_count++; //记录消耗完毕的次数
  75.     }else{//如果没消耗完 继续进入下一轮定时中断触发消耗
  76.        use_count++; //已消耗的数量加1
  77.        TH0=0; //清0
  78.        TL0=0; //清0

  79.     }
  80.    
  81.    
  82. }
复制代码


main.h

  1. #define Ulong unsigned long
  2. #define Uint  unsigned int
  3. #define Uchar unsigned char
  4. #define Uint  unsigned int
  5. #define Uchar unsigned char

  6. sbit DU =P2^6;//数码管段选
  7. sbit WE =P2^7;//位选
  8. sbit count_bit =P3^5;

  9. double code Crystal     = 11.0592; // 晶振频率 设定
  10. double code Clock_Cycle = 12;      // 时钟周期
  11. double Machine_Cycle;              // 机器周期
  12. Ulong Need_time_US;                // 微秒总数量

  13. Ulong Need_time_MS; // 计算溢出的毫秒
  14. Ulong Need_time_S;  // 计算溢出的微秒

  15. Ulong Need_time; // 溢出的总数量计算

  16. Ulong use_count; //已经执行的数量





  17. Uchar code DUtabel[] = {
  18.     0x3F,
  19.     0x06,
  20.     0x5B,
  21.     0x4F,
  22.     0x66,
  23.     0x6D,
  24.     0x7D,
  25.     0x07,
  26.     0x7F,
  27.     0x6F,
  28.     0x77,
  29.     0x7C,
  30.     0x39,
  31.     0x5E,
  32.     0x79,
  33.     0x71,
  34.     0x76,
  35.     0x38,
  36.     0x40,
  37.     0x00,
  38. };

  39. Uchar code WEtabel[] = {
  40.         0x00,//全亮,补位选空位
  41.     0xFE,
  42.     0xFD,
  43.     0xfb,
  44.     0xf7,
  45.     0xef,
  46.     0xdf,
  47.     0xbf,
  48.     0x7f,
  49. };

  50. void Sys_init();
  51. void Set_Time0(Ulong Us_time, int mod);



  52. void showval(Uchar val,Uchar WEval);

  53. void showval(Uchar val, Uchar WEval);
  54. void delay(Uchar z, int mod);
  55. void display(Ulong Z);
  56. void Set_Counter0(int Counter_switch);




  57. void main1()
  58. {
  59.     long int a=0;
  60.     while (1) {

  61.         display(333);
  62.     }
  63. }
  64. /*
  65. 数码管显示函数:
  66. 参数1:显示的数据0-9
  67. 参数2:需要在显示的位1-8
  68. */
  69. void showval(Uchar val, Uchar WEval)
  70. {
  71.    
  72.    
  73.     WE = 1;              // 打开位选锁存
  74.     P0 = WEtabel[WEval]; // 选择位选
  75.     //P0 = 0XFE;
  76.     WE = 0;              // 位锁存
  77.    
  78.    
  79.     DU = 1;            // 打开段选锁存器
  80.     P0 = DUtabel[val]; // 送数据
  81.    // P0 = 0XFE;
  82.     DU = 0;            // 段锁存
  83.    
  84.    
  85. }
  86. /*
  87. 延迟函数.
  88. 参数1:z为数量
  89. 参数2:mod为模式
  90. 1:毫秒
  91. 2:秒
  92. */
  93. void delay(Uchar z, int mod)
  94. {
  95.     Ulong i;
  96.     if (mod == 1) {
  97.         for (i = 0; i < z; i++) {

  98.             unsigned char a, b;
  99.             for (b = 102; b > 0; b--)
  100.                 for (a = 3; a > 0; a--)
  101.                     ;
  102.         }
  103.     }

  104.     else if (mod == 2) {
  105.         for (i = 0; i < z * 1000; i++) {
  106.             // 10000us //误差 -0.000000000002us
  107.             unsigned char a, b;
  108.             for (b = 102; b > 0; b--)
  109.                 for (a = 3; a > 0; a--) ;
  110.         }
  111.     }
  112. }
  113. /*显示长数字*/
  114. void display(Ulong Z)
  115. {
  116.     // Z长度
  117.     int Zlen = 0;
  118.     /*存储Z每个位的数字数组变量*/
  119.     int val[8];
  120.     int i;

  121.     while (Z != 0) {
  122.         // 提取n的各个数位上的数
  123.         val[Zlen++] = Z % 10;
  124.         Z /= 10;
  125.     }

  126.     for (i = 0; i < Zlen; i++) {
  127.         P0 = 0XFF; // 清除段码
  128.         showval(val[i], 8 - i);
  129.         
  130.         delay(1, 1);
  131.     }
  132.    
  133. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|私人站点 ( 冀ICP备2023028127号-2 )

GMT+8, 2025-7-3 11:19 , Processed in 0.066485 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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