#include <reg51.h> // 51单片机头文件 // 数码管显示的字符数组,对应0~9的段码 unsigned char code LEDChar[] = { 0x3f, // 0 0x06, // 1 0x5b, // 2 0x4f, // 3 0x66, // 4 0x6d, // 5 0x7d, // 6 0x07, // 7 0x7f, // 8 0x6f // 9 }; // 位选的控制码,对应P1口的控制信号 unsigned char code LEDPos[] = { 0xfe, // 第1位 0xfd, // 第2位 0xfb, // 第3位 0xf7, // 第4位 0xef, // 第5位 0xdf, // 第6位 0xbf, // 第7位 0x7f // 第8位 }; void delay(unsigned int i) // 延时函数 { while(i--); } void main() { unsigned char i, j, num[8] = {1, 2, 3, 4, 5, 6, 7, 8}; // num数组存储要显示的数字 while(1) { for(i=0; i<8; i++) // 依次显示每一位数码管 { P1 = LEDPos[i]; // 控制P1口的信号,选择要显示的位 P2 = LEDChar[num[i]]; // 控制P2口的信号,选择要显示的数字 delay(500); // 延时一段时间,控制显示的速度 } // 加一操作,每次将最后一位数字加一 j = 1; while(num[8-j] == 9) // 如果最后一位数字是9,则进位 { num[8-j] = 1; j++; } num[8-j]++; // 最后一位数字加一 } }修改一下延时函数,大约1秒加一
时间: 2024-03-28 12:41:05 浏览: 22
可以将 delay 函数中的参数从 500 改成 5000,这样每次延时的时间就会变长,大约为 1 秒。修改后的代码如下:
```c
void delay(unsigned int i) // 延时函数
{
while(i--);
}
void main() {
unsigned char i, j, num[8] = {1, 2, 3, 4, 5, 6, 7, 8}; // num数组存储要显示的数字
while(1)
{
for(i=0; i<8; i++) // 依次显示每一位数码管
{
P1 = LEDPos[i]; // 控制P1口的信号,选择要显示的位
P2 = LEDChar[num[i]]; // 控制P2口的信号,选择要显示的数字
delay(5000); // 延时一段时间,控制显示的速度
}
// 加一操作,每次将最后一位数字加一
j = 1;
while(num[8-j] == 9) // 如果最后一位数字是9,则进位
{
num[8-j] = 1;
j++;
}
num[8-j]++; // 最后一位数字加一
}
}
```
相关问题
#include <reg52.H>//器件配置文件 #include <intrins.h> // 变量声明 unsigned int timer=0; char num=0; unsigned char const discode[] ={0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xB8,0x20,0x28,0x7F}; //数码管显示码0123456789- unsigned char disbuff[4]={0,0,0,0}; //距离信息 sbit W0=P2^4; sbit W1=P2^5; sbit W2=P2^6; sbit W3=P2^7; //超声波传感器接口 sbit TX = P2^2; sbit DIAN=P0^5; //0:小数点亮 1:不亮 sbit Feng= P2^0; //0:蜂鸣器报警 1:不报警 /*******************************/ //扫描数码管 void Display(void) { num++; if(num==1) { W0=1; P0=discode[disbuff[0]]; // 段码赋值 W3=0; // 显示个位 DIAN=0; // 点亮小数点 } else if(num==2) { W3=1; P0=discode[disbuff[1]]; W2=0; // 显示十位 } else if(num==3) { W2=1; P0=discode[disbuff[2]]; W1=0; // 显示百位 } else if(num>=4) { W1=1; P0=discode[disbuff[3]]; W0=0; // 显示千位 num=0; } }
这段代码实现了一个数码管的扫描显示功能,使用了一个常量数组discode来存储数码管的显示码,使用了disbuff数组来存储要显示的数字。在Display函数中,通过改变W0-W3的值来选择要显示的位数,然后将对应的段码赋值给P0来实现数码管的显示。同时,还设置了DIAN和Feng来控制小数点和蜂鸣器的状态。
#include <reg51.h> #include "seg.h" #include "delay.h" #define Duan_Port P0 #define Wei_Port P2 sbit wei1=P2^0; sbit wei2=P2^1; sbit wei3=P2^2; sbit wei4=P2^3; unsigned char code Seg_Duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0xf1};//显示0~F的值 void Seg_dis(unsigned int dat) { wei1 = 0;//选通高位数码管(左边第1位) Duan_Port = Seg_Duan[dat/1000%10];//赋段码 Delay_xus(50); wei1 = 1; Duan_Port = 0xff;//关闭消影 wei2 = 0; Duan_Port = Seg_Duan[dat/100%10]; Delay_xus(50); wei2 = 1; Duan_Port = 0xff; wei3 = 0; Duan_Port = Seg_Duan[dat/10%10]; Delay_xus(50); wei3 = 1; Duan_Port = 0xff; wei4 = 0; Duan_Port = Seg_Duan[dat%10]; Delay_xus(50); wei4 = 1; Duan_Port = 0xff; }注释一下
好的,以下是每行代码的注释说明:
```c
#include <reg51.h> // 引入51单片机的头文件
#include "seg.h" // 引入数码管头文件
#include "delay.h" // 引入延时函数头文件
#define Duan_Port P0 // 定义数码管段码输出口
#define Wei_Port P2 // 定义数码管位选输出口
sbit wei1=P2^0; // 定义第1个数码管的位选控制引脚
sbit wei2=P2^1; // 定义第2个数码管的位选控制引脚
sbit wei3=P2^2; // 定义第3个数码管的位选控制引脚
sbit wei4=P2^3; // 定义第4个数码管的位选控制引脚
// 显示0~F的值
unsigned char code Seg_Duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0xf1};
// 数码管显示函数
void Seg_dis(unsigned int dat) {
wei1 = 0; // 选通高位数码管(左边第1位)
Duan_Port = Seg_Duan[dat/1000%10]; // 赋段码
Delay_xus(50); // 延时一段时间
wei1 = 1; // 取消选通
Duan_Port = 0xff; // 关闭消影
wei2 = 0; // 选通第2位数码管
Duan_Port = Seg_Duan[dat/100%10]; // 赋段码
Delay_xus(50); // 延时一段时间
wei2 = 1; // 取消选通
Duan_Port = 0xff; // 关闭消影
wei3 = 0; // 选通第3位数码管
Duan_Port = Seg_Duan[dat/10%10]; // 赋段码
Delay_xus(50); // 延时一段时间
wei3 = 1; // 取消选通
Duan_Port = 0xff; // 关闭消影
wei4 = 0; // 选通低位数码管(右边第4位)
Duan_Port = Seg_Duan[dat%10]; // 赋段码
Delay_xus(50); // 延时一段时间
wei4 = 1; // 取消选通
Duan_Port = 0xff; // 关闭消影
}
```
希望以上注释能够帮助你理解代码的实现过程。