#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; // 关闭消影 } ``` 希望以上注释能够帮助你理解代码的实现过程。

相关推荐

#include<avr/io.h> #include<avr/interrupt.h> #include <util/delay.h> #define delay_ms(x) _delay_ms(x) const unsigned char disp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; unsigned char ledbuf[]={0x00,0x00,0x00,0x00}; unsigned int i; unsigned int sum; unsigned int y=0; int k[10]; void disp_init(void) { OCR1A = 4999; TCCR1A = 0x00; TCCR1B = (1 << WGM12); //CTC模式 TCCR1B |= (1 << CS11); //8分频 TIMSK |= (1 << OCIE1A); //开比较匹配中断A } void display(char num,char pos) { SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0); PORTB &= 0x0F; //关位选 PORTB&=~(1<<0); SPDR=num; while(0==(SPSR&0X80)); PORTB|=(1<<0); PORTB |= 1<<(7-pos); } ISR(TIMER1_COMPA_vect) { static unsigned char k=0; k=(++k)%4; display(ledbuf[k],k); PORTA=ledbuf[k]; } void io_init(void) //IO初始化 { DDRB=0xFF; PORTB=0xF8; DDRC=0xFF; PORTC&=~(1<<7); //74HC595使能 DDRD=0x00; //PORTD=0xFF;//PD口8个按键端口输入,上拉 } void get(void) { //ADMUX=(0<<REFS1)|(1<<REFS0)|(1<<MUX1); ADMUX=(1<<REFS0); ADCSRA=(1<<ADEN) |(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS0); ADCSRA|=(1<<ADSC); while(!(ADCSRA&(1<<ADIF))); ADCSRA|=(1<<ADIF); ADCSRA&=~(1<<ADEN); k[y]=ADC; y=y+1; if(y>=9) { for(y=0;y<=9;y++) { sum=k[y]+sum;} y=0; i=sum/9; sum=0; float v=i*5.0/1024; int a=(int)v; int b=(int)((v-a)*1000); ledbuf[0] = disp[a]|0x80; ledbuf[1] = disp[b/100]; ledbuf[2] = disp[(b%100)/10]; ledbuf[3] = disp[b%10]; } } void main() { io_init(); disp_init(); sei(); while (1) { get(); delay_ms(100); } }什么意思逐句解释

详细解释代码:#include <avr/io.h> #include<avr/interrupt.h> #include <util/delay.h> #define delay_ms(x) _delay_ms(x) const unsigned char disp[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; // 显示缓冲区,分别存放的是千位、百位、十位、个位的段码 unsigned char ledbuf[]={0x00,0x00,0x00,0x00}; // 定时器1的初始化,CTC模式,8分频,中断周期5ms unsigned char key_num=0; void disp_init(void) { OCR1A = 4999; //100Hz=8MHz/(2*8*(1+OCR1A)) TCCR1A = 0x00; TCCR1B = (1 << WGM12); //CTC模式 TCCR1B |= (1 << CS11); //8分频 TIMSK |= (1 << OCIE1A); //开比较匹配中断A } //数码管显示函数 void display(char num,char pos) { SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0); PORTB &= 0x0F; //关位选 PORTB&=~(1<<0); SPDR=num; while(0==(SPSR&0X80)); PORTB|=(1<<0); PORTB |= 1<<(7-pos); } // 中断服务程序的功能:刷新段码与位控制,用变量k实现轮流刷新的目的 ISR(TIMER1_COMPA_vect) { static unsigned char k=0; //显示刷新标志 k=(++k)%4; display(ledbuf[k],k);//显示 PORTA = ledbuf[k];//传送数据位 } void io_init(void) //IO初始化 { DDRB=0xFF; PORTB=0x08; DDRC=0xFF; PORTC&=~(1<<7); //74HC595使能 DDRD=0x00; PORTD=0xFF;//PD口8个按键端口输入,上拉 } //扫描键盘,获得键码,更新显示缓冲区 void key_led(void) { unsigned char i,j; //键码记录 //按键表示的数字 key_num=key_num+1; if (key_num>9999) {key_num=0;} //更新显示缓冲区 ledbuf[0] = disp[key_num%10]; ledbuf[1] = disp[key_num%100/10]; ledbuf[2] = disp[key_num%1000/100]; ledbuf[3] = disp[key_num/1000]; } //等待按键松开 void main() { io_init(); disp_init(); sei(); while (1) { key_led(); //键盘扫描 delay_ms(100); //键盘扫描间隔 } }

最新推荐

recommend-type

利用单片机I/O口直接驱动LCD

本控制板需要进行温度控制,显示界面要求LCD显示。带专用LCD驱动器,又带A/D转换器的单片机成本太高,因此选用台湾义隆公司带A/D的单片机EM78P259N直接驱动LCD。该款单片机性价比高,性能可靠,很适合在家电控制中应用。 ...
recommend-type

六首页数字藏品NFT交易网React NextJS网站模板 六首页数字藏品nft交易网反应NextJS网站模板

六首页数字藏品NFT交易网React NextJS网站模板 六首页数字藏品nft交易网反应NextJS网站模板
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

实现实时监控告警系统:Kafka与Grafana整合

![实现实时监控告警系统:Kafka与Grafana整合](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9BVldpY3ladXVDbEZpY1pLWmw2bUVaWXFUcEdLT1VDdkxRSmQxZXB5R1lxaWNlUjA2c0hFek5Qc3FyRktudFF1VDMxQVl3QTRXV2lhSWFRMEFRc0I1cW1ZOGcvNjQw?x-oss-process=image/format,png) # 1.1 Kafka集群架构 Kafka集群由多个称为代理的服务器组成,这
recommend-type

导入numpy库,创建两个包含9个随机数的3*3的矩阵,将两个矩阵分别打印出来,计算两个数组的点积并打印出来。(random.randn()、dot()函数)

可以的,以下是代码实现: ```python import numpy as np # 创建两个包含9个随机数的3*3的矩阵 matrix1 = np.random.randn(3, 3) matrix2 = np.random.randn(3, 3) # 打印两个矩阵 print("Matrix 1:\n", matrix1) print("Matrix 2:\n", matrix2) # 计算两个数组的点积并打印出来 dot_product = np.dot(matrix1, matrix2) print("Dot product:\n", dot_product) ``` 希望