[关闭]
@Guozhongzhi 2016-10-24T14:39:59.000000Z 字数 1988 阅读 2617

独立按键实验实验报告

微机原理实验 郭忠智201301020087


一、实验目的

(1)用按键控制流水灯的流动方向、速度等。
(2)熟悉用C语言进行程序的编写以及程序的编译和烧写。
(3)熟悉Keil和STC-ISP软件的使用等。

二、实验原理

实验原理图如下:

image_1avrf3v91r0k1q8hbrmbq187t9.png-84.1kB

图1

image_1avrf4oij82j1ra3150s13add23m.png-55kB

图2

三、实验步骤

(1)打开Keil编译器,创建项目:Project---New uVision Project,
创建一个文件夹来放工程相关的文件,给工程项目命名为my work,点击保存。
(2)创建一个文件夹来放工程相关的文件,给工程项目命名,点击保存。
(3)选择芯片类型,这里选择ATMEL------AT89C52这个芯片。
(4)创建C文件。点击完之后,保存文档。注意,我们保存要跟工程项目保存在同一个文件夹下。注意保存文档的时候,后缀一定是要.C(C文件)
(5)然后把C文件添加到我们的工程文件里。点击之前保存的C文件,然后点击Add,就可以添加到工程目录中.
(6)创建成功后,在test.c这个文档里编辑代码。
(7)编译通过之后,输出hex文件,也就是单片机可执行的二进制文件。
(8)利用STC-ISP将编写好的程序烧写进单片机中。
(9)如下图连接试验相关模块连线:
image_1avrfgcc71oce480130d1lhr4l2a.png-454.3kB

图3

 JP165跳线帽断开
 JP10连接J12
 JP5连接JP8
 J21接左边

四、程序设计内容

(1)开关状态的检测过程
单片机对开关状态的检测相对于单片机来说,是从单片机的P1.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1按下去,即输入低电平,相当开关闭合,当松开开关K1,即输入高电平,相当开关打开。
(2)输出控制
如原理图1和图3所示,当P1.0端口输出低电平,即P1.0=0时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出高电平,即P1.0=1时,发光二极管L1亮。所以通过对P1.0端口的设置就可以控制灯的亮灭。
(3)延时程序的设置
因为单片机的指令的执行的时间很短,数量级为级,因此,我们要求的闪烁时间间隔要长一些,否则人眼根本无法识别到灯的闪烁效果。于是我们在执行某一指令时,插入延时程序,来达到我们的增加亮灯时长的效果。

五、实验代码

  1. #include <reg52.h>
  2. #define unum unsigned int
  3. void delay(unum ms);
  4. void right_fast(unum i);
  5. void right_slow(unum i);
  6. void left_fast(unum i);
  7. void left_slow(unum i);
  8. /*****************************赋值初始化**************************/
  9. sbit k1 = P1^0;
  10. sbit k2 = P1^1;
  11. sbit k3 = P1^2;
  12. sbit k4 = P1^3;
  13. /*****************************主函数******************************/
  14. void main()
  15. {
  16. P1 = 0xff;
  17. while(1)
  18. {
  19. if(k1 == 0)
  20. {
  21. righr_slow(10000);
  22. }
  23. if(k2 == 0)
  24. {
  25. left_slow(10000);
  26. }
  27. if(k3 == 0)
  28. {
  29. right_fast(5000);
  30. }
  31. if(k4 == 0)
  32. {
  33. left_fast(5000);
  34. }
  35. }
  36. }
  37. /************************控制左移右移函数*************************/
  38. void right_fast(unum i)
  39. {
  40. unum j;
  41. P0 = 0x80;
  42. for(j = 0; j < 8; j ++)
  43. {
  44. delay(i);
  45. P0 = P0 / 2
  46. }
  47. }
  48. void right_slow(unum i)
  49. {
  50. unum j;
  51. P0 = 0x80;
  52. for(j = 0; j < 8; j ++)
  53. {
  54. delay(i);
  55. P0 = P0 / 2
  56. }
  57. }
  58. void left_fast(unum i)
  59. {
  60. unum j;
  61. P0 = 0x01;
  62. for(j = 0; j < 8; j ++)
  63. {
  64. delay(i);
  65. P0 = P0 * 2
  66. }
  67. }
  68. void left_slow(unum i)
  69. {
  70. unum j;
  71. P0 = 0x01;
  72. for(j = 0; j < 8; j ++)
  73. {
  74. delay(i);
  75. P0 = P0 * 2
  76. }
  77. }
  78. /******************************延时函数***************************/
  79. void delay(unum ms)
  80. {
  81. unum i , j;
  82. for (i = ms; i > 0; i --)
  83. for (j = 850; j > 0; j --)
  84. }

六、实验现象

当按住K1键不放时,一颗亮的流水灯慢速右移;
当按住K2键不放时,一颗亮的流水灯慢速左移;
当按住K2键不放时,一颗亮的流水灯快速右移;
当按住K3键不放时,一颗亮的流水灯快速左移。

七、结论

通过以上实验,认识到了程序设计严谨的逻辑性以及代码格式的重要性,此次实验也学会了给位进行数值的传递的代码的写法。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注