• 51单片机使用两个按钮控制LED灯不同频率的闪烁


    1. #include
    2. sbit button1 = P1^1; // 间隔2秒的按钮
    3. sbit button2 = P1^5; // 间隔0.6秒的按钮
    4. sbit led = P1^3;
    5. unsigned int cnt1 = 0; // 设置LED1灯的定时器溢出次数
    6. unsigned int cnt2 = 0; // 设置LED2灯的定时器溢出次数
    7. unsigned int flg1 = 0; // 模式1的标识值
    8. unsigned int flg2 = 0; // 模式2的标识值
    9. unsigned int flg = 0; // 选择模式方式 1或者2
    10. // 模式1灯的闪烁逻辑
    11. void enableled(){
    12. if(TF0) // 定时器T0溢出
    13. {
    14. TF0 = 0; // 清除溢出标志
    15. TH0 = 0xB8; // 设置重置值,定时1s
    16. TL0 = 0x00;
    17. cnt1++;
    18. // 间隔 0.02*100 = 2秒
    19. if(cnt1 > 100){
    20. cnt1 = 0;
    21. led = !led; // 翻转LED1状态
    22. }
    23. }
    24. }
    25. // 模式2灯的闪烁模式
    26. void enableled2(){
    27. if(TF1) // 定时器T1溢出
    28. {
    29. TF1 = 0; // 清除溢出标志
    30. TH1 = 0xB8; // 设置重置值;
    31. TL1 = 0x00;
    32. cnt2++;
    33. // 间隔 0.02*30 = 0.6秒
    34. if(cnt2 > 30){
    35. cnt2 = 0;
    36. led = !led; // 翻转LED1状态
    37. }
    38. }
    39. }
    40. // 定时器T0
    41. void Init_Timer0()
    42. {
    43. TMOD |= 0x01;; // 定时器T0工作在模式1
    44. TH0 = 0xB8; // 设置重置值,高位 定时0.02秒 a = 1/11.0592(时钟周期) b = 12* a (机器周期) (256*256 -1) - ( 0.02 / b )
    45. TL0 = 0x00; //设置重置值,低位
    46. TR0 = 1; // 启动T0
    47. }
    48. // 定时器T1
    49. void Init_Timer1()
    50. {
    51. TMOD |= 0x10;; // 定时器T1工作在模式1
    52. TH1 = 0xB8; // 设置重置值,高位 定时0.02秒 a = 1/11.0592(时钟周期) b = 12* a (机器周期) (256*256 -1) - ( 0.02 / b )
    53. TL1 = 0x00; //设置重置值,低位
    54. TR1 = 1; // 启动T0
    55. }
    56. void main(){
    57. while(1){
    58. // 当按钮1按下时, 使用的上拉电阻模式
    59. if(button1 == 0) {
    60. flg1 = 1; // 按钮1的flg初始值为1;
    61. flg2 = 3; // 按钮2的flg置为3;
    62. flg = 1; // 当前的运行模式是1;
    63. } else {
    64. flg1 = 2; // 如果按钮1没有按下,就设状态是2;
    65. }
    66. // flg1状态是1时,初始化T0;
    67. if(flg1 == 1){
    68. Init_Timer0();
    69. // flg1状态是2 时,并且没有启用按钮2;让灯按照模式1闪烁;
    70. } else if (flg1 == 2 && flg == 1) {
    71. enableled();
    72. // 其他状态不需要闪烁
    73. } else {
    74. ;
    75. }
    76. // 当按钮2按下时
    77. if(button2 == 0) {
    78. flg2 = 1; // 按钮2的flg初始值为1;
    79. flg1 = 3; // 按钮1的flg置为3;
    80. flg = 2; // 当前的运行模式是2;
    81. } else {
    82. flg2 = 2; // 如果按钮2没有按下,就设状态是2;
    83. }
    84. // flg2状态是1时,初始化T1;
    85. if(flg2 == 1){
    86. Init_Timer1();
    87. // flg2状态是2 时,并且没有启用按钮1;让灯按照模式2闪烁;
    88. } else if (flg2 == 2 && flg == 2){
    89. enableled2();
    90. // 其他状态不需要闪烁
    91. } else {
    92. ;
    93. }
    94. }
    95. }

  • 相关阅读:
    C# 移除链表元素
    Java集合实现(二) HashMap源码以及手写HashMap
    内置MOS升压芯片FP6293 双节锂升压8.4V/1A
    交叉验证太重要了!
    高性能限流器Guava RateLimiter
    Hive调优方法
    GPIO实验
    代码随想录Day_57打卡
    ElasticSearch搜索引擎:数据的写入流程
    MySQL-MVCC多版本控制及事务的隔离性
  • 原文地址:https://blog.csdn.net/Llingmiao/article/details/138096746