基于proteus的51单片机仿真实例十七、用不同的数据类型控制LED灯的闪烁频率

单片机的程序设计离不开对各种数据的处理,数据在单片机内存中的存放情况由数据结构决定。c语言的数据结构是以数据类型出现的。数据类型可分为基本数据类型和复杂数据类型,复杂数据类型是由基本数据类型构造而成的。
C语言中的基本数据类型有:char,int,short,long,float和double这几种。其中char,int,short,long常用于指示整型数据,因此有包含有符号型和无符号型两种,float和double常用于表示实型数据。
另外在c51中还有一些用于实现位操作和寄存器操作的数据类型。
 
接下来我们将利用几个实例来演示数据类型、数据运算等操作
 
1、本例分别使用无符号整型数据和无符号字符型数据来设计延时函数,跟别用于控制D1和D2的闪烁,从而研究这两种数据的特性。
2、实现方法
为比较两种数据的使用效果,本例中将延时函数的循环次数设置相同,然后通过比较延时时间,直观地观察两种数据类型的使用效果。
 
3、在keil c51中新建工程ex5,编写如下程序代码,并编译生成ex5.hex文件
 
//实例5,用不同数据类型的延时函数控制LED灯的闪烁时间
#include <reg51.h>
/*******************************************
函数功能:用整型数据延时一段时间
********************************************/
void int_delay(void)    //定义整型数据实现的延时函数
{
 unsigned int i,j;     //定义无符号整型变量,双字节数据,数值范围0-65535
 for(j = 0;j < 200;j++)
 for(i = 0;i < 200;i++);     //无任何操作的空循环,起到延时作用
}
/*******************************************
 函数功能:用字符型数据延时一段时间
********************************************/
void char_delay(void)     //定义整型数据实现的延时函数
{
 unsigned char i,j;     //定义无符号字符型变量,单字节数据,数值范围0-255
 for(j = 0;j < 200;j++)
 for(i = 0;i < 200;i++);     //无任何操作的空循环,起到延时作用
}
/*******************************************
函数功能:主函数
********************************************/
void main(void)
{
 unsigned char i;
 
 while(1)
 {
   for(i = 0;i < 3;i++)
  {
     P1 = 0xfe;     //点亮p1.0口上的LED灯
    int_delay();    //延时一段较长时间
    P1=0xff;    //熄灭p1.0口上的LED灯
    int_delay();
  }
  for(i = 0;i < 3;i++)
  {
     P1 = 0xef;  //点亮p1.4口上的LED灯
    char_delay(); //延时一段较短时间
    P1=0xff;
    char_delay();
  }
 }
}
 
4、在proteus中新建应用电路ex5,电路如下所示,为便于观察,在电路中增加了虚拟示波器,示波器的两个通道分别检测P1.0和P1.4端口的输出波形。虚拟示波器的添加步骤如下图所示
基于proteus的51单片机仿真实例十七、用不同的数据类型控制LED灯的闪烁频率
 
启动仿真后,双击示波器原理图符号,弹出如下图所示的对话框,根据图中的提示步骤,可以更改示波器的各项参数。

 基于proteus的51单片机仿真实例十七、用不同的数据类型控制LED灯的闪烁频率
下图是仿真运行后,观察两个LED的闪烁速度,可以看出,D1的闪烁速度要慢于D2的闪烁速度。通过观察P1.0口和P1.4口的输出波形也可以得出同样的结论。
那么为什么延时函数的数值一样,只是数据类型不一样,延时的时间却有差别呢?原因就在于数据类型的差别上!
由于无符号整型数据占两个字节,而无符号字符型数据仅占一个字节,因此对无符号整型数据进行操作花费的时间就要长一些。所以,为了提高程序的运行速度,一般尽可能采用占用字节数据短的数据类型。

 基于proteus的51单片机仿真实例十七、用不同的数据类型控制LED灯的闪烁频率