2017-06-18 19:16:00 weixin_30877181 阅读数 33
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3411 人正在学习 去看看 朱有鹏

一、简述问题

当你用单片驱动发光二极管的时,你还感觉不到P0、P1口的差别。(10-20mA之间,当中P0驱动能力最强,但对于驱动直流电机依旧非常弱。其结果就是电机不转)。那么有什么办法提高驱动能力吗?以下就来介绍本文的一种简单方法。

二、实验元件

NPN三极管:s8050  (管脚序列为:EBC)      元件介绍:http://baike.baidu.com/view/3467208.htm?fr=aladdin

推断方法:平面对着自己。三个管脚朝下,从左到右依次为 (E 发射极)、(B基极)、 (C集电极) 

 2个1.5K电阻(串联发光二极管)

 1个3K电阻(串联于P2^2和三极管B极之间)

三、实验原理图


四、对照实验

原理:通过直接用I/O口。串联1.5K电阻驱动发光二极管 VS 通过s8050上述方法驱动发光二极管,依据发光亮度对照驱动能力。

效果图:




五、实验结果

通过对照亮度,能够明显发现用此方法的驱动能力明显高于,直接I/o口。

另外,用直流电机实验。结果是io口直接不能驱动(电机不转),而此方法能够完美驱动。

(该方法也可用于驱动数码管。获得较高亮度)

posted on 2017-06-18 19:16 mthoutai 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/mthoutai/p/7045026.html

2018-05-23 09:44:09 honorwh 阅读数 6520
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3411 人正在学习 去看看 朱有鹏

实验内容:

利用P1口做输出口,接八只发光二极管,编写程序是发光二极管循环点亮或者具有一定的花样。

1.第一个发光二极管以间隔200ms闪烁;

2.8个发光二极管由上至下间隔,1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去;

3.8个发光二极管来回流动,每个管亮100ms,流动时让蜂鸣器发出“滴滴”声;

4.用8个发光二极管演示出8位二进制数累加过程,结合两个开关(一加一减)实现加减运算;

5.8个发光二极管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁5次,重复此过程;

6.间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复此过程;

7.间隔300ms先奇数亮再偶数亮,循环三次,一个灯上下循环三次,两个分别从两边往中间流动三次,再从中间往两边流动三次,8个全部闪烁3次,关闭发光管,程序停止。


仿真图:


1.第一题简单,不上代码了><

2.源码:

#include <reg52.h>   
#include <intrins.h>
#define uchar unsigned char
sbit buzzer=P3^7;                                //定义引脚
void delay(uchar z)                               //延时函数
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
uchar a,i;
while(1)
{
a=0xfe;
for(i=0;i<8;i++)
{P1=a;
buzzer=0;
delay(250);
P1=0xff;                                //起到消隐作用
buzzer=1;
delay(250);
a=_crol_(a,1);                        //左移函数
}
}
}

3.源码:

#include <reg52.h>   
#include <intrins.h>
#define uchar unsigned char
sbit buzzer=P3^7;
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
uchar a,i;
while(1)
{
a=0xfe;                    //第一个灯先亮
for(i=0;i<8;i++)
{
P1=a;
buzzer=0;
delay(250);
buzzer=1;
delay(250);
a=_crol_(a,1);
}
a=0x7f;                    //倒数第一个灯先亮,形成来回流动
for(i=0;i<8;i++)
{
P1=a;
buzzer=0;
delay(250);
buzzer=1;
delay(250);
a=_cror_(a,1);
}
}

}

4.源码:

#include<reg52.h>  
#include<intrins.h>   
#define uchar unsigned char  
void delay(uchar z)  
{     
uchar x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--); 
}
void main()      
{
uchar a;
while(1)        
{
  a++;
  P1=~a;                    //按位取反
  delay(200);
}

}

5.源码:

#include<reg52.h>  
#include<intrins.h>  
#define uchar unsigned char  
uchar aa;  
void delay(uchar z);  
void main()  
{  
    uchar i,j,k;  
    while(1)  
    {  
        for(i=0;i<2;i++)  
        {  
            aa=0xfe;  
            for(j=0;j<7;j++)  
            {  
                P1=aa;  
                delay(200);  
                aa=_crol_(aa,1);  
            }  
            aa=0x7f;  
            for(k=0;k<7;k++)  
            {  
                P1=aa;  
                delay(200);  
                aa=_cror_(aa,1);           
            }  
        }  
        P1=0xff;  
        for(j=0;j<10;j++)  
        {  
              
            P1=~P1;                      //按位取反,则实现一亮一灭;
            delay(300);  
        }  
    }  
}  
void delay(uchar z)  
{  
        uchar x,y;  
        for(x=0;x<z;x++)  
        for(y=0;y<110;y++);  
  

}  

6.源码:

#include <reg52.h>  
#include <intrins.h>  
#define uc unsigned char  
void delay(uc);  
uc a,b,c,d,x,y,e;  
void main()  
{  
 while(1)
 {  
 e=1;  
 for(a=1;a<=8;a++)
 {   
 b=9-a;
 c=0xff;
 e=e*2; 
 d=c-e+1;  
 while(b)  
 {  
 P1=d;  
 delay(300);  
 d=_crol_(d,1);  
 b--;  
 }  
 }  
 }  
}  
void delay(uc k)  
{  
 for(x=k;x>0;x--)  
 for(y=110;y>0;y--);  

}  

7.源码:

#include<reg52.h>
#include<intrins.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint  unsigned int
#define led P1
void delay(uint i);
void main()

    while(1)
    {
        uchar leddata;
        uchar ci;
        uchar one;
        uchar cs;
P1=0xff;
        for(ci=0;ci<3;ci++)
        {   leddata=0xaa;
            led=leddata;
            delay(300);
            leddata=0x55;
            led=leddata;
            delay(300);
         }
         for(ci=0;ci<3;ci++)
         {
            leddata=0xfe;
            led=leddata;
            delay(1000);
            for(one=0;one<7;one++)
            {
                led=(led<<1)+1;
                delay(1000);
            }
            while(one==7)
            {
                for(one=7;one>0;one--)
                {
                    led=(led>>1)+128;
                    delay(1000);
                }
                break;
            }
        }
        for(cs=0;cs<3;cs++)
        {
            uchar code led2[]={0xe7,0xdb,0xbd,0x7e};
            uchar deng;
            uchar linshi;
            for(linshi=0;linshi<4;linshi++)
            {
                deng=linshi;
                led=led2[deng];
                delay(1000);
            }
        }
        for(cs=0;cs<3;cs++)
        {
            uchar code led2[]={0x7e,0xbd,0xdb,0xe7};
            uchar deng;
            uchar linshi;
            for(linshi=0;linshi<4;linshi++)
            {
                deng=linshi;
                led=led2[deng];
                delay(1000);
            }
        }
        for(ci=0;ci<3;ci++)
        {leddata=0x00;
        led=leddata;
        delay(1000);
        leddata=0xff;
        led=leddata;
        delay(1000);
        }while(1);
    }

}
void delay(uint i)
{
    uchar j;
    for(;i>0;i--)
        for(j=115;j>0;j--)
        {;}

}

本次实验总结:

点亮流水灯及其花样是单片机入门的第一次实验,接下来会继续整理其他实验,这里用到的单片机c语言的基本的内容,需要对循环,条件等比较熟悉,源码和仿真图都上了,可以用来复习并且给需要的人一些参考吧。

另外,代码并不是最优的,有更好的意见欢迎交流。

2013-04-12 14:58:48 feiyangyangfei 阅读数 5082
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3411 人正在学习 去看看 朱有鹏

 单片机是一门实践性较强的技术,很多初学者在学习单片机技术开发的时候往往一头雾水,不知何从下手。为此,笔者结合自己使用单片机多年的经验,特意设计了单片机开发所需的Study-c 整机和硬件套件,并结合套件精心编写了单片机从入门到精通系列教程。通过讲述单片机原理、电路设计、应用开发软件工具、编写实验实例让读者全面接触单片机技术。教程编排上由浅入深,循序渐进,内容力求完整、实用、趣味并存,使读者在轻松愉快的学习过程中逐步提高单片机软硬件综合设计水平。

  一、内容提要

  本讲主要向大家介绍51 系列单片机的最小系统的实现并通过编写程序来实现对单片机IO 口的输出控制。以点亮外部连接的LED(发光二极管)为例,简要的介绍单片机的原理、最小系统的组成,并通过简单的C51 程序设计来讲述编译软件Keil的使用并下载Hex 文件烧写单片机。

  二、原理简介

  在了解原理之前, 首先让我们思考一个问题,什么是单片机, 单片机有什么用? 这是一个有意思的问题,因为任何人都不能给出一个被大家都认可的概念,那到底什么是单片机呢? 普遍来说, 单片机又称单片微控制器, 是在一块芯片中集成了CPU( 中央处理器)、RAM( 数据存储器)、ROM( 程序存储器)、定时器/ 计数器和多种功能的I/O( 输入/ 输出) 接口等一台计算机所需要的基本功能部件,从而可以完成复杂的运算、逻辑控制、通信等功能。在这里,我们没必要去找到明确的概念来解析什么是单片机,特别在使用C 语言编写程序的时,不用太多的去了解单片机的内部结构以及运行原理等。从应用的角度来说,通过从简单的程序入手,慢慢的熟悉然后逐步深入精通单片机。

  在简单了解了什么是单片机之后,然后我们来构建单片机的最小系统,单片机的最小系统就是让单片机能正常工作并发挥其功能时所必须的组成部分,也可理解为是用最少的元件组成的单片机可以工作的系统。对51 系列单片机来说, 最小系统一般应该包括: 单片机、时钟电路、复位电路、输入/ 输出设备等(见图1)。

图1 单片机最小系统框图

图1 单片机最小系统框图

  三、电路详解

  依据上文的内容,设计51 系列单片机最小系统见图2。

图2 51系列单片机最小系统

图2 51系列单片机最小系统

  下面就图2 所示的单片机最小系统各部分电路进行详细说明。

  1. 时钟电路

  在设计时钟电路之前,让我们先了解下51 单片机上的时钟管脚:

  XTAL1(19 脚) :芯片内部振荡电路输入端。

  XTAL2(18 脚) :芯片内部振荡电路输出端。

  XTAL1 和XTAL2 是独立的输入和输出反相放大器,它们可以被配置为使用石英晶振的片内振荡器,或者是器件直接由外部时钟驱动。图2 中采用的是内时钟模式,即采用利用芯片内部的振荡电路,在XTAL1、XTAL2 的引脚上外接定时元件(一个石英晶体和两个电容),内部振荡器便能产生自激振荡。一般来说晶振可以在1.2 ~ 12MHz 之间任选,甚至可以达到24MHz 或者更高,但是频率越高功耗也就越大。在本实验套件中采用的11.0592M 的石英晶振。和晶振并联的两个电容的大小对振荡频率有微小影响,可以起到频率微调作用。当采用石英晶振时,电容可以在20 ~ 40pF 之间选择(本实验套件使用30pF);当采用陶瓷谐振器件时,电容要适当地增大一些,在30 ~ 50pF 之间。通常选取33pF 的陶瓷电容就可以了。

  另外值得一提的是如果读者自己在设计单片机系统的印刷电路板(PCB) 时,晶体和电容应尽可能与单片机芯片靠近,以减少引线的寄生电容,保证振荡器可靠工作。检测晶振是否起振的方法可以用示波器可以观察到XTAL2 输出的十分漂亮的正弦波,也可以使用万用表测量( 把挡位打到直流挡,这个时候测得的是有效值)XTAL2 和地之间的电压时,可以看到2V 左右一点的电压。

2. 复位电路

  在单片机系统中,复位电路是非常关键的,当程序跑飞(运行不正常)或死机(停止运行)时,就需要进行复位。

  MCS-5l 系列单片机的复位引脚RST( 第9 管脚) 出现2个机器周期以上的高电平时,单片机就执行复位操作。如果RST 持续为高电平,单片机就处于循环复位状态。

  复位操作通常有两种基本形式:上电自动复位和开关复位。图2 中所示的复位电路就包括了这两种复位方式。上电瞬间,电容两端电压不能突变,此时电容的负极和RESET 相连,电压全部加在了电阻上,RESET 的输入为高,芯片被复位。随之+5V电源给电容充电,电阻上的电压逐渐减小,最后约等于0,芯片正常工作。并联在电容的两端为复位按键,当复位按键没有被按下的时候电路实现上电复位,在芯片正常工作后,通过按下按键使RST管脚出现高电平达到手动复位的效果。一般来说,只要RST 管脚上保持10ms 以上的高电平,就能使单片机有效的复位。图中所示的复位电阻和电容为经典值,实际制作是可以用同一数量级的电阻和电容代替,读者也可自行计算RC 充电时间或在工作环境实际测量,以确保单片机的复位电路可靠。

  3. EA/VPP(31 脚) 的功能和接法

  51 单片机的EA/VPP(31 脚) 是内部和外部程序存储器的选择管脚。当EA 保持高电平时,单片机访问内部程序存储器;当EA 保持低电平时,则不管是否有内部程序存储器,只访问外部存储器。

  对于现今的绝大部分单片机来说,其内部的程序存储器(一般为flash)容量都很大,因此基本上不需要外接程序存储器,而是直接使用内部的存储器。

  在本实验套件中,EA 管脚接到了VCC 上,只使用内部的程序存储器。这一点一定要注意,很多初学者常常将EA 管脚悬空,从而导致程序执行不正常。

  4. P0 口外接上拉电阻

  51 单片机的P0 端口为开漏输出,内部无上拉电阻(见图3)。所以在当做普通I/O 输出数据时,由于V2 截止,输出级是漏极开路电路,要使“1”信号(即高电平)正常输出,必须外接上拉电阻。

图3 P0端口的1位结构

图3 P0端口的1位结构

  另外,避免输入时读取数据出错,也需外接上拉电阻。在这里简要的说下其原因:在输入状态下,从锁存器和从引脚上读来的信号一般是一致的,但也有例外。例如,当从内部总线输出低电平后,锁存器Q = 0, Q = 1,场效应管V1 开通,端口线呈低电平状态。此时无论端口线上外接的信号是低电平还是高电平,从引脚读入单片机的信号都是低电平,因而不能正确地读入端口引脚上的信号。又如,当从内部总线输出高电平后,锁存器Q = 1, Q = 0,场效应管V1 截止。如外接引脚信号为低电平, 从引脚上读入的信号就与从锁存器读入的信号不同。所以当P0 口作为通用I/O 接口输入使用时,在输入数据前,应先向P0 口写“1”,此时锁存器的Q 端为“0”,使输出级的两个场效应管V1、V2 均截止,引脚处于悬浮状态,才可作高阻输入。

  总结来说:为了能使P0 口在输出时能驱动NMOS 电路和避免输入时读取数据出错,需外接上拉电阻。在本实验套件中采用的是外加一个10K 排阻。此外,51 单片机在对端口P0—P3 的输入操作上,为避免读错,应先向电路中的锁存器写入“1”,使场效应管截止,以避免锁存器为“0”状态时对引脚读入的干扰。

  5. LED 驱动电路

  细心的读者可能已经发现,在最小系统中,发光二极管(LED)的接法是采取了电源接到二极管正极再经过1K 电阻接到单片机I/O 口上的(见图4 中的接法1)。为什么这么接呢?首先我们要知道LED 的发光工作条件,不同的LED 其额定电压和额定电流不同,一般而言,红或绿颜色的LED 的工作电压为1.7V~2.4V,蓝或白颜色的LED 工作电压为2.7~4.2V, 直径为3mm LED 的工作电流2mA~10mA。在这里采用红色的3mm 的LED。其次,51 单片机(如本实验板中所使用的STC89C52单片机)的I/O 口作为输出口时,拉电流(向外输出电流)的能力是μA 级别,是不足以点亮一个发光二极管的。而灌电流(往内输入电流)的方式可高达20mA,故采用灌电流的方式驱动发光二极管。当然,现今的一些增强型单片机,是采用拉电流输出(接法2)的,只要单片机的输出电流能力足够强即可。另外,图4 中的电阻为1K 阻值,是为了限制电流,让发光二极管的工作电流限定在2mA~10mA。

图4 LED的接法

图4 LED的接法

  四、程序设计

  在单片机编程语言上,有C 语言和汇编两种选择。本系列教程采用C 语言编写程序,在此对C语言和汇编语言在进行单片机开发时进行下简单比较,汇编语言面向硬件,要求对硬件的特性如寄存器之类的比较熟悉,执行效率高,但可读性和移植性差,不同的单片机之间的程序不能通用,例如学会了51 单片机的汇编指令,却没法用到AVR 单片机上。C语言面向过程,可读性和移植性很好,效率要比汇编低一些。对于刚接触单片机的人来说,学习这两种语言是一样的,但在以后的开发效率上,C 语言的优势就体现出来了,其可以几乎完全不改动的情况下移植,大大提高了开发速度。

  控制发光二极管D1 闪烁的C 语言源程序:

  1. 程序详细说明

  (1)头文件包含。程序接下来调用的P0_0 就是该头文件中定义好的一个寄存器地址。在对单片机内部的寄存器操作之前,应申明其来处,有兴趣的读者可以看看AT89X52.h 文件中的内容。

  (2)宏定义led, 便于直观理解也便于程序修改,将P0_0 口命名为led, 这样在程序中就可以用led代替P0_0 口进行操作。

  (3)延时函数声明。函数在调用之前必须进行声明,由于函数定义放在主函数之后,所以在主函数之前对延时函数进行了声明。

  (4)主函数入口。主函数不传递参数也不返回值。

  (5)死循环。

  (6)输出高电平,led 不亮。

  (7)延时一段时间,以便人眼能够直观看到。

  (8)输出低电平,led 点亮。

  (9)延时一段时间。

  (10)延时函数定义。

  (11)for 语句循环延时。

  2. 程序流程图与实验现象

  程序流程如图5 所示。经编译软件(keil)编译,生成单片机烧写文件,然后就可下载到单片机内部运行了,硬件电路板如图6 所示,本实验板上用的是STC89C52RC,可以用通过板载USB 转串口烧写程序。故将USB 线(本实验套件中有)连接电脑和实验板。供电电源可以从USB 取,也可以从外部电源取电。冷启动,即先点击下载,然后再上电。下载程序到单片机内运行后,可以看到实验板上P0_0 口外接的LED 灯(D1) 一亮一灭的闪烁。


图5 程序流程图

图5 程序流程图

图6 硬件电路板图

图6 硬件电路板图

  五、总结

  本讲主要介绍了51 单片机最小系统的设计以及编写第一个简单的程序。从过该实验,可以掌握单片机的开发流程,从而快速入门。在该讲中应该注意几个问题:

  1. 本讲座中采用C 语言编写程序,因为C 语言的可读性和可移植性强。若读者没有学过C 语言,则应去了解和掌握相应的C 语言知识。C 语言易学易用,相信很快就能熟练。

  2. 程序编译软件采用的是Keil。限于篇幅的原因,在这里就不对其进行讲述,如果读者有对其不明白的地方,可以到本刊论坛的单片机版面,作者制作了一个详细的Keil 入门教程。我们通过Keil编译程序,最终生成烧写单片机的Hex 代码文件。

  Keil 软件界面如图7 所示, 中间空白区域为代码区,左侧为项目列表,最下面为消息窗口。

图7 Keil软件开发界面

图7 Keil软件开发界面

  3. 本实验板上所用的STC 单片机通过串口下载程序。其上位机软件界面如图8 所示(推荐使用V3.1 版本,最新版本可以到STC 主页上下载:http://www.mcu-memory.com/), 烧写操作很简单,点击“Open File”按钮浏览找到所生成要烧写的Hex 文件后,单片机断电,点击“下载”按钮,单片机上电,程序就可下载到单片机中了。

图8 STC烧写软件界面

图8 STC烧写软件界面

  4. 产品组件

  读者如果按照该讲内容进行理解并实践的话,可以说单片机就算入门了。下一讲将进一步深入,将要介绍单片机内部定时器和中断系统,敬请期待。

2017-05-26 17:56:16 lrwwll 阅读数 5396
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3411 人正在学习 去看看 朱有鹏
实验三(硬件实验):I/O 接口实验 
一、实验要求:
将 P0 作为输出口,连接 8 个 LED,编写程序,使 LED 循环点亮。(LED1 亮,其余灭->LED2 亮,其余灭……,如此循环 5 次后,进行全灭->全亮闪烁,时间间隔为 500ms)。 
二、实验目的 
1、学习单片机的 I/O 口使用方法; 
2、学习延时程序的编写和使用; 
3、熟悉实验电路原理图,学习单片机硬件编程方法。
三、实验电路图 

电路图

实验流程设计:
这里写图片描述
实验代码:

/***************************************
定时器中断实验
Programed by Lee.rw,all right reserved
****************************************/
ORG 0000H
LJMP MAIN
/********************定时器0中断**************************/
ORG 000BH
LJMP T0_INT                     ;定时器0中断服务子程序


ORG 0100H
MAIN:
    MOV P1,#0FFH                ;初始全灭
    MOV A,#0FEH                 ;A中存要赋值给P1口的值以控制LED亮灭
    MOV R0,#27H                 ;循环39次左移即流水5次
    /*****************三个标志位*****************/
    MOV R1,#0H                  
    MOV R2,#0H
    MOV R3,#0H
START:
    MOV P1,A
    MOV B,#0AH                  ;循环10次
    /****************设置定时器工作方式和中断**************/
    SETB EA
    SETB ET0
    MOV TMOD,#01H               ;定时器0工作在方式一
    MOV TH0,#03CH               ;定时器初值,一次50ms,循环10次,500ms
    MOV TL0,#0AFH
    SETB TR0
HERE:
    SJMP HERE
    RET

T0_INT:
    MOV TH0,#03CH               ;重新装入初值
    MOV TL0,#0AFH
    DJNZ B,RETURN               
    MOV B,#0AH
    CJNE R3,#0H,JUDGE           ;判断五次流水是不是已经完成
    RL A
    DJNZ R0,RETURN              
    MOV R3,#01H
    MOV R1,#01H

JUDGE:
    CJNE R1,#0H,OFF             ;全灭
    CJNE R2,#0H,ON              ;全亮

ON:
    MOV A,#00H
    MOV R2,#0H
    MOV R1,#01H
    AJMP RETURN

OFF:
    MOV A,#0FFH
    MOV R1,#0H
    MOV R2,#01H

RETURN:
    MOV P1,A
    RETI

END 

下面是另一种运用延时子程序来达到目的的方法,因为太简单直接上代码,不再注释

ORG 0000H
LJMP MAIN

ORG 000BH
LJMP T0_INT


ORG 0100H
MAIN:
    MOV P1,#0FFH
    MOV A,#0FEH
    MOV P1,A
    MOV B,#0AH
    MOV R0,#27H
    SETB EA
    SETB ET0
    MOV TMOD,#01H
    MOV TH0,#03CH
    MOV TL0,#0AFH
    SETB TR0
HERE:
    SJMP HERE
    RET


T0_INT:
    MOV TH0,#03CH
    MOV TL0,#0AFH
    DJNZ B,LOOP
    MOV B,#0AH
    RL A
    MOV P1,A
    MOV A,R0
    JZ FUN1
    MOV A,P1
    DEC R0
LOOP:
    RETI

FUN1:
    MOV P1,#00FFH
    LCALL DELAY
    MOV P1,#00H
    LCALL DELAY
    SJMP FUN1


DELAY:
    DEL:MOV R7,#10
    DEL1:MOV R6,#200
    DEL2:MOV R5,#123
    NOP
    DEL3:DJNZ R5,DEL3
    DJNZ R6,DEL2
    DJNZ R7,DEL1
    RET

END
2011-11-15 17:48:47 jbx929205249 阅读数 2649
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3411 人正在学习 去看看 朱有鹏
;***************根据CHECK配置信息修改下列符号值*******************
IOY0         EQU   0A000H          ;片选IOY0对应的端口始地址
IOY1         EQU   0A040H          ;片选IOY1对应的端口始地址
;*****************************************************************
MYIO_A       EQU   IOY0+00H*4     ;基本输入输出单元A组端口地址
MYIO_B       EQU   IOY1+00H*4     ;基本输入输出单元B组端口地址

STACK1 SEGMENT STACK
        DW 256 DUP(?)
STACK1 ENDS

CODE SEGMENT
        ASSUME CS:CODE

START: MOV  DX,MYIO_A              ;读写基本I/O单元A组的端口
       IN   AL,DX
       OUT  DX,AL

       MOV  DX,MYIO_B              ;读写基本I/O单元B组的端口
       IN   AL,DX
       OUT  DX,AL

       MOV  AH,1                   ;判断是否有按键按下
       INT  16H
       JZ   START                  ;无按键则跳回继续循环,有则退出

QUIT:  MOV  AX,4C00H               ;返回到DOS
       INT  21H

CODE ENDS
     END START


 

I/O口输出点亮LED

阅读数 1063

没有更多推荐了,返回首页