Chinaunix首页 | 论坛 | 博客
  • 博客访问: 24952
  • 博文数量: 6
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-01 20:38
文章分类

全部博文(6)

文章存档

2016年(2)

2014年(4)

我的朋友

分类: 嵌入式

2014-06-09 20:27:20

说明:以郭天祥的《51单片机C语言教程-入门、提高、开发、拓展全攻略》为基础,按照书中的编排顺序进行学习,尽可能将书中所有实验都测试一遍。所用开发板为上海浩豚电子科技的51开发板。

第一部分:LED灯
一、硬件电路:



           

      
线路图                                             实物图

电路分析:RP1为排阻,在电路中起限流作用。LED灯的接法为低电平有效。即当单片机P1口输出为低电平时,电路成了通路,LED灯会被点亮。

常见问题:

1LED灯不亮

原因:

1)、LED接反。由于LED是有正负极,所以在安装的时候,要注意其极性。长脚的为正极,短脚的为负极。如果长短脚无法区分的话,就检查与引脚连接的电极片。大片为负极,小片为正极。
                                                                         

2)、限流电阻损坏。电阻损坏后,电路不能成为通路。LED不发光。

3)、P1口输出为高电平。

二、实现功能:

1  点亮LED2
源程序代码:

//******************************

//  名称:点亮第一个LED2

//******************************

//  作用:使第一个LED2灯由暗变亮

//******************************

 #include                             //头文件

 sbit led2=P1^0;                                  //声明P1^0口为led0

 void main()                                      //主函数

 {

     led2=0;                                   //P1^0口输出低电平

  }

 
说明:

第一行:为头文件,作用是将文件reg52.h引入到程序中。如果删除头文件的话,编译后软件会提示LED0.C(8): error C202: 'P1': undefined identifierP1没有被定义。由于P1是在头文件中被定义的,所以如果没有引入头文件,软件会有这个错误提示。打开reg52.h文件查看下,都定义了哪些变量。

打开的方法:鼠标右键点击reg52.h,会弹出对话框,如图1-1


1-1

选择Open document就可以打开文件。打开后的内容如下:

/*--------------------------------------------------------------------------

REG52.H

 

Header file for generic 80C52 and 80C32 microcontroller.

Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.

All rights reserved.

--------------------------------------------------------------------------*/

 

#ifndef __REG52_H__

#define __REG52_H__

 

/*  BYTE Registers  */

sfr P0    = 0x80;

sfr P1    = 0x90;

sfr P2    = 0xA0;

sfr P3    = 0xB0;

sfr PSW   = 0xD0;

sfr ACC   = 0xE0;

sfr B     = 0xF0;

sfr SP    = 0x81;

sfr DPL   = 0x82;

sfr DPH   = 0x83;

sfr PCON  = 0x87;

sfr TCON  = 0x88;

sfr TMOD  = 0x89;

sfr TL0   = 0x8A;

sfr TL1   = 0x8B;

sfr TH0   = 0x8C;

sfr TH1   = 0x8D;

sfr IE    = 0xA8;

sfr IP    = 0xB8;

sfr SCON  = 0x98;

sfr SBUF  = 0x99;

 

/*  8052 Extensions  */

sfr T2CON  = 0xC8;

sfr RCAP2L = 0xCA;

sfr RCAP2H = 0xCB;

sfr TL2    = 0xCC;

sfr TH2    = 0xCD;

 

 

/*  BIT Registers  */

/*  PSW  */

sbit CY    = PSW^7;

sbit AC    = PSW^6;

sbit F0    = PSW^5;

sbit RS1   = PSW^4;

sbit RS0   = PSW^3;

sbit OV    = PSW^2;

sbit P     = PSW^0; //8052 only

 

/*  TCON  */

sbit TF1   = TCON^7;

sbit TR1   = TCON^6;

sbit TF0   = TCON^5;

sbit TR0   = TCON^4;

sbit IE1   = TCON^3;

sbit IT1   = TCON^2;

sbit IE0   = TCON^1;

sbit IT0   = TCON^0;

 

/*  IE  */

sbit EA    = IE^7;

sbit ET2   = IE^5; //8052 only

sbit ES    = IE^4;

sbit ET1   = IE^3;

sbit EX1   = IE^2;

sbit ET0   = IE^1;

sbit EX0   = IE^0;

 

/*  IP  */

sbit PT2   = IP^5;

sbit PS    = IP^4;

sbit PT1   = IP^3;

sbit PX1   = IP^2;

sbit PT0   = IP^1;

sbit PX0   = IP^0;

 

/*  P3  */

sbit RD    = P3^7;

sbit WR    = P3^6;

sbit T1    = P3^5;

sbit T0    = P3^4;

sbit INT1  = P3^3;

sbit INT0  = P3^2;

sbit TXD   = P3^1;

sbit RXD   = P3^0;

 

/*  SCON  */

sbit SM0   = SCON^7;

sbit SM1   = SCON^6;

sbit SM2   = SCON^5;

sbit REN   = SCON^4;

sbit TB8   = SCON^3;

sbit RB8   = SCON^2;

sbit TI    = SCON^1;

sbit RI    = SCON^0;

 

/*  P1  */

sbit T2EX  = P1^1; // 8052 only

sbit T2    = P1^0; // 8052 only

            

/*  T2CON  */

sbit TF2    = T2CON^7;

sbit EXF2   = T2CON^6;

sbit RCLK   = T2CON^5;

sbit TCLK   = T2CON^4;

sbit EXEN2  = T2CON^3;

sbit TR2    = T2CON^2;

sbit C_T2   = T2CON^1;

sbit CP_RL2 = T2CON^0;

 

#endif

头文件中包含了所有的功能寄存器,可以看到,有一条sfr P1   = 0x90;

Sfr为特殊功能寄存器数据声明,声明一个8位寄存器。意思给地址为0x90的寄存器重新取个名字为P1。为什么要给寄存器重新取个名字呢?我们可以看到,单片机能识别的就是0x90,它是P1口的寄存器地址,用十六进制表示。但是对于我们来说,记住这个地址有点困难,比较抽象。所以取个我们比较容易识别的名字,方便记忆。所以以后看到P1,就代表对单片机P1口进行操作,比0x90容易记忆和理解。

所以#include可以用sfr P1=0x90取代。

#include#include”reg52.h”的区别:

前者编译器先进入到软件安装文件夹处搜索头文件;后者先到当前工程的文件夹下,如果搜不到,才到软件安装文件夹下搜索。所以一般按照前者的写法。

第二行:sbit led2=P1^0;

Sbit为特殊功能位声明,声明一个特殊功能寄存器中的某一位;这条命令的意思是声明P1口的第0位为led2,后续操作led2即操作P1.0口。

第三行:声明主函数,void表明无返回值。

第四行和第六行:一对{},所有代码都写到这两个括号之间;

第五行:led2=0;

P1.0口输出为低电平。由于电路设计的时候,LED灯是低电平有效,所以当执行完这条命令后,LED2灯就被点亮了。

把程序下载到单片机里面可以看下是不是点亮了第一个LED灯。

到此,完成了第一个程序,同样的方法,可以点亮其他位的LED灯。

刚才我们只是完成了一个灯的点亮工作,如果要点亮两个及两个以上的LED灯,要怎么操作呢,可以看下面的例子。



阅读(3175) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~