分类: 嵌入式
2014-06-09 20:27:20
说明:以郭天祥的《51单片机C语言教程-入门、提高、开发、拓展全攻略》为基础,按照书中的编排顺序进行学习,尽可能将书中所有实验都测试一遍。所用开发板为上海浩豚电子科技的51开发板。
线路图 实物图
电路分析:RP1为排阻,在电路中起限流作用。LED灯的接法为低电平有效。即当单片机P1口输出为低电平时,电路成了通路,LED灯会被点亮。
常见问题:
1、LED灯不亮
原因:
(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 identifier,P1没有被定义。由于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
#include
前者编译器先进入到软件安装文件夹处搜索头文件;后者先到当前工程的文件夹下,如果搜不到,才到软件安装文件夹下搜索。所以一般按照前者的写法。
第二行:sbit led2=P1^0;
Sbit为特殊功能位声明,声明一个特殊功能寄存器中的某一位;这条命令的意思是声明P1口的第0位为led2,后续操作led2即操作P1.0口。
第三行:声明主函数,void表明无返回值。
第四行和第六行:一对{},所有代码都写到这两个括号之间;
第五行:led2=0;
让P1.0口输出为低电平。由于电路设计的时候,LED灯是低电平有效,所以当执行完这条命令后,LED2灯就被点亮了。
把程序下载到单片机里面可以看下是不是点亮了第一个LED灯。
到此,完成了第一个程序,同样的方法,可以点亮其他位的LED灯。
刚才我们只是完成了一个灯的点亮工作,如果要点亮两个及两个以上的LED灯,要怎么操作呢,可以看下面的例子。