打印
[51单片机]

零基础学单片机——单片机篇【I/O端口篇】

[复制链接]
9477|53
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 51armfpga 于 2014-6-23 22:56 编辑

实验一
效果:


链接:http://v.youku.com/v_show/id_XNzI5OTAxMDc2.html

实验二
效果:


链接:http://v.youku.com/v_show/id_XNzI5OTAxMTU2.html

实验三
效果:



链接:http://v.youku.com/v_show/id_XNzI5OTAxMzMy.html

源码工程文件下载:
实验一:
实验一闪烁灯.zip (25.13 KB)
实验二:
实验二流水灯.zip (23.83 KB)
实验三:
实验三花样灯.zip (27.86 KB)

仿真一: 实验一闪烁灯.zip (70.12 KB)

仿真二: 实验二流水灯.zip (68.84 KB)

仿真三: 实验三花样灯.zip (72.88 KB)


教程PDF格式下载:
第三课 IO端口篇.pdf (742.49 KB)

1.  实验简介
本节课主要学习如何通过单片机的I/O口控制LED灯,学会延时函数的使用。实验一是控制LED灯的闪烁,实验二是实现LED灯的流水效果,实验三是实现LED灯的花样格式。学以致用,举一反三,根据前面三个实验来完成一个交通灯程序,就表示已掌握单片机I/O口的控制。
2.  基础知识
发光二极管是半导体二极管的一种,可以把电能转换成光能,通常简称为LED。
发光二极管与普通二极管一样也是单向导通的,给它加上正向电压,它就会发光。发光二极管的发光亮度与通过的电流成正比,一般情况下LED的工作电流在10mA左右,若电流过大时会损坏LED,因此使用时必须串联限流电阻以控制通过管子的电流。限流电阻计算公式是:
R=(E-UF)/IF
E为电源电压,UF为LED的正向压降,IF为LED的一般工作电流。普通发光二极管正向饱和压降为1.4~2.1V,正向工作电流为5~20mA。
原理图如图3-1所示:


                              
图3-1
根据公式计算R=(E-UF)/IF,UF取值范围是1.4~2.1V,IF取值范围是5-20mA,R的取值范围是:145欧姆~720欧姆,本原理图中取值为200欧姆
         SN74HC573是高性能硅门 CMOS 器件,跟 LS/AL573 的管脚一样。器件的输入是和标准 CMOS 输出兼容的;加上拉电阻,他们能和 LS/ALSTTL 输出兼容。
当锁存使能端为高时,这些器件的锁存对于数据是透明的(也就是说输出同
步)。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。
    SN74HC573的真值表如图3-2所示:


图3-2
3.  实验环境3.1    软件环境
Keil4编译软件、STC下载软件、Protues仿真软件
3.2    硬件环境
志慧单片机开发板、5V电源适配器、串口线
4.  实验一(闪烁灯)
单片机最小系统图如图3-3所示:


图3-3
LED是通过P1口来控制的。如果想实现LED的闪烁,就需要P1口一会输出高电平,一会输出低电平。中间延时采用延时函数来实现。根据SN74HC573真值表知,LE为高电平时,输出状态与输入状态保持一致,因此需要把LE位设置为高电平,单片机管脚默认为高,也可以不设置。
程序源码如下:
#include<reg52.h>        //包含头文件,头文件包含特殊功能寄存器的定义
#define uchar unsigned char //宏定义,用uchar代替unsigned char
#define uint unsigned int   //宏定义,用uint代替unsigned int
void DelayMS(uint x)        //延时子函数
{
   uchar i;
   while(x--)
   {
      for(i=120;i>0;i--);
   }
}
void main (void)
{               
   while (1)       //主循环
   {           
      P1 = 0xFF;      //P1口全部为高电平,对应的LED灯全灭掉         
         DelayMS(150);   //延时
      P1 = 0x00;      //P1口全部为低电平,对应的LED灯全亮               
         DelayMS(150);   //延时
   }
}
建立工程文件,把源程序添加进去,编译生成.HEX文件,工程文件见上传文件。通过STC下载软件下载到单片机中,效果就是8个LED小灯一直闪烁。往单片机下载步骤下面简单介绍一下。首先打开STC下载软件,如图3-4所示:


图3-4
    先执行第一步,点击黑色三角箭头,找到开发板上对应的单片机型号,目前使用的型号是STC89C52。
    第二步打开程序文件,点击后会出现一个对话框,找到源程序目录,里面会有一个“闪烁灯.HEX”文件,双击或单击后,点确认按钮。
    第三步选择COM口,根据电脑上安装的驱动,选择正确后,右边有个绿色的指示灯会亮。
    第四步点击Download/下载,程序开始下载,下载成功后,在最下边的对话框中会提示程序下载成功。
    程序下载到开发板后,现象如图3-5、图3-6所示:


图3-5


图3-6


相关帖子

沙发
51armfpga|  楼主 | 2014-6-22 21:22 | 只看该作者
本帖最后由 51armfpga 于 2014-6-22 21:48 编辑

5.  实验二(流水灯)
原理图与实验一样,实现的效果是流水,程序源码如下:
#include<reg52.h>                                            //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
/*-----------------------------------------------
   延时子程序
------------------------------------------------*/
void delay(unsigned int cnt)
{
         while(--cnt);
}
/*------------------------------------------------
   主函数
------------------------------------------------*/
main()
{
         P1=0xFE;                                                 //给初始化值 换算成二进制是1111 1110
         while(1)
         {
                   delay(30000);                               //延时程序
                   P1<<=1;                                      //左移一位 该语句等效于 P1=P1<<1
                   P1|=0x01;                                   //最后一位补1,该语句等效于P1=P1|0x01 符号"|"表示""
                   if(P1==0x7f)                               //检测是否移到最左端?"=="表示检测符号2端的值是否相等
                   {
                            delay(30000);
                            P1=0xFE;                            //重新赋值
                   }
         }
}
6.  实验三(花样灯)
花样灯一般有两种方法实现:
1、程序循环执行。
2、查表法。这里我们两种都使用一下。

程序源码如下所示:
#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <reg52.h>
/******************************************************************/
/*                   花样表格                                                */
/******************************************************************/
unsignedchar codeseg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0x00,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加
/******************************************************************/
/*                    延时函数                                               */
/******************************************************************/
void delay(unsigned int cnt)//简易延时
{
         while(--cnt);
}
/******************************************************************/
/*                    主函数                                                 */
/******************************************************************/
main()
{
         unsignedchar i;
         while(1)
         {
                   P1=0xFE;                   //第一个LED亮,然后右移
                   for(i=0;i<8;i++)
                   {
                            delay(10000);
                            P1<<=1;
                   }
                  P1=0x7F;                   //第七个LED亮,然后左移
                  for(i=0;i<8;i++)
                  {
                            delay(10000);
                            P1>>=1;
                  }
                  P1=0xFE;                  //第一个LED亮,右移,移过之后小灯灭
                  for(i=0;i<8;i++)
                  {
                           delay(10000);
                           P1<<=1;
                           P1|=0x01;
                 }
                 P1=0x7F;                  //第七个LED亮,左移,移过之后小灯灭
                 for(i=0;i<8;i++)
                 {
                           delay(10000);
                           P1>>=1;
                           P1|=0x80;
                 }
                 /*下面通过查表方法获得花样参数*/
                 for(i=0;i<16;i++)//查表可以简单的显示各种花样实用性更强
                 {
                          delay(20000);
                          P1=seg;
                 }
        }
}
7.  课后作业
       根据前面三个实验,利用两个红灯,两个黄灯,两个绿灯,实现十字路**通灯的切换过程与显示效果。

使用特权

评论回复
板凳
51armfpga|  楼主 | 2014-6-22 22:00 | 只看该作者
自己坐个沙发

使用特权

评论回复
地板
trustmea| | 2014-6-23 09:03 | 只看该作者
必须点赞!辛苦楼主

使用特权

评论回复
5
wsnsyy| | 2014-6-23 09:45 | 只看该作者
有比較複雜的項目嗎

使用特权

评论回复
6
51armfpga|  楼主 | 2014-6-23 11:32 | 只看该作者
trustmea 发表于 2014-6-23 09:03
必须点赞!辛苦楼主

谢谢支持!大家的支持,就是我的动力的来源!

使用特权

评论回复
7
51armfpga|  楼主 | 2014-6-23 11:35 | 只看该作者
wsnsyy 发表于 2014-6-23 09:45
有比較複雜的項目嗎

教程的初衷是帮助初学者一步步深入,从简单到复杂,从浅入深,如果你有其他项目,欢迎探讨!交流QQ:2659533057

使用特权

评论回复
8
51armfpga|  楼主 | 2014-6-23 22:57 | 只看该作者
上传了仿真,有需要的,可以下载看看。

使用特权

评论回复
9
wsnsyy| | 2014-6-24 09:31 | 只看该作者
51armfpga 发表于 2014-6-23 11:35
教程的初衷是帮助初学者一步步深入,从简单到复杂,从浅入深,如果你有其他项目,欢迎探讨!交流QQ:2659 ...

想看看真正的項目到底是怎麼做的

使用特权

评论回复
10
51armfpga|  楼主 | 2014-6-24 10:47 | 只看该作者
wsnsyy 发表于 2014-6-24 09:31
想看看真正的項目到底是怎麼做的

真正的项目就是根据客户要求,实现功能,做到稳定,稳定是关键。

使用特权

评论回复
11
51armfpga|  楼主 | 2014-6-25 22:58 | 只看该作者
再顶一下

使用特权

评论回复
12
liubaiwan8888| | 2014-6-28 09:05 | 只看该作者
顶一个,楼主辛苦了

使用特权

评论回复
13
liubaiwan8888| | 2014-6-28 09:05 | 只看该作者
楼主,我连顶你32下

使用特权

评论回复
14
51armfpga|  楼主 | 2014-6-29 22:44 | 只看该作者
liubaiwan8888 发表于 2014-6-28 09:05
楼主,我连顶你32下

谢谢您的支持!

使用特权

评论回复
15
机电控制| | 2014-6-30 07:34 | 只看该作者
越基础越好

使用特权

评论回复
16
51armfpga|  楼主 | 2014-6-30 12:08 | 只看该作者
机电控制 发表于 2014-6-30 07:34
越基础越好

一步步深入,从最简单开始。

使用特权

评论回复
17
筱沐鱼| | 2014-7-1 22:23 | 只看该作者
谢谢啊  有用的对我们  谢谢啊

使用特权

评论回复
18
弥勒开怀笑| | 2014-7-2 10:18 | 只看该作者
[em:2:]

使用特权

评论回复
19
skytome123| | 2014-7-2 18:12 | 只看该作者
感谢分享。很有用

使用特权

评论回复
20
autopccopy| | 2014-7-2 21:12 | 只看该作者
顶,适合51初学者!大师也是从点亮LED开始的~~~呵呵~~~~

(791)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:交流QQ:  2659533057 交流网址:http://shop111345649.taobao.com/

17

主题

150

帖子

38

粉丝