找回密码
 立即注册
楼主: CListery

跟着冲哥学习单片机

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-02-18 09:33:29

1

主题

32

回帖

486

积分

中级会员

积分
486
发表于 2024-6-27 15:26:16 | 显示全部楼层
第八课:
1. 学习在代码中通过 IRC 时钟写一个延时函数
2. 学习 #define 和 typedef 的使用
3. 学习点亮和熄灭发光二极管
4. 学习 while 和 do...while 循环语句
5. 学习 自减(--a) 的用法
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-02-18 09:33:29

1

主题

32

回帖

486

积分

中级会员

积分
486
发表于 2024-6-27 16:00:18 | 显示全部楼层
第九课:
1. 学习函数的定义、声明和使用
2. 学习模块化代码编写方式
3. 学习在 Keil 中添加 include path
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-02-18 09:33:29

1

主题

32

回帖

486

积分

中级会员

积分
486
发表于 2024-6-27 16:13:06 | 显示全部楼层
第十课:
1. 学习按键的种类、样式、和触发原理
2. 学习如何通过代码给按键消抖
3. 学习通过 if 条件判断语句和延时实现长按按键时间隔多久连续出发某个代码流程
4. 学习通过 while 循环控制语句实现避免长按按键时重复多次出发同一代码流程
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-02-18 09:33:29

1

主题

32

回帖

486

积分

中级会员

积分
486
发表于 2024-6-27 16:50:16 | 显示全部楼层
本帖最后由 CListery 于 2024-6-27 17:07 编辑

第十一课:
1. 学习通过按键控制 LED 灯的变化
2. 学习数组的使用
3. 拓展练习,通过位运算实现按键按一下 LED 位移一个位置
  1. typedef unsigned char u8;
  2. #define LED_LINE P2
  3. sbit TIGGER = P1^7;
  4. void main()
  5. {
  6.   
  7.   LED_LINE = 0xFE;
  8.   while(1)
  9.   {
  10.     if(TIGGER == 0)
  11.     {
  12.       delay_ms(10);
  13.       if(TIGGER == 0)
  14.       {
  15.         u8 v = ~LED_LINE;
  16.         v = v << 1;
  17.         if(v == 0)
  18.         {
  19.           v = 0x01;
  20.         }
  21.         LED_LINE = ~v;
  22.         while(TIGGER == 0);
  23.       }
  24.     }
  25.   }
  26. }
复制代码
4. 扩展练习,通过数组实现来回流水灯效果,长按触发,释放暂停
  1. typedef unsigned char u8;
  2. #define LED_LINE P2
  3. sbit TIGGER = P1^7;
  4. u8 LED_DATA[14] = {
  5.   0xFE, 0xFD, 0xFB, 0xF7,
  6.   0xEF, 0xDF, 0xBF, 0x7F,
  7.   0xBF, 0xDF, 0xEF, 0xF7,
  8.   0xFB, 0xFD
  9. };
  10. void main()
  11. {
  12.   u8 count = 0;
  13.   LED_LINE = LED_DATA[count];
  14.   while(1)
  15.   {
  16.     if(TIGGER == 0)
  17.     {
  18.       delay_ms(10);
  19.       if(TIGGER == 0)
  20.       {
  21.         LED_LINE = LED_DATA[count++ % 14];
  22.         delay_ms(500);
  23.         //while(TIGGER == 0);
  24.       }
  25.     }
  26.   }
  27. }
复制代码




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-02-18 09:33:29

1

主题

32

回帖

486

积分

中级会员

积分
486
发表于 2024-6-27 23:58:46 | 显示全部楼层
本帖最后由 CListery 于 2024-6-28 00:09 编辑

第十二和十三集:
1. 了解蜂鸣器常见种类:有源、无源
2. 学习蜂鸣器的使用方法
3. 学习通过代码实现按键触发有源蜂鸣器发声
4. 实现电磁炉控制面板功能
  1. #include "delay.h"
  2. #define FUN_LINE P0
  3. sbit POWER_KEY = P1^6;
  4. sbit FUN_SW_KEY = P1^7;
  5. sbit BEE = P2^7;
  6. sbit ON_STATE = P3^0;
  7. typedef unsigned char u8;
  8. unsigned char FUN_DATA[8] = {
  9.   0xFE, 0xFD, 0xFB, 0xF7,
  10.   0xEF, 0xDF, 0xBF, 0x7F
  11. };
  12. void buzzing(u8 ms)
  13. {
  14.   BEE = 1;
  15.   delay_ms(ms);
  16.   BEE = 0;
  17. }
  18. void main()
  19. {
  20.   u8 FUN_POS = 0; // 功能位下标
  21.   ON_STATE = 1;
  22.   BEE = 0;
  23.   while(1)
  24.   {
  25.     FUN_LINE = 0xFF;
  26.     if(POWER_KEY == 0)
  27.     {
  28.       delay_ms(10);
  29.       if(POWER_KEY == 0)
  30.       {
  31.         while(!POWER_KEY);
  32.         ON_STATE = 0;
  33.         FUN_LINE = 0x00;
  34.         buzzing(10);
  35.         delay_ms(190);
  36.         FUN_LINE = 0xFF;
  37.         FUN_POS = 0;
  38.         while(ON_STATE == 0)
  39.         {
  40.           if(POWER_KEY == 0)
  41.           {
  42.             delay_ms(10);
  43.             if(POWER_KEY == 0)
  44.             {
  45.               while(!POWER_KEY);
  46.               buzzing(10);
  47.               ON_STATE = 1;
  48.               break;
  49.             }
  50.           }
  51.           else if(FUN_SW_KEY == 0)
  52.           {
  53.             delay_ms(10);
  54.             if(FUN_SW_KEY == 0)
  55.             {
  56.               while(!FUN_SW_KEY);
  57.               FUN_LINE = FUN_DATA[FUN_POS%8];
  58.               ++FUN_POS;
  59.               buzzing(10);
  60.             }
  61.           }
  62.         }
  63.       }
  64.     }
  65.   }
  66. }
复制代码



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-02-18 09:33:29

1

主题

32

回帖

486

积分

中级会员

积分
486
发表于 2024-6-28 10:06:41 | 显示全部楼层
本帖最后由 CListery 于 2024-6-28 11:42 编辑

第十四和十五课:
1. 学习数码管种类(型号后缀是A为共阳极,K为共阴极)及使用方式
2. 学习数码管刷新原理
3. 共阴8位数码管位移
  1. typedef unsigned char BYTE;
  2. typedef unsigned int WORD;
  3. void delay_ms(BYTE ms)
  4. {
  5.   BYTE i;
  6.   while(ms--)
  7.   {
  8.     for(i=0;i<120;i++);
  9.   }
  10. }
  11. void delay_sec(WORD sec)
  12. {
  13.   WORD i;
  14.   while(sec--)
  15.   {
  16.     i = 0;
  17.     while(++i);
  18.   }
  19. }
  20. #define SHARE P2
  21. #define CONTROL P0
  22. void main()
  23. {
  24.   SHARE = 0x7F;
  25.   CONTROL = 0x3F;
  26.   while(1)
  27.   {
  28.     delay_sec(1);
  29.     SHARE = ~(~SHARE >> 1);
  30.     if(SHARE == 0xFF)
  31.       SHARE = 0x7F;
  32.   }
  33.    
  34. }
复制代码
4. 共阴极数码管从0-9显示,从右往左循环播放
  1. #define SHARE P2
  2. #define CONTROL P0
  3. BYTE NUM_MAP[10] = {
  4. 0x3F, //   0
  5. 0x6, //  1
  6. 0x5B, //   2
  7. 0x4F, //   3
  8. 0x66, //   4
  9. 0x6D, //   5
  10. 0x7D, //   6
  11. 0x7, //  7
  12. 0x7F, //   8
  13. 0x6F, //   9
  14. };
  15. void main()
  16. {
  17.   BYTE NUM_POS = 0;
  18.   SHARE = 0x7F;
  19.   CONTROL = NUM_MAP[NUM_POS];
  20.   while(1)
  21.   {
  22.     for(NUM_POS = 0; NUM_POS < 10; NUM_POS++)
  23.     {
  24.       CONTROL = NUM_MAP[NUM_POS];
  25.       delay_ms(500);
  26.     }
  27.     SHARE = ~(~SHARE >> 1);
  28.     if(SHARE == 0xFF)
  29.       SHARE = 0x7F;
  30.   }
  31.   
  32. }
复制代码
5. 共阴极8位数码管加、减、归零功能计数器
  1. #define SHARE P2
  2. #define CONTROL P0
  3. sbit ADD_TIGGER = P3^0;
  4. sbit SUB_TIGGER = P3^1;
  5. sbit ZERO_TIGGER = P3^2;
  6. BYTE NUM_MAP[10] = {
  7. 0x3F, //   0
  8. 0x6, //  1
  9. 0x5B, //   2
  10. 0x4F, //   3
  11. 0x66, //   4
  12. 0x6D, //   5
  13. 0x7D, //   6
  14. 0x7, //  7
  15. 0x7F, //   8
  16. 0x6F, //   9
  17. };
  18. BYTE UNIT_MAP[8] = {
  19.   0x7F,
  20.   0xBF,
  21.   0xDF,
  22.   0xEF,
  23.   0xF7,
  24.   0xFB,
  25.   0xFD,
  26.   0xFE,
  27. };
  28. void shadowDelay()
  29. {
  30.   delay_ms(1);// 产生残影
  31. }
  32. void main()
  33. {
  34.   unsigned long PASS_COUNT = 0;
  35.   while(1)
  36.   {
  37.     if(ADD_TIGGER == 0)
  38.     {
  39.       delay_ms(10);
  40.       if(ADD_TIGGER == 0)
  41.       {
  42.         PASS_COUNT++;
  43.         delay_ms(500);
  44.       }
  45.     }
  46.     else if(SUB_TIGGER == 0)
  47.     {
  48.       delay_ms(10);
  49.       if(SUB_TIGGER == 0)
  50.       {
  51.         PASS_COUNT--;
  52.         delay_ms(500);
  53.       }
  54.     }
  55.     else if(ZERO_TIGGER == 0)
  56.     {
  57.       delay_ms(10);
  58.       if(ZERO_TIGGER == 0)
  59.       {
  60.         PASS_COUNT = 0;
  61.       }
  62.     }
  63.    
  64.     if(PASS_COUNT >= 99999999)
  65.       PASS_COUNT = 99999999;
  66.    
  67.     if(PASS_COUNT >= 0)
  68.     {
  69.       BYTE gw = PASS_COUNT % 10; // 个位数
  70.       SHARE = UNIT_MAP[0];
  71.       CONTROL = NUM_MAP[gw];
  72.       shadowDelay();
  73.     }
  74.     if(PASS_COUNT > 9)
  75.     {
  76.       BYTE sw = PASS_COUNT / 10 % 10; // 十位数
  77.       SHARE = UNIT_MAP[1];
  78.       CONTROL = NUM_MAP[sw];
  79.       shadowDelay();
  80.     }
  81.     if(PASS_COUNT > 99)
  82.     {
  83.       BYTE bw = PASS_COUNT / 100 % 10; // 百位数
  84.       SHARE = UNIT_MAP[2];
  85.       CONTROL = NUM_MAP[bw];
  86.       shadowDelay();
  87.     }
  88.     if(PASS_COUNT > 999)
  89.     {
  90.       BYTE qw = PASS_COUNT / 1000 % 10;
  91.       SHARE = UNIT_MAP[3];
  92.       CONTROL = NUM_MAP[qw];
  93.       shadowDelay();
  94.     }
  95.     if(PASS_COUNT > 9999)
  96.     {
  97.       BYTE ww = PASS_COUNT / 10000 % 10;
  98.       SHARE = UNIT_MAP[4];
  99.       CONTROL = NUM_MAP[ww];
  100.       shadowDelay();
  101.     }
  102.     if(PASS_COUNT > 99999)
  103.     {
  104.       BYTE sww = PASS_COUNT / 100000 % 10;
  105.       SHARE = UNIT_MAP[5];
  106.       CONTROL = NUM_MAP[sww];
  107.       shadowDelay();
  108.     }
  109.     if(PASS_COUNT > 999999)
  110.     {
  111.       BYTE bww = PASS_COUNT / 1000000 % 10;
  112.       SHARE = UNIT_MAP[6];
  113.       CONTROL = NUM_MAP[bww];
  114.       shadowDelay();
  115.     }
  116.     if(PASS_COUNT > 9999999)
  117.     {
  118.       BYTE qww = PASS_COUNT / 10000000 % 10;
  119.       SHARE = UNIT_MAP[7];
  120.       CONTROL = NUM_MAP[qww];
  121.       shadowDelay();
  122.     }
  123.   }
  124. }
复制代码
内码表:
截图202406281123266402.jpg





回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-02-18 09:33:29

1

主题

32

回帖

486

积分

中级会员

积分
486
发表于 2024-6-28 17:31:22 | 显示全部楼层
本帖最后由 CListery 于 2024-7-1 15:23 编辑

第十六集:
1. 定时器的使用场景和使用方式
2. 学习定时器\计数器 T0 的使用
3. 89C52 系列通过 T2 定时器实现刷新数码管
  1. #include <reg52.h>
  2. typedef unsigned char BYTE;
  3. typedef unsigned int WORD;
  4. typedef unsigned long DWORD;
  5. void delay_ms(BYTE ms)
  6. {
  7.   BYTE i;
  8.   while(ms--)
  9.   {
  10.     for(i=0;i<120;i++);
  11.   }
  12. }
  13. void delay_sec(WORD sec)
  14. {
  15.   WORD i;
  16.   while(sec--)
  17.   {
  18.     i = 0;
  19.     while(++i);
  20.   }
  21. }
  22. #define SHARE P2
  23. #define CONTROL P0
  24. sbit ADD_TIGGER = P3^0;
  25. sbit SUB_TIGGER = P3^1;
  26. sbit ZERO_TIGGER = P3^2;
  27. BYTE NUM_MAP[10] = {
  28. 0x3F, //   0
  29. 0x6, //  1
  30. 0x5B, //   2
  31. 0x4F, //   3
  32. 0x66, //   4
  33. 0x6D, //   5
  34. 0x7D, //   6
  35. 0x7, //  7
  36. 0x7F, //   8
  37. 0x6F, //   9
  38. };
  39. BYTE UNIT_MAP[8] = {
  40.   0x7F,
  41.   0xBF,
  42.   0xDF,
  43.   0xEF,
  44.   0xF7,
  45.   0xFB,
  46.   0xFD,
  47.   0xFE,
  48. };
  49. void shadowDelay()
  50. {
  51.   delay_ms(1);// 产生残影
  52. }
  53. sfr IPH = 0xB7;
  54. sfr AUXR = 0x8E;
  55. long PASS_COUNT = 0;
  56. void main()
  57. {
  58.         AUXR |= 0x80;                        //定时器时钟1T模式
  59.         TMOD &= 0xF0;                        //设置定时器模式
  60.         TL0 = 0xCD;                                //设置定时初始值
  61.         TH0 = 0xD4;                                //设置定时初始值
  62.         TF0 = 0;                                //清除TF0标志
  63.         TR0 = 1;                                //定时器0开始计时
  64.   EA = 1;         // 中断总开关
  65.   ET0 = 1;        // T0 中断开关
  66.          
  67.   while(1)
  68.   {
  69.     if(ADD_TIGGER == 0)
  70.     {
  71.       delay_ms(10);
  72.       if(ADD_TIGGER == 0)
  73.       {
  74.         PASS_COUNT++;
  75.         delay_ms(50);
  76.       }
  77.     }
  78.     else if(SUB_TIGGER == 0)
  79.     {
  80.       delay_ms(10);
  81.       if(SUB_TIGGER == 0)
  82.       {
  83.         PASS_COUNT--;
  84.         delay_ms(50);
  85.       }
  86.     }
  87.     else if(ZERO_TIGGER == 0)
  88.     {
  89.       delay_ms(10);
  90.       while(ZERO_TIGGER == 0)
  91.         PASS_COUNT = 0;
  92.     }
  93.   }
  94. }
  95. void Timer0_Isr(void) interrupt 1
  96. {
  97.   long TMP = 0;
  98.   long complement = 0;
  99.   if(PASS_COUNT >= 99999999)
  100.     PASS_COUNT = 99999999;  
  101.   
  102.   if(PASS_COUNT < -9999999)
  103.     PASS_COUNT = -9999999;
  104.   
  105.   if(PASS_COUNT < 0)
  106.   {
  107. //    complement = ~PASS_COUNT + 1;
  108. //    TMP = (unsigned long)complement;
  109.     TMP = -PASS_COUNT;
  110.    
  111.     SHARE = UNIT_MAP[7];
  112.     CONTROL = 0x40;
  113.     shadowDelay();
  114.   }
  115.   else
  116.   {
  117.     TMP = PASS_COUNT;
  118.   }
  119.   
  120.   if(TMP >= 0)
  121.   {
  122.     BYTE gw = TMP % 10; // 个位数
  123.     SHARE = UNIT_MAP[0];
  124.     CONTROL = NUM_MAP[gw];
  125.     shadowDelay();
  126.   }
  127.   if(TMP > 9)
  128.   {
  129.     BYTE sw = TMP / 10 % 10; // 十位数
  130.     SHARE = UNIT_MAP[1];
  131.     CONTROL = NUM_MAP[sw];
  132.     shadowDelay();
  133.   }
  134.   if(TMP > 99)
  135.   {
  136.     BYTE bw = TMP / 100 % 10; // 百位数
  137.     SHARE = UNIT_MAP[2];
  138.     CONTROL = NUM_MAP[bw];
  139.     shadowDelay();
  140.   }
  141.   if(TMP > 999)
  142.   {
  143.     BYTE qw = TMP / 1000 % 10;
  144.     SHARE = UNIT_MAP[3];
  145.     CONTROL = NUM_MAP[qw];
  146.     shadowDelay();
  147.   }
  148.   if(TMP > 9999)
  149.   {
  150.     BYTE ww = TMP / 10000 % 10;
  151.     SHARE = UNIT_MAP[4];
  152.     CONTROL = NUM_MAP[ww];
  153.     shadowDelay();
  154.   }
  155.   if(TMP > 99999)
  156.   {
  157.     BYTE sww = TMP / 100000 % 10;
  158.     SHARE = UNIT_MAP[5];
  159.     CONTROL = NUM_MAP[sww];
  160.     shadowDelay();
  161.   }
  162.   if(TMP > 999999)
  163.   {
  164.     BYTE bww = TMP / 1000000 % 10;
  165.     SHARE = UNIT_MAP[6];
  166.     CONTROL = NUM_MAP[bww];
  167.     shadowDelay();
  168.   }
  169.   if(TMP > 9999999)
  170.   {
  171.     BYTE qww = TMP / 10000000 % 10;
  172.     SHARE = UNIT_MAP[7];
  173.     CONTROL = NUM_MAP[qww];
  174.     shadowDelay();
  175.   }
  176. }
复制代码
4. 更新开发板配套代码
  1. #include <STC32G.H>
  2. #include <STC32_STC8_USB.H>
  3. #include "delay_24mhz.h"
  4. char *USER_DEVICEDESC = NULL;
  5. char *USER_PRODUCTDESC = NULL;
  6. char *USER_STCISPCMD = "@STCISP#";
  7. #define ADD_TIGGER P34
  8. #define SUB_TIGGER P35
  9. #define ZERO_TIGGER P32
  10. long PASS_COUNT = 0;
  11. #define SHARE P7
  12. #define CONTROL P6
  13. BYTE NUM_DATA[11] = {
  14.     0xFF, //
  15.     0xC0, // 0
  16.     0xF9, // 1
  17.     0xA4, // 2
  18.     0xB0, // 3
  19.     0x99, // 4
  20.     0x92, // 5
  21.     0x82, // 6
  22.     0xF8, // 7
  23.     0x80, // 8
  24.     0x90  // 9
  25. };
  26. BYTE UNIT_MAP[8] = {
  27.     0xFE, //
  28.     0xFD, //
  29.     0xFB, //
  30.     0xF7, //
  31.     0xEF, //
  32.     0xDF, //
  33.     0xBF, //
  34.     0x7F  //
  35. };
  36. BYTE DATA[8] = {
  37.     0xFF,
  38.     0xFF,
  39.     0xFF,
  40.     0xFF,
  41.     0xFF,
  42.     0xFF,
  43.     0xFF,
  44.     0xFF,
  45. };
  46. void sys_init()
  47. {
  48.   WTST = 0;
  49.   EAXFR = 1;
  50.   CKCON = 0;
  51. }
  52. void set_interrupt()
  53. {
  54.   AUXR &= 0x7F; // 设置T0为12T模式,即12分频
  55.   TMOD &= 0xF0; // 设置T0为16位自动重载定时器模式且无需上拉 INT0 引脚
  56.   // 设置定时 1ms
  57.   TL0 = 0x30; // 定时器T0设置低八位起始值
  58.   TH0 = 0xF8; // 定时器T0设置高八位起始值
  59.   TF0 = 0; // T0 溢出标志
  60.   TR0 = 1; // T0 运行控制位
  61.   ET0 = 1; // T0 开关
  62.   EA = 1;  // 中断总开关
  63. }
  64. long TMP = 0;
  65. BYTE pos = 0;
  66. BYTE unit = 0;
  67. unsigned long pow = 0;
  68. void main()
  69. {
  70.   sys_init();
  71.   usb_init();
  72.   set_interrupt();
  73.   P7M0 = 0;
  74.   P7M1 = 0;
  75.   P6M0 = 0;
  76.   P6M1 = 0;
  77.   P3M0 = 0x00;
  78.   P3M1 = 0x00;
  79.   P3PU |= 0x30;
  80.   while (1)
  81.   {
  82.     if (ADD_TIGGER == 0)
  83.     {
  84.       delay_ms(10);
  85.       if (ADD_TIGGER == 0)
  86.       {
  87.         PASS_COUNT++;
  88.         delay_ms(10);
  89.       }
  90.     }
  91.     else if (SUB_TIGGER == 0)
  92.     {
  93.       delay_ms(10);
  94.       if (SUB_TIGGER == 0)
  95.       {
  96.         PASS_COUNT--;
  97.         delay_ms(10);
  98.       }
  99.     }
  100.     else if (ZERO_TIGGER == 0)
  101.     {
  102.       delay_ms(10);
  103.       while (ZERO_TIGGER == 0)
  104.         ;
  105.       PASS_COUNT = 0;
  106.     }
  107.     if (PASS_COUNT >= 99999999)
  108.       PASS_COUNT = 99999999;
  109.     if (PASS_COUNT < -9999999)
  110.       PASS_COUNT = -9999999;
  111.     TMP = PASS_COUNT < 0 ? -PASS_COUNT : PASS_COUNT;
  112.     for (pos = 0; pos < 8; pos++)
  113.     {
  114.       pow = pos > 0 ? 10 : 1;
  115.       for (unit = 1; unit < pos; unit++)
  116.       {
  117.         pow *= 10;
  118.       }
  119.       if (pos == 7)
  120.       {
  121.         if (PASS_COUNT < 0)
  122.         {
  123.           DATA[7] = 0xBF;
  124.           continue;
  125.         }
  126.       }
  127.       DATA[pos] = NUM_DATA[(TMP / pow) % 10  + (TMP > (pow - 1) ? 1 : 0)];
  128.     }
  129.   }
  130. }
  131. BYTE index = 0;
  132. void T0_run(void) interrupt 1
  133. {
  134.   SHARE = UNIT_MAP[index];
  135.   CONTROL = DATA[index];
  136.   index++;
  137.   if (index > 7)
  138.   {
  139.     index = 0;
  140.   }
  141. }
复制代码





回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-02-18 09:33:29

1

主题

32

回帖

486

积分

中级会员

积分
486
发表于 2024-6-29 18:22:26 | 显示全部楼层
本帖最后由 CListery 于 2024-7-1 15:45 编辑

第十七课:
1. 学习 T1 计数器的使用
2. 学习 IO 口内部上拉设置
3. 89C52 单片机使用 T1 计数器反转 LED
  1. #include <reg52.h>
  2. sbit LED = P1^0;
  3. void main()
  4. {
  5. //        AUXR &= 0xBF;                        //定时器时钟12T模式
  6.         TMOD &= 0x0F;                        //设置定时器模式
  7.   TMOD = 0x40;
  8.   
  9.         TL1 = 0xFF;                                //设置定时初始值
  10.         TH1 = 0xFF;                                //设置定时初始值
  11.   
  12.         TF1 = 0;                                //清除TF1标志
  13.         TR1 = 1;                                //定时器1开始计时
  14.   
  15.         ET1 = 1;                                //使能定时器1中断
  16.   EA = 1;
  17.   
  18.   while(1);
  19. }
  20. void Timer1_Isr(void) interrupt 3
  21. {
  22.         TL1 = 0xFF;                                //设置定时初始值
  23.         TH1 = 0xFF;                                //设置定时初始值
  24.   
  25.   LED = !LED;
  26.   
  27. }
复制代码
4. 更新开发板代码
  1. #include <STC32G.H>
  2. #include <STC32_STC8_USB.H>
  3. char *USER_DEVICEDESC = NULL;
  4. char *USER_PRODUCTDESC = NULL;
  5. char *USER_STCISPCMD = "@STCISP#";
  6. #define LED P67
  7. void sys_init()
  8. {
  9.   WTST = 0;
  10.   EAXFR = 1;
  11.   CKCON = 0;
  12. }
  13. void set_interrupt()
  14. {
  15.   AUXR = 0x40; // 设置T1为1T模式,即不分频
  16.   TMOD = 0x40; // 设置T1为16位自动重载计数器模式且无需上拉 INT1 引脚
  17.   // 设置外部 P3.5 拉低一次触发一次中断
  18.   TL1 = 0xFF; // 计数器T1设置低八位起始值
  19.   TH1 = 0xFF; // 计数器T1设置高八位起始值
  20.   TF1 = 0; // T1 溢出标志
  21.   TR1 = 1; // T1 运行控制位
  22.   ET1 = 1; // T1 开关
  23.   EA = 1;  // 中断总开关
  24. }
  25. void main()
  26. {
  27.   sys_init();
  28.   usb_init();
  29.   set_interrupt();
  30.   P4M0 = 0;
  31.   P4M1 = 0;
  32.   P6M0 = 0;
  33.   P6M1 = 0;
  34.   P3PU |= 0x30;
  35.   P40 = 0;
  36.   while (1)
  37.     ;
  38. }
  39. void T1_run(void) interrupt 3
  40. {
  41.   LED = !LED;
  42. }
复制代码






回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:429
  • 最近打卡:2025-05-08 00:01:49
已绑定手机

19

主题

3196

回帖

4956

积分

论坛元老

积分
4956
发表于 2024-6-29 20:24:45 来自手机 | 显示全部楼层
TL1 = 0xFF;  TH1 = 0xFF;这个是定时器t1最大值,加1就溢出。这样led效果是常亮吧,且亮度不是很大。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-02-18 09:33:29

1

主题

32

回帖

486

积分

中级会员

积分
486
发表于 2024-6-30 19:43:54 | 显示全部楼层
so*** 发表于 2024-6-29 20:24
TL1 = 0xFF;  TH1 = 0xFF;这个是定时器t1最大值,加1就溢出。这样led效果是常亮吧,且亮度不是很大。 ...

最大值是65536溢出,我设定的初始值是65535,所以只要按一次外部计时器对应的按键就会触发一次计数器中断,然后就会重置 TL1 和 TH1 然后反转 LED 的高低电平
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-9 03:04 , Processed in 0.144959 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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