仿真图、完整程序见文末
本程序的主要目的是控制一个或多个数码管显示数字,控制的数码管多少由数组决定(最多8个)。预处理指令:
#include <reg52.h> #include <stdio.h> #include <intrins.h>
这些语句是包含库的指令。reg52.h
是一个包含 8051 的特殊功能寄存器 (SFR) 定义的头文件。stdio.h
是一个标准输入输出库,尽管在这段代码中并未直接使用到。intrins.h
包含了一些编译器内置函数,这里使用 _nop_()
函数作为无操作指令。
之后定义了一些变量和全局数组:
#define u8 unsigned char #define u16 unsigned int u8 duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88}; u8 wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
duan
数组保存了数码管显示0到10的编码。wei
数组是位选数组,用于选取数码管。
延时 函数:
void Delay100us(u8 a) //@12.000MHz { unsigned char i; _nop_(); i = 47*a; while (--i); }
这个函数用于产生一个大约 100 微秒 * a 的延时。_nop_()
是无操作指令,主要用于等待一段时间。在这个函数中,一次无操作大约需要一微秒。因此,47 次无操作大约需要 47 微秒。总的时间就是 47 微秒乘以 a。
数码管显示函数如下:
void decide(u8 *num,u8 length){ u8 i=0; for(i=0;i<length;i++){ P2=wei[i]; P0=duan[num[i]]; Delay100us(100); } }
该
函数是数码管显示的主函数。通过遍历数组 num
,使用数组 duan
和 wei
控制数码管显示。P0和P2是8051单片机的两个并口,这里P2用于选位(决定哪个数码管显示),P0用于段选(决定显示什么数字)。
最后是 main
函数:
void main() { u8 num[]={1,2,3,4,5}; //待使用数组 u8 length=0; length=sizeof(num)/sizeof(num[0]); //长度检测,数组长度外的数码管不开启 while(1){ decide(num,length); //显示函数 } }
main
函数是程序的入口点。num
数组保存了需要显示的数字。数组 length
是 num
的长度。decide(num, length)
在无限循环中被调用,使得数码管持续显示 num
数组中的数字。
仿真图如下:
完整程序:
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#define u8 unsigned char
#define u16 unsigned int
u8 duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88};
u8 wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void Delay100us(u8 a) //@12.000MHz
{
unsigned char i;
_nop_();
i = 47*a;
while (--i);
}
void decide(u8 *num,u8 length){
u8 i=0;
for(i=0;i<length;i++){
P2=wei[i];
P0=duan[num[i]];
Delay100us(100);
}
}
void main()
{
u8 num[]={1,2,3,4,5};//待使用数组
u8 length=0;
length=sizeof(num)/sizeof(num[0]);//长度检测,数组长度外的数码管不开启
while(1){
decide(num,length);//显示函数
}
}