• #循循渐进学5单片机#中断与数码管动态显示#not.5


    1、掌握C语言数组的概念、定义和应用。

    1)数组是一组变量,这组变量需要满足三个条件:

    具有相同的数组类型

    具有相同的名字

    存储器中是连续的

    2)声明和初始化

    数组类型 数组名【数组长度

    数组类型 数组名【数组长度】 = {初值列表}

    3)使用和赋值注意现象

    区分数组下标和数组元素的个数的概念

    数组元素下标可以是常量或变量或表达式,初始化必须是常量

    数组整数赋值只能在初始化进行,程序只能单个元素赋值


    2、掌握if语句和switch语句的用法及区别,编程的时候能够正确选择使用哪个语句。

    最详细的if语句和switch语句归纳资料:https://blog.csdn.net/2301_77479336/article/details/130087491?spm=1001.2014.3001.5501


    3、彻底理解中断的原理和应用方法,关闭教程自己独立把本章节程序编写完毕下载实践。

    中断的介绍

    比如说我正在厨房用煤气烧一壶水,这样就只能守在厨房里,苦苦等着水开--如果水溢出来浇
    灭了煤气,有可能就要发生一场灾难了。门外忽然又传来了铿锵有力的歌声,我最喜欢的天龙八部要开演了,听着水壶发出“咕嘟咕嘟”的声音,我清楚:除非等到水开,否则没有我享受人生的时候。
    这个场景跟中断有什么关系呢?

    在这个场景中,我是唯一具有处理能力的主体,不管是烧水、还是看电视,同一个时间点上我只
    能干一件事情。但是,在我专心致志干一件事情时,总有许多或紧迫或不紧迫的事情突然出现在
    面前,都需要去关注,有些还需要我停下手头的工作马上去处理。只有在处理完之后,方能回头
    完成先前的任务。中断机制不仅赋予了我处理意外情况的能力,如果我能充分发挥这个机制的妙用,就可以“同时”完成多个任务了。

    事实上烧水需要10分钟完成,但是提下水壶和关煤气我只要几秒钟就可以完成。为了这几秒,我
    需要在厨房等候10分钟。如果使用闹钟定时10分钟,10分钟一到,闹钟就会提醒我该去关煤气
    了,那么我就可以去安心看电视了。实际上就是用了闹钟这样一个中断信号来提示我完成提水壶和关煤气的任务。

    2)


    4、尝试修改程序,让我们的数码管只显示有效位,也就是高位的0不显示。

    1. #include <REGX52.H>
    2. sbit addr0 = P1^0;
    3. sbit addr1 = P1^1;
    4. sbit addr2 = P1^2;
    5. sbit addr3 = P1^3;
    6. sbit ENLED = P1^4;
    7. unsigned char code LedChar[] = {
    8. 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    9. 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
    10. };
    11. unsigned char LedBuff[6] = {
    12. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
    13. };
    14. unsigned int flag1s = 0;
    15. unsigned int cnt = 0,i = 0;
    16. void main()
    17. {
    18. char arr;
    19. unsigned long sec = 0;
    20. unsigned int buf[6];
    21. EA = 1;
    22. ENLED = 0;
    23. addr3 = 1;
    24. TMOD = 0x01;
    25. TH0 = 0xfc;
    26. TL0 = 0x67;
    27. ET0 = 1;
    28. TR0 = 1;
    29. while(1)
    30. {
    31. if (flag1s == 1) //ÅжÏ1Ã붨ʱ±êÖ¾
    32. {
    33. flag1s = 0;
    34. sec++;
    35. buf[0] = sec%10;
    36. buf[1] = sec/10%10;
    37. buf[2] = sec/100%10;
    38. buf[3] = sec/1000%10;
    39. buf[4] = sec/10000%10;
    40. buf[5] = sec/100000%10;
    41. for(arr = 5;arr >=1;arr--)
    42. {
    43. if(buf[arr] == 0)
    44. LedBuff[arr] = 0xff;
    45. else
    46. break;
    47. }
    48. for(;arr >=0;arr--)
    49. {
    50. LedBuff[arr] = LedChar[buf[arr]];
    51. }
    52. }
    53. }
    54. }
    55. void InterruptTimer0() interrupt 1
    56. {
    57. TH0 = 0xfc;
    58. TL0 = 0x67;
    59. cnt++;
    60. if(cnt >= 1000)
    61. {
    62. cnt = 0;
    63. flag1s = 1;
    64. }
    65. P0 = 0xff;
    66. switch (i)
    67. {
    68. case 0 :addr0 = 0;addr1 = 0;addr2 = 0;P0 = LedBuff[0];i++;break;
    69. case 1 :addr0 = 1;addr1 = 0;addr2 = 0;P0 = LedBuff[1];i++;break;
    70. case 2 :addr0 = 0;addr1 = 1;addr2 = 0;P0 = LedBuff[2];i++;break;
    71. case 3 :addr0 = 1;addr1 = 1;addr2 = 0;P0 = LedBuff[3];i++;break;
    72. case 4 :addr0 = 0;addr1 = 0;addr2 = 1;P0 = LedBuff[4];i++;break;
    73. case 5 :addr0 = 1;addr1 = 0;addr2 = 1;P0 = LedBuff[5];i=0;break;
    74. default:break;
    75. }
    76. }


    5、尝试写一个从999999开始倒计时的程序,并且改用定时器T1的中断来完成,通过写这个程序来掌握定时器和中断的应用。

    1. #include <REGX52.H>
    2. sbit addr0 = P1^0;
    3. sbit addr1 = P1^1;
    4. sbit addr2 = P1^2;
    5. sbit addr3 = P1^3;
    6. sbit ENLED = P1^4;
    7. unsigned char code LedChar[] = {
    8. 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    9. 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
    10. };
    11. unsigned char LedBuff[6] = {
    12. 0x90, 0x90, 0x90, 0x90, 0x90, 0x90
    13. };
    14. unsigned int flag1s = 0;
    15. unsigned int cnt = 0,i = 0;
    16. void main()
    17. {
    18. char arr;
    19. unsigned long sec = 0;
    20. unsigned int buf[6];
    21. EA = 1;
    22. ENLED = 0;
    23. addr3 = 1;
    24. TMOD = 0x01;
    25. TH0 = 0xfc;
    26. TL0 = 0x67;
    27. ET0 = 1;
    28. TR0 = 1;
    29. while(1)
    30. {
    31. if (flag1s == 1) //ÅжÏ1Ã붨ʱ±êÖ¾
    32. {
    33. flag1s = 0;
    34. sec++;
    35. buf[0] = sec%10;
    36. buf[1] = sec/10%10;
    37. buf[2] = sec/100%10;
    38. buf[3] = sec/1000%10;
    39. buf[4] = sec/10000%10;
    40. buf[5] = sec/100000%10;
    41. for(arr = 5;arr >=0;arr--)
    42. {
    43. LedBuff[arr] = LedChar[9-buf[arr]];
    44. }
    45. }
    46. }
    47. }
    48. void InterruptTimer0() interrupt 1
    49. {
    50. TH0 = 0xfc;
    51. TL0 = 0x67;
    52. cnt++;
    53. if(cnt >= 1000)
    54. {
    55. cnt = 0;
    56. flag1s = 1;
    57. }
    58. P0 = 0xff;
    59. switch (i)
    60. {
    61. case 0 :addr0 = 0;addr1 = 0;addr2 = 0;P0 = LedBuff[0];i++;break;
    62. case 1 :addr0 = 1;addr1 = 0;addr2 = 0;P0 = LedBuff[1];i++;break;
    63. case 2 :addr0 = 0;addr1 = 1;addr2 = 0;P0 = LedBuff[2];i++;break;
    64. case 3 :addr0 = 1;addr1 = 1;addr2 = 0;P0 = LedBuff[3];i++;break;
    65. case 4 :addr0 = 0;addr1 = 0;addr2 = 1;P0 = LedBuff[4];i++;break;
    66. case 5 :addr0 = 1;addr1 = 0;addr2 = 1;P0 = LedBuff[5];i=0;break;
    67. default:break;
    68. }
    69. }

  • 相关阅读:
    手绘板的制作——重置与橡皮擦(2)
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园二手物品交易系统051x4
    linux正则表达式
    QT中Shader类与多VAO、VBO的使用
    【DSP】【第二篇】了解C6678和创建工程
    RocketMQ存储设计的奥妙
    02 统计基本概念
    6、规划绩效域
    Maven3.6.2安装详细教程
    HbuildX的发行有什么用?
  • 原文地址:https://blog.csdn.net/2301_77479336/article/details/132841655