51单片机基本测试

51单片机基本测试,第1张

51单片机基本测试


51单片机基本测试
  • 1、 填空题
  • 2、单项选择题
  • 3、判断题
  • 4、简答题
  • 5、计算题
  • 6、延时程序
    • 拓展:定义IO口
  • 7、LED灯
    • 引入上拉电阻
  • 8、数码管
  • 9、按键
  • 10 、中断
  • 相关知识

1、 填空题
  • 1、设X=5AH,Y=36H,则X与Y“或”运算为7EH,X与Y的“异或”运算为6CH。
  • 2、若机器的字长为8位,X=17,Y=35,则X+Y=110100,X-Y=11101110(要求结果写出二进制形式)。
  • 3、单片机复位后,堆栈指针SP的值是07h。
  • 4、若采用6MHz的晶体振荡器,则MCS-51单片机的振荡周期为 1/6us ,机器周期为 2us 。
  • 5、一个函数由两部分组,即 说明部分 和 语句部分 。
  • 6、C语言中输入和输出 *** 作是由库函数 scanf 和 printf 等函数来完成。
  • 7.当MCS-51引脚 ALE 信号有效时,表示从Po口稳定地送出了低8位地址.
  • 8.MCS-51的堆栈是软件填写堆栈指针临时在 片内数据存储器 内开辟的区域.
  • 9.MCS-51有4组工作寄存器,它们的地址范围是 00H-1FH 。
  • 10.MCS-51片内 20H-2FH 范围内的数据存储器,既可以字节寻址又可以位寻址.
  • 11.计算机的系统总线有 数据总线、地址总线 、 控制总线 。
  • 12.一个机器周期等于 6个 状态周期,振荡脉冲2分频后产生的时钟信号的周期定义为 状态 周期。
  • 13、单片机的复位 *** 作是_高电平 , 寄存器IE的值是 EA、ES、ET1、EX1、ET0、EX0。
  • 14、若选择内部程序存储器, 应该设置为高电平(高电平/低电平),那么,PSEN信号的处理方式为不用。
  • 15、单片机程序的入口地址是0000H ,外部中断1的入口地址是0013H 。
  • 16、片机的内部RAM区中,可以位寻址的地址范围是20H-2FH ,特殊功能寄存器中,可位寻址的地址是 能被8整除的地址 。
  • 17、eiL C51软件中,工程文件的扩展名是UV2,编译连接后生成可烧写的文件扩展名是HEX。
  • 18、CS-51单片机中,在IP=0x00时,优先级最高的中断是 外部中断 ,最低的是串行口中断加粗样式 。
  • 19、CS—51单片机的P0—P4口均是并行 I/O口,其中的P0口和P2口除了可以进行数据的输入、输出外,通常还用来构建系统的 数据总线 和 地址总线,在P0—P4口中, P0为真正的双向口, P1-P3 为准双向口。
  • 20、S—5l单片机的堆栈区只可设置在 片内数据 加粗样式存储区(器)
  • 21、S—51单片机外部中断请求信号有 电平 方式和 脉冲 方式,在 电平 方式下,当采集到INT0、INT1的有效信号为低电平时,激活外部中断。
2、单项选择题

1、C语言提供的合法的数据类型关键字是( B )。
A、Double
B、short
C、integer
D、Char
2、片内RAM的20H~2FH为位寻址区,所包含的位地址是( B )。
A、00H~20H
B、00H~7FH
C、20H~2FH
D、00H~FFH
3、MCS-51单片机的复位信号是( A )有效。
A、高电平
B、低电平
C、脉冲
D、下降沿
4、89S51的单片机的堆栈指针(C)
A、 只能位于内部RAM低128B字节范围内 
B、 可位于内部RAM低256字节范围内
C、 可位于内部ERRAM内。      
D、可位于内部RAM或外部RAM内
5、在串行口工作于移位寄存器方式时,其接收由( C )来启动。
A、REN 
B、RI 
C、REN和RI 
D、TR
6、存储16×16点阵的一个汉字信息,需要的字节数为( A )
A、 32
B、 64
C、 128
D、 256
7、当MCS-51单片机接有外部存储器,P2口可作为 ( D )。
A、数据输入口
B、数据的输出口
C、准双向输入/输出口
D、输出高8位地址
8、C51中一般指针变量占用( C )字节存储。
A、一个
B、两个
C、三个
D、四个
9、使用宏来访问绝对地址时,一般需包含的库文件是( B )
A、reg51.h
B、absacc.h
C、intrins.h
D、startup.h
10、单片机的定时器/计数器工作方式1是( D )。
A、8位计数器结构
B、2个8位计数器结构
C、13位计数结构
D、16位计数结构
11、C语言中最简单的数据类型包括( B )。
A、整型、实型、逻辑型
B、整型、实型、字符型
C、整型、字符型、逻辑型
D、整型、实型、逻辑型、字符型
12、下列描述中正确的是( D )。
A、程序就是软件
B、软件开发不受计算机系统的限制
C、软件既是逻辑实体,又是物理实体
D、软件是程序、数据与相关文档的集合
13、下列计算机语言中,CPU能直接识别的是( D )。
A、 自然语言
B、 高级语言
C、 汇编语言
D、机器语言
14、MCS-5l单片机的堆栈区是设置在( C )中。
A、片内ROM区
B、片外ROM区
C、片内RAM区
D、片外RAM区
15、以下叙述中正确的是( C )。
A、用C语言实现的算法必须要有输入和输出 *** 作
B、用C语言实现的算法可以没有输出但必须要有输入
C、用C程序实现的算法可以没有输入但必须要有输出
D、用C程序实现的算法可以既没有输入也没有输出
16、以下能正确定义一维数组的选项是( B )。
A、int a[5]={0,1,2,3,4,5};
B、char a[ ]={0,1,2,3,4,5};
C、char a={‘A’,‘B’,‘C’};
D、int a[5]=“0123”;
17、数据的存储结构是指( D )。
A、存储在外存中的数据
B、数据所占的存储空间量
C、数据在计算机中的顺序存储方式
D、数据的逻辑结构在计算机中的表示
18、下列关于栈的描述中错误的是( C )。
A、栈是先进后出的线性表
B、栈只能顺序存储
C、栈具有记忆作用
D、对栈的插入和删除 *** 作中,不需要改变栈底指针
19、能够用紫外光擦除ROM中程序的只读存储器称为( C )。
A、掩膜ROM
B、PROM
C、EPROM
D、EEPROM
20、以下叙述中错误的是( C )
A、对于double类型数组不可以直接用数组名对数组进行整体输入或输出
B、数组名代表的是数组所占存储区的首地址,其值不可改变
C、当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越界”的出错信息
D、可以通过赋初值的方式确定数组元素的个数

3、判断题
  • 1、在对某一函数进行多次调用时,系统会对相应的自动变量重新分配存储单元。 (√)
  • 2、在C语言的复合语句中,只能包含可执行语句。 (×)
  • 3、Continue 和break都可用来实现循环体的中止。 (×)
  • 4、字符常量的长度肯定为1。 (√)
  • 5、在MCS-51系统中,一个机器周期等于1.5μs。 (×)
  • 6、C语言允许在复合语句内定义自动变量。 (√)
  • 7、若一个函数的返回类型为void,则表示其没有返回值。 (√)
  • 8、所有定义在主函数之前的函数无需进行声明。 (×)
  • 9、定时器与计数器的工作原理均是对输入脉冲进行计数。 (×)
  • 10、MCS-51的程序存储器只是用来存放程序的。 (×)
  • 11、 若一个函数的返回类型为void,则表示其没有返回值。 (√)
  • 12、定时器与计数器的工作原理均是对输入脉冲进行计数。 (×)
  • 13、SFR中凡是能被8整除的地址,都具有位寻址能力。 (√)
  • 14、不能用“sfr16” 直接访问定时器/计数器0和1。 (√)
  • 15、MCS-51单片机的程序存储器只能用来存放程序的。 (× )
  • 16、串口中断标志由硬件清0。 (×)
  • 17、特殊功能寄存器的名字,在C51程序中,全部大写。 (√)
  • 18、“sfr”后面的地址可以用带有运算的表达式来表示。 (×)
  • 19、#include 与#include “reg51.h”是等价的。 (√)
  • 20、sbit不可以用于定义内部RAM的可位寻址区,只能用在可位寻址的SFR上。 (×)
4、简答题
  • 1.51系列单片机具有几个中断源,分别是如何定义的?其中哪些中断源可以被定义为高优先级中断,如何定义?

答:具有5个中断源,分别是外部中断INT0和外部中断INT1、定时器溢出中断0和定时器溢出中断1以及串行中断。通过对中断优先级寄存器IP的设置,每个中断源都可以被定义为高优先级中断。

  • 2.各中断源对应的中断服务程序的入口地址是否能任意设定?

答:各中断源的入口地址已经在中断地址区中被定义了,不能任意设定

  • 3.如果想将中断服务程序放置在程序存储区的任意区域,在程序中应该作何种设置?请举例加以说明。

答:如果要将中断服务程序放置在程序存储区的任意区域,在程序中要通过在中断地址区的对应地址上设置跳转指令才可实现对中断服务程序的执行。
例如:外部中断O的中断服务程序INTOP放置在程序存储区的任意区域,此时,通过以下方式,可实现对中断服务程序的执行:ORGO003H、JMP、INTOP

  • 4、什么是重入函数?重入函数一般什么情况下使用,使用时有哪些需要注意的地方?

解:多个函数可以同时使用的函数,称为重入函数。通常情景下,C51函数不能被递归调用,也不能应用招致递归调用的布局。我不知道c语言程序设计题。有此限制是由于函数参数和局部变量是存储在牢固的地址单元中。重入函数特性应许你声明一个重入函数。即可以被递归调用的函数。重入函数可以被递归调用,也可以同时被两个或更多的进程调用。c语言程序设计试题。重入函数在实时应用中及中止任事程序代码和非中止程序代码必需共用一个函数的园地中通常用到。

  • 5、8051引脚有多少I/O线?他们和单片机对外的地址总线和数据总线有什么关系?地址总线和数据总线各是几位?

解:8051引脚共有40个引脚,你看单片机C语言程序设计。8051的地址总线由P2和P0口提供,试题。P2口是地址总线的高8位,P0口是地址总线的低8位;数据总线由P0口提供;P0口的地址总线和数据总线是分时举办的,P0口的地址总线必要外接地址锁存器完成地址锁存。

  • 6、单片机的应用领域?

解:智能化家用电器、办公自动化设备、商业营销设备、工业自动化控制智能化仪表、智能化通信产汽车电子产品品、航空航天系统和国防军事、尖端武器等领域。

  • 7、如何正确使用P3?

解:

  • (1)说明P3口有第一功能和第二功能的使用。
  • (2)P3口的第二功能各位线的含义。
  • (3)使用时应先按需要选用第二功能信号,剩下的口线才作第一功能I/O线用。
  • (4)读引脚数据时,必需先给锁存器输出“1”。
  • 8、述累加器的ACC的作用。

解:累加器A为8位寄存器,通过暂存器与ALU相连,是最常用的寄存器,功能较多,既可以存放 *** 作数,也可以存放中间结果,一些双 *** 作数指令中,逻辑运算指令的运算结果都存放在累加器A或AB中,在作为直接寻址时 ,在程序中要写成ACC.

  • 9、述MCS-51单片机的中断入口地址。

答:中断入口地址为中断响应后PC的内容即中断服务的入口地址。他们是:外部中断0 0003H
定时器TO中断 000BH
外部中断1 0013H
定时器T1中断 001BH
串行口中断 0023H

5、计算题

已知一单片机系统的外接晶体振荡器的振荡频率为11.059MHz,请计算该单片机系统的拍节P、状态S、机器周期所对应的时间是多少?指令周期中的单字节双周期指令的执行时间是多少?

解:P=1/f=(1/11.059×106)=0.09×10-6s=90ns
S=2P=2×90ns=180ns
机器周期=12P=12×90ns=1.08μs
双指令周期=2×机器周期=2.16μs

6、延时程序

晶振频率 f osc = 12MHz

//延时  time 毫秒
void delay(unsigned int time)
{
    unsigned int i ,  j ; 
    for( j = time ;  j > 0 ;  j-- )
        for( i = 125 ; i > 0 ; i-- ) ;
}
拓展:定义IO口

  • 定义并行IO口时,可直接用 #define
#define GPIO_LED P2		//将P2口另外取名为GPIO_LED
  • 定义单个IO口时,用 sbit
sbit	LED1 = P2^0;   
  • 例:
#inlcude
#define GPIO_LED P2			//定义LED灯引脚
sbit	LED1 = P2^0;  

    void main()
{
    while(1)
    {
        GPIO_LED = 0;		//①D1~D8灯亮,代码
        LED1 = 0;        //②D1亮
    }
}

7、LED灯

引入上拉电阻

图中的LED灯是接上拉电阻(MCS-51的IO口拉点流能力是100uA(影响下拉电阻),灌电流能力是10mA(影响上拉电阻)),因此当给IO口低电平(即LED = 0)时,LED亮。

#include		//里面定义MCS-C51的相关寄存器和引脚
#include		//因为要用到左右移函数,所以加入这个头文件				 

#define GPIO_LED P2		//将P2口另外取名为GPIO_LED

void main(void)
{
	unsigned char n;
	GPIO_LED=0xfe;//1111_1110->1111_1101
	while(1)
	{
		for(n=0;n<7;n++)		//左移7次,这样子就会到达最左边
		{
			GPIO_LED=_crol_(GPIO_LED,1); //将GPIO_LED左移一位
			delay(500);		//延时500ms
		}
		for(n=0;n<7;n++)		//右移7次,这样子就会到达最右边
		{
			GPIO_LED=_cror_(GPIO_LED,1);	//将GPIO_LED右移一位
			delay(500);		//延时500ms
		}	
	}	
}
8、数码管



将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。
以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。当然,LED的电流通常较小,一般均需在回路中接上限流电阻。假如我们将"b"和"c"段接上正电源,其它端接地或悬空,那么"b"和"c"段发光,此时,数码管显示将显示数字“1”。而将"a"、“b”、“d”、"e"和"g"段都接上正电源,其它引脚悬空,此时数码管将显示“2”。其它字符的显示原理类同。

动态扫描显示(利用人眼的视觉暂留特性和数码管的余辉特性)

消隐作用

单片机的LED数码动态显示需要消隐。因为动态显示是利用 人眼的暂留效应来多位显示的。原理是其多位数码管的每位段码控制只由一个IO口8 位输出,先位选 ,送段码,延时(1~3ms),关位选 (这个就是消隐作用,如果没关,下一位的段码送出时,这一位也显示下一位的段码,这样就乱了)再下一位,重复上述过程。

#include

#define uint8 unsigned char
#define uint16 int 

#define GPIO_DIG P0

sbit LSA = P2^0 ;
sbit LSB = P2^1 ;  
sbit LSC = P2^2 ;  
sbit LSD = P2^3 ;

unsigned char code DIG_CODE[17]={
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
    0x80,0x90,0xf7,0xfc,0xf8,0x77,0xfd,0xf1	
};

//声明函数
void delay(uint8 time);

void main()
{
    uint16 i ;
    while(1)
    {	
        LSA = 0 ;
        LSB = 1 ;
        LSC = 1 ;
        LSD = 1 ;	
        GPIO_DIG = DIG_CODE[1]; 
        delay(1000);

        LSA = 1 ;
        LSB = 0 ;
        LSC = 1 ;
        LSD = 1 ;	
        GPIO_DIG = DIG_CODE[2];
        delay(1000);

        LSA = 1 ;
        LSB = 1 ;
        LSC = 0 ;
        LSD = 1 ;	
        GPIO_DIG = DIG_CODE[3];  
        delay(1000);

        LSA = 1 ;
        LSB = 1 ;
        LSC = 1 ;
        LSD = 0 ;	
        GPIO_DIG = DIG_CODE[4];
        delay(1000);

        i++ ;
        if(i == 16)
            i = 0 ;	
        GPIO_DIG = 0xFF ;	//消隐
    }	
}

//延时1ms
void delay(uint8 time)
{
    unsigned char a,b,c;
    for(c=time;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}

9、按键

按键抖动
抖动的原因:目前大部分按键或键盘都是利用机械触电的合、断作用。机械触点在闭合
及断开瞬间由于d性作用的影响,在闭合及断开瞬间均有抖动过程,从而使电压信号也出现
抖动,抖动时间的长短与开关的机械特性有关,一般为5~10ms。而单片机对键盘扫描一次
仅需几百微妙。这样,将会对键盘扫描产生误判。为了保证单片机对按键闭合仅作一次输入
处理,必须去除抖动的影响。
去抖动的方法

  • 1、外加硬件电路,用RS 触发器或单稳态电路构成的去抖动电路,或键盘扩展专用芯片。
  • 2、在检测按键按下时,执行约10ms 的延时程序后(避开抖动前沿区域),再确认按键
    是否仍然保持闭合状态。
#include
#include	

#define GPIO_LED P2
sbit K1=P3^1;
void Delay10ms( );   //延时10ms


void main(void)
{
    unsigned int i,j;
    j=0xfe; //1111_1110

    while(1)
    {	
        GPIO_LED=j;	 
        if(K1==0)		//检测按键K1是否按下
        {
            Delay10ms();	//消除抖动
            if(K1==0)
            {
                j=_cror_(j,1);
                while((i<50)&&(K1==0))	 //检测按键是否松开
                {
                    Delay10ms();
                    i++;
                }
                i=0;
            }
        }		

    }				
}

void Delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}
10 、中断

//外部中断0初始化
void IntConfiguration()	
{
	IT0 = 0 ; // 0 为电平触发 , 1 边沿触发
	EX0 = 1; //开启外部中断
	EA = 1 ;//总开关
}
void Int () Interrupt 0 
{
	//添加中断触发代码
}
相关知识
  • 1、51单片机的5大中断源:串行口中断、定时中断1、外部中断1、定时中断0、外部中断0;

  • 2、中断源的编号: 串行口中断为4、定时中断1为3、外部中断1为2、定时中断0为1、外部中断0为0;

  • 3、中断源的优先级:按以上顺序排列,串行口中断最低、外部中断0最高;

  • 4、使用外部中断0和1,必须TCON寄存器设置其触发方式是低电平触发(0)还是下降沿触发(1);

  • 5、使用前必须通过IE寄存器打开总中断和自己的中断;

  • 外部中断基本例程-1(未使用中断,键盘扫描为一般端口扫描)

  • 这是特意安排的一个例程,以便和使用外部中断的例程2进行对比

  • 用一个按键控制一个灯的亮灭,开始不亮,按一下则点亮,再按一下灭掉,再按又亮…

#include 

sbit k1=P3^2;
sbit led=P2^7;
void delay_ms(unsigned int xms); //ms级延时子程序
void key_scan(); //声明键盘扫描子函数
//=================================================

void main()
{
    led=1; //上电初始化,led灯不亮
    while(1)
    {
        key_scan();
        delay_ms(3000);
    }
}
//=================================================
void delay_ms(unsigned int xms) //ms级延时子程序
{
    unsigned int x,y; 
    for(x=xms;x>0;x--)
        for(y=130;y>0;y--);
}
//------------------------------------------------- 

void key_scan() //键盘扫描子函数
{ 
    if(k1==0) //有键按下吗?(k1=0 ?)
    {
        delay_ms(10); //延时消抖
        if(k1==0) //确实是有键按下,则:
        {
            led=!led; //翻转灯的状态
            while(!k1);
        } //等待按键放开
    } 
}
//-------------------------------------------------
//外部中断基本例程-2 (单个键盘的外部中断0扫描处理)
//用一个按键控制一个灯的亮灭
//开始不亮,按一下则点亮,再按一下灭掉,再按又亮........

#include 
sbit k1=P3^2;
sbit led=P2^7;
void delay_ms(unsigned int xms); //ms级延时子程序
void key_scan() interrupt 0 //使用了外部中断0的键盘扫描子函数。也可放在主函数而不需要预先声明
{ 
    if(k1==0) //有键按下吗?(k1=0 ?)
    { 
        delay_ms(10); //延时消抖
        if(k1==0) //确实是有键按下,则:
        {
            led=!led; //翻转灯的状态
            while(!k1);
        } //等待按键放开
    } 
}
//=================================================
void main()
{
    led=1; //上电初始化,led灯不亮
    TCON=0x01; //打开外部中断0,并设置为下降沿触发
    IE=0x81; //开总中断
    while(1)
    {
        delay_ms(3000); //注意主函数这里没有键盘扫描程序了
    }
}
//=================================================
void delay_ms(unsigned int xms) //ms级延时子程序
{
    unsigned int x,y; 
    for(x=xms;x>0;x--)
        for(y=130;y>0;y--);
}
//-------------------------------------------------
  • 外部中断基本例程-3 (单个键盘的外部中断1扫描处理)
  • 功能跟上例一样,都是用一个按键控制一个灯的亮灭,但是使用的是外部中断 1
    注意与前例写法上的不同之处
#include 

sbit k2=P3^3; //
sbit led=P2^7;
void delay_ms(unsigned int xms); //ms级延时子程序
//=================================================

void main()
{
    led=1; //上电初始化,led灯不亮
    TCON=0x04; //打开外部中断1,并设置为下降沿触发
    IE=0x84; //开总中断和外部中断1
    while(1)
    {
        delay_ms(3000);
    }
}
//=================================================
void delay_ms(unsigned int xms) //ms级延时子程序
{
    unsigned int x,y; 
    for(x=xms;x>0;x--)
        for(y=130;y>0;y--);
}
//-------------------------------------------------
void key_scan() interrupt 2 //使用了外部中断1的键盘扫描子函数
{ 
    if(k2==0) //有键按下吗?(k1=0 ?)
    { 
        delay_ms(10); //延时消抖
        if(k2==0) //确实是有键按下,则:
        {
            led=!led; //翻转灯的状态
            while(!k2);
        } //等待按键放开
    }
}
  • 外部中断基本例程-4 (同时使用外部中断0和外部中断1)
  • 用一个键控制接在P0口的八个灯的亮灭,另外一个按键控制一个灯的亮灭
#include 

sbit k1=P3^2;
sbit k2=P3^3; //
sbit led=P2^7;
void delay_ms(unsigned int xms); //ms级延时子程序
//=================================================

void main()
{
    P0=0xff; //上电初始化,P0全灭
    led=1; //上电初始化,led灯不亮
    TCON=0x05; //打开外部中断1,并设置为下降沿触发
    IE=0x85; //开总中断和外部中断1
    while(1)
    {
        delay_ms(3000);
    }
}
//=================================================
void delay_ms(unsigned int xms) //ms级延时子程序
{
    unsigned int x,y; 
    for(x=xms;x>0;x--)
        for(y=130;y>0;y--);
}
//------------------------------------------------- 
void key_scan_1() interrupt 0 //使用了外部中断0的键盘扫描子函数
{ 
    if(k1==0) //有键按下吗?(k1=0 ?)
    { 
        delay_ms(10); //延时消抖
        if(k1==0) //确实是有键按下,则:
        {
            P0=~P0; //翻转8个灯的状态
            while(!k1);
        } //等待按键放开
    } 
}
void key_scan_2() interrupt 2 //使用了外部中断1的键盘扫描子函数
{ 
    if(k2==0) //有键按下吗?(k1=0 ?)
    { 
        delay_ms(10); //延时消抖
        if(k2==0) //确实是有键按下,则:
        {
            led=!led; //翻转单个灯的状态
            while(!k2);
        } //等待按键放开
    } 
}
  • 外部中断扩展应用例程-5(8个按钮分别去控制8个灯的亮灭)
  • 八个按钮通过8个二极管接到外部中断0脚进行中断扩展,
  • 从而解决外部中断口不够用的问题
#include 

sbit k0=P2^0; //八个按键分别接到P2口各个脚上,
sbit k1=P2^1; //同时还通过二极管连接到外部中断0脚(P3.2)
sbit k2=P2^2;
sbit k3=P2^3;
sbit k4=P2^4;
sbit k5=P2^5;
sbit k6=P2^6;
sbit k7=P2^7;
sbit led0=P0^0; //接在P0脚上的8个LED灯,分别受控于上述8个按键
sbit led1=P0^1;
sbit led2=P0^2;
sbit led3=P0^3;
sbit led4=P0^4;
sbit led5=P0^5;
sbit led6=P0^6;
sbit led7=P0^7;
void delay_ms(unsigned int xms); //ms级延时子程序
//=================================================

void main()
{
    //上电初始化,led灯不亮
    TCON=0x01; //打开外部中断0,并设置为下降沿触发
    IE=0x81; //开总中断
    while(1)
    {
        delay_ms(3000);
    }
}
//=================================================
void delay_ms(unsigned int xms) //ms级延时子程序
{ 
    unsigned int x,y; 
    for(x=xms;x>0;x--)
        for(y=130;y>0;y--);
}
//------------------------------------------------- 
void key_scan() interrupt 0 //使用了外部中断0的键盘扫描子函数
{
    if(k0==0) //有键按下吗?(k0=0 ?)
    {
        delay_ms(10); //延时消抖
        if(k0==0) //确实是有键按下,则:
        {
            led0=!led0; //翻转灯的状态
            while(!k0);} //等待按键放开
    }
    if(k1==0) //有键按下吗?(k1=0 ?)
    {
        delay_ms(10); //延时消抖
        if(k1==0) //确实是有键按下,则:
        {
            led1=!led1; //翻转灯的状态
            while(!k1);} //等待按键放开
    }
    if(k2==0) //有键按下吗?(k2=0 ?)
    {
        delay_ms(10); //延时消抖
        if(k2==0) //确实是有键按下,则:
        {
            led2=!led2; //翻转灯的状态
            while(!k2);} //等待按键放开
    }
    if(k3==0) //有键按下吗?(k3=0 ?)
    { 
        delay_ms(10); //延时消抖
        if(k3==0) //确实是有键按下,则:
        {
            led3=!led3; //翻转灯的状态
            while(!k3);} //等待按键放开
    }
    if(k4==0) //有键按下吗?(k4=0 ?)
    {
        delay_ms(10); //延时消抖
        if(k4==0) //确实是有键按下,则:
        {
            led4=!led4; //翻转灯的状态
            while(!k4);} //等待按键放开
    }
    if(k5==0) //有键按下吗?(k5=0 ?)
    {
        delay_ms(10); //延时消抖
        if(k5==0) //确实是有键按下,则:
        {
            led5=!led5; //翻转灯的状态
            while(!k5);
        } //等待按键放开
    }
    if(k6==0) //有键按下吗?(k6=0 ?)
    {
        delay_ms(10); //延时消抖
        if(k6==0) //确实是有键按下,则:
        {
            led6=!led6; //翻转灯的状态
            while(!k6);
        } //等待按键放开
    }
    if(k7==0) //有键按下吗?(k7=0 ?)
    {
        delay_ms(10); //延时消抖
        if(k7==0) //确实是有键按下,则:
        {
            led7=!led7; //翻转灯的状态
            while(!k7);
        } //等待按键放开
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5692615.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存