#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 08:41:05 浏览: 114
可以将 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; }
这是一个基于51单片机的数码管显示程序。程序中通过调用seg.h和delay.h中的函数,实现了数码管的显示功能。其中,Seg_Duan数组存储了0~F的显示值,通过计算输入的数据,将其转换为数码管可以识别的段码,并将其赋值给Duan_Port进行显示。Wei_Port则是控制数码管的位选信号,通过wei1~wei4四个引脚的控制,实现了四位数码管的显示。整个程序实现了数码管的静态显示。
阅读全文