用51单片机编程控制共阴极8位数码管显示00-00-00使用74HC138翻译器代码

时间: 2023-08-19 21:05:50 浏览: 48
以下是使用51单片机编程控制共阴极8位数码管显示00-00-00使用74HC138翻译器的代码: ``` #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit D1=P1^0; sbit D2=P1^1; sbit D3=P1^2; sbit D4=P1^3; sbit D5=P1^4; sbit D6=P1^5; sbit D7=P1^6; sbit D8=P1^7; sbit S1=P2^0; sbit S2=P2^1; sbit S3=P2^2; uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; void delay(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void main() { uchar i,j,k; while(1) { for(i=0;i<10;i++) { for(j=0;j<10;j++) { for(k=0;k<10;k++) { D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1; S1=1;S2=1;S3=1; switch(k) { case 0:S1=0;S2=0;S3=0;break; case 1:S1=1;S2=0;S3=0;break; case 2:S1=0;S2=1;S3=0;break; case 3:S1=1;S2=1;S3=0;break; case 4:S1=0;S2=0;S3=1;break; case 5:S1=1;S2=0;S3=1;break; case 6:S1=0;S2=1;S3=1;break; case 7:S1=1;S2=1;S3=1;break; } D1=0;P0=duan[i];delay(5);D1=1; D2=0;P0=duan[j];delay(5);D2=1; D3=0;P0=0x40;delay(5);D3=1; D4=0;P0=duan[k];delay(5);D4=1; D5=0;P0=duan[i];delay(5);D5=1; D6=0;P0=duan[j];delay(5);D6=1; D7=0;P0=0x40;delay(5);D7=1; D8=0;P0=duan[k];delay(5);D8=1; } } } } } ``` 其中,duan数组存储了0~9及空格所对应的数码管段码,delay函数用于延时,S1、S2、S3分别对应74HC138译码器的A、B、C三个输入端口,D1~D8分别对应8位共阴极数码管的8个数码位端口。程序通过三层循环实现了00-00-00的逐位显示。

相关推荐

好的,以下是使用Keil5编写STC单片机74hc164驱动8位数码管动态显示的C语言代码,您可以根据需要进行修改: #include "stc89c52.h" // 定义数码管的8个位选引脚和8个段选引脚 sbit LED_COM1 = P2^0; sbit LED_COM2 = P2^1; sbit LED_COM3 = P2^2; sbit LED_COM4 = P2^3; sbit LED_COM5 = P2^4; sbit LED_COM6 = P2^5; sbit LED_COM7 = P2^6; sbit LED_COM8 = P2^7; sbit LED_A = P3^0; sbit LED_B = P3^1; sbit LED_C = P3^2; sbit LED_D = P3^3; sbit LED_E = P3^4; sbit LED_F = P3^5; sbit LED_G = P3^6; sbit LED_DP = P3^7; // 定义动态显示程序的数组 unsigned char code LED_TAB[]={ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 }; // 定义定时器中断计数器 unsigned int count = 0; // 定义动态显示函数 void Display(unsigned char *p); // 定义定时器中断函数 void Timer0_ISR() interrupt 1 { TH0 = 0xFC; // 定时器计数初值 TL0 = 0x67; count++; // 计数器加1 if (count >= 500) // 每隔500ms刷新一次数码管 { count = 0; Display(LED_TAB); // 调用动态显示函数 } } // 主函数 void main() { // 初始化IO口 P2 = 0x00; // P2口设置为输出模式 P3 = 0x00; // P3口设置为输出模式 LED_COM1 = 1; // 数码管关闭 LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; LED_COM5 = 1; LED_COM6 = 1; LED_COM7 = 1; LED_COM8 = 1; LED_A = 0; LED_B = 0; LED_C = 0; LED_D = 0; LED_E = 0; LED_F = 0; LED_G = 0; LED_DP = 0; // 初始化定时器 TMOD = 0x01; // 定时器0,模式1 TH0 = 0xFC; // 定时器计数初值 TL0 = 0x67; ET0 = 1; // 开启定时器中断 TR0 = 1; // 启动定时器 // 主循环 while(1); } // 动态显示函数 void Display(unsigned char *p) { static unsigned char i = 0; i++; if (i > 8) i = 1; switch(i) { case 1: LED_COM1 = 0; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; LED_COM5 = 1; LED_COM6 = 1; LED_COM7 = 1; LED_COM8 = 1; P3 = *(p + 0); break; case 2: LED_COM1 = 1; LED_COM2 = 0; LED_COM3 = 1; LED_COM4 = 1; LED_COM5 = 1; LED_COM6 = 1; LED_COM7 = 1; LED_COM8 = 1; P3 = *(p + 1); break; case 3: LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 0; LED_COM4 = 1; LED_COM5 = 1; LED_COM6 = 1; LED_COM7 = 1; LED_COM8 = 1; P3 = *(p + 2); break; case 4: LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 0; LED_COM5 = 1; LED_COM6 = 1; LED_COM7 = 1; LED_COM8 = 1; P3 = *(p + 3); break; case 5: LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; LED_COM5 = 0; LED_COM6 = 1; LED_COM7 = 1; LED_COM8 = 1; P3 = *(p + 4); break; case 6: LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; LED_COM5 = 1; LED_COM6 = 0; LED_COM7 = 1; LED_COM8 = 1; P3 = *(p + 5); break; case 7: LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; LED_COM5 = 1; LED_COM6 = 1; LED_COM7 = 0; LED_COM8 = 1; P3 = *(p + 6); break; case 8: LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; LED_COM5 = 1; LED_COM6 = 1; LED_COM7 = 1; LED_COM8 = 0; P3 = *(p + 7); break; default: break; } } 以上是使用Keil5编写STC单片机74hc164驱动8位数码管动态显示的C语言代码,具体实现方式可能会有所不同,仅供参考。
下面是修改后的代码,可以实现8位数码管显示时间为09-59-58: #include <reg51.h> #define uint unsigned int #define uchar unsigned char uchar code duan[17]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //数码管段选码表 uchar code wei[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //数码管位选码表 uchar hour=9, minute=59, second=58; //时分秒的变量 void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void main() { TMOD=0x01; //设置定时器0为模式1,计数值为1ms TH0=(65536-1000)/256; //设置定时器0的初始值 TL0=(65536-1000)%256; TR0=1; //启动定时器0 ET0=1; //开启定时器0的中断 EA=1; //开启总中断 while(1) //主程序循环 { P0=duan[hour/10]; //输出小时的十位数 P2=wei[0]; //选择第1位数码管 delay(1); P0=duan[hour%10]; //输出小时的个位数 P2=wei[1]; //选择第2位数码管 delay(1); P0=0x40; //输出冒号 P2=wei[2]; //选择第3位数码管 delay(1); P0=duan[minute/10]; //输出分钟的十位数 P2=wei[3]; //选择第4位数码管 delay(1); P0=duan[minute%10]; //输出分钟的个位数 P2=wei[4]; //选择第5位数码管 delay(1); P0=0x40; //输出冒号 P2=wei[5]; //选择第6位数码管 delay(1); P0=duan[second/10]; //输出秒钟的十位数 P2=wei[6]; //选择第7位数码管 delay(1); P0=duan[second%10]; //输出秒钟的个位数 P2=wei[7]; //选择第8位数码管 delay(1); } } void T0_time() interrupt 1 //定时器0中断服务函数 { TH0=(65536-1000)/256; //重置定时器0的初始值 TL0=(65536-1000)%256; second--; //秒数减1 if(second==255) //如果秒数减到0,则分钟数减1 { second=59; minute--; if(minute==255) //如果分钟数减到0,则小时数减1 { minute=59; hour--; if(hour==255) hour=23; //如果小时数减到0,则重新从23开始倒数 } } } 这个代码将定时器中断的处理改成了倒计时模式,可以实现8位数码管显示时间为09-59-58,每隔1秒更新一次。
使用51单片机控制8位数码管显示时间的步骤如下: 1. 配置端口:将8位数码管的8个段选端口和8个位选端口连接到单片机的8个IO口上。 2. 定义变量:定义变量用于存储时间的小时、分钟和秒数。 3. 初始化定时器:使用定时器控制时间的变化,需要设置定时器的工作模式和计数值,以获得1秒的时间基准。 4. 循环显示时间:在主程序中使用循环语句,不断更新时间的变量,并将其转换为8位数码管的显示格式,依次输出到对应的IO口上,实现时间的动态显示。 下面是一个简单的示例代码: #include <reg51.h> #define uint unsigned int #define uchar unsigned char uchar code duan[17]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; //数码管段选码表 uchar code wei[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //数码管位选码表 uchar hour=0, minute=0, second=0; //时分秒的变量 void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void main() { TMOD=0x01; //设置定时器0为模式1,计数值为1ms TH0=(65536-1000)/256; //设置定时器0的初始值 TL0=(65536-1000)%256; TR0=1; //启动定时器0 ET0=1; //开启定时器0的中断 EA=1; //开启总中断 while(1) //主程序循环 { P0=duan[hour/10]; //输出小时的十位数 P2=wei[0]; //选择第1位数码管 delay(1); P0=duan[hour%10]; //输出小时的个位数 P2=wei[1]; //选择第2位数码管 delay(1); P0=0x40; //输出冒号 P2=wei[2]; //选择第3位数码管 delay(1); P0=duan[minute/10]; //输出分钟的十位数 P2=wei[3]; //选择第4位数码管 delay(1); P0=duan[minute%10]; //输出分钟的个位数 P2=wei[4]; //选择第5位数码管 delay(1); P0=0x40; //输出冒号 P2=wei[5]; //选择第6位数码管 delay(1); P0=duan[second/10]; //输出秒钟的十位数 P2=wei[6]; //选择第7位数码管 delay(1); P0=duan[second%10]; //输出秒钟的个位数 P2=wei[7]; //选择第8位数码管 delay(1); } } void T0_time() interrupt 1 //定时器0中断服务函数 { TH0=(65536-1000)/256; //重置定时器0的初始值 TL0=(65536-1000)%256; second++; //秒数加1 if(second==60) //如果秒数达到60,则分钟数加1 { second=0; minute++; if(minute==60) //如果分钟数达到60,则小时数加1 { minute=0; hour++; if(hour==24) hour=0; //如果小时数达到24,则重新从0开始计数 } } } 这个代码可以实现8位数码管的时间显示,每隔1秒更新一次。你可以根据实际需要进行调整和修改。
以下是用51单片机的汇编语言编写的程序,可以控制6位数码管显示"123456": ORG 0H ; 程序从地址0开始执行 MOV P0, #0FFH ; 将P0口设置为输出 MOV R0, #06H ; R0寄存器存储循环次数,共6次 LOOP: MOV A, #01H ; A寄存器存储数字码 MOV P1, A ; 将数字码输出到P1口,控制第一位数码管显示1 ACALL DELAY ; 延时一段时间,以便观察 MOV A, #02H ; A寄存器存储数字码 MOV P1, A ; 将数字码输出到P1口,控制第二位数码管显示2 ACALL DELAY ; 延时一段时间,以便观察 MOV A, #03H ; A寄存器存储数字码 MOV P1, A ; 将数字码输出到P1口,控制第三位数码管显示3 ACALL DELAY ; 延时一段时间,以便观察 MOV A, #04H ; A寄存器存储数字码 MOV P1, A ; 将数字码输出到P1口,控制第四位数码管显示4 ACALL DELAY ; 延时一段时间,以便观察 MOV A, #05H ; A寄存器存储数字码 MOV P1, A ; 将数字码输出到P1口,控制第五位数码管显示5 ACALL DELAY ; 延时一段时间,以便观察 MOV A, #06H ; A寄存器存储数字码 MOV P1, A ; 将数字码输出到P1口,控制第六位数码管显示6 ACALL DELAY ; 延时一段时间,以便观察 DJNZ R0, LOOP ; 循环6次,每次控制一位数码管显示 DELAY: MOV R1, #255 ; R1寄存器存储循环次数,控制延时时间 DELAY_LOOP: DJNZ R1, DELAY_LOOP ; 循环R1次,实现延时 RET ; 延时结束,返回主程序 END ; 程序结束 解释: 1. 该程序使用了P0口控制6位数码管的显示,使用了P1口输出数字码。 2. 程序中使用了循环结构,循环6次,每次控制一位数码管显示。 3. 程序中使用了延时函数,以便观察数码管的显示效果。 4. 程序结束后,使用END语句标识。 注意: 1. 程序需要通过外部电路连接到数码管上。 2. 程序需要进行适当的调试和修改,以适应具体的硬件环境和需求。

最新推荐

基于FPGA的74HC595驱动数码管动态显示--Verilog实现

基于FPGA的74HC595驱动数码管动态显示--Verilog实现.由FPGA控制74HC595驱动数码管其实主要是抓住74HC595的控制时序,进而输出所需控制显示的内容,由同步状态机实现.

用软件延时实现00-59秒单片机计时器

用软件延时实现00-59秒单片机计时器:在AT89S51单片机的P0和P2端口分别接有两个共阴数码管,P0口驱动显示秒时间的十位,而P2口驱动显示秒时间的个位。

密码锁设计(4×4键盘及8位数码管显示)

用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用LED发光二极管亮一秒钟做为提示,同时发出“叮咚”...

单片机控制74HC595动态扫描数码管显示

74HC595是具有8位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是分别的时钟。数据在SCK的上升沿输入,在RCK的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个...

单片机数码管之共阴极与共阳极编码

数码管是单片机设计中经常用到的器件,本文主要介绍单片机数码管之共阴极与共阳极编码

面向6G的编码调制和波形技术.docx

面向6G的编码调制和波形技术.docx

管理建模和仿真的文件

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

Power BI中的数据导入技巧

# 1. Power BI简介 ## 1.1 Power BI概述 Power BI是由微软公司推出的一款业界领先的商业智能工具,通过强大的数据分析和可视化功能,帮助用户快速理解数据,并从中获取商业见解。它包括 Power BI Desktop、Power BI Service 以及 Power BI Mobile 等应用程序。 ## 1.2 Power BI的优势 - 基于云端的数据存储和分享 - 丰富的数据连接选项和转换功能 - 强大的数据可视化能力 - 内置的人工智能分析功能 - 完善的安全性和合规性 ## 1.3 Power BI在数据处理中的应用 Power BI在数据处

建立关于x1,x2 和x1x2 的 Logistic 回归方程.

假设我们有一个包含两个特征(x1和x2)和一个二元目标变量(y)的数据集。我们可以使用逻辑回归模型来建立x1、x2和x1x2对y的影响关系。 逻辑回归模型的一般形式是: p(y=1|x1,x2) = σ(β0 + β1x1 + β2x2 + β3x1x2) 其中,σ是sigmoid函数,β0、β1、β2和β3是需要估计的系数。 这个方程表达的是当x1、x2和x1x2的值给定时,y等于1的概率。我们可以通过最大化似然函数来估计模型参数,或者使用梯度下降等优化算法来最小化成本函数来实现此目的。

智能网联汽车技术期末考试卷B.docx

。。。