1、由于单片机IO口的驱动能力有限,在单片机和数码管中间增加了缓冲器 这样可以有效的保护单片机,提高了驱动能力。2、接法:四位数码管有四个选择端,保证统一时间只A-G字段,只对一个数码管有效。3、点亮数码管,通过选取

快速有多快,慢速有多慢

display(1,2,3,4);//主程序始终调用数码管显示子程序 } } void display(uchar a,uchar b,uchar c,uchar d){ P2=0xef;\t P0=table[a];//给第一个数码管送"a"delay(1);//延时1ms P2=0xdf;P0=table[b]

首先你要明确这是要在实验板上实现呢?还是只是画个仿真来实现呢?那要仿真,首先你要画个仿真图,仿真图也不会画吗?如果没有实验板,也没有仿真图,写了程序也没有用,那怎么执行程序呢?

include define uchar unsigned char define uint unsigned int uchar code dis_code_[]={0xf9,0xb0,0x92,0xf8,0xa4,0x99,0x82,0x80,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c};void delay(uin

主要程序如下:uchar table[8]={1,3,5,7,2,4,6,8};//要显示的数字 uchar qiduan_tab[10]={};//七段码 while(1){ for(i=0;i<5;i++)//先显示1357,第二次显示3572 第三次显示5724 { for(j=0

用单片机控制4位LED数码管显示,先从左至右慢速动态扫描显示数字13572468 大佬求告知

单片机7段数码管动态显示程序代码及其说明如下:include include include unsigned char data dis_digit; //dis_digit---位选通值, 传送到P2口用于选通当 //前数码管的数值, 如等于

假设为共阴极数码管,驱动输入端接单片机P1口,共阴极接P2口的0.1.2.脚。我的程序如下,当前显示数字123 include typedef unsigned char uint8;typedef unsigned int uint16;typedef long int uint32;code

define SEG_Num6//数码管位数 define SEG_DataP1//数码管段驱动接口 define SEG_EnP3//数码管位驱动接口 define SEG_AllOff(SEG_En&=0xc0)//关闭所有数码管(位驱动)define DisTimeAt1msCount3//单'位'数码管显示时间

define smg P2 unsigned char tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};void main(){ smg=tab[0];} //程序就到这里 tab[]这个中括号里面的数字可以随意为0-9 数码管显示为对应的数字

假设P1口接8个LED灯,通过灌电流驱动(即0亮1灭)。单片机设计程序,首先你需要明白单片机的一些基本原则的原理,你在明白之后才能够去根据软件的功能采取设计。你的LED用错模型了,要用LED-RED那几个后面带颜色的。};fla

/*声明七段LED数码管驱动信号数组(共阳)*/ char code TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99, //数字0-4 0x92,0x83,0xf8,0x80,0x98}; //数字5-9 void delay(int); //声明延迟函数 //==主程序==

求单片机实验七段数码管显示实验程序

动态显示。就是先单独显示完一位后,然后关闭这一位(也就是熄灭这一位的led),然后再单独显示下一位。由于人眼反应慢,随意看起来就像4位数码管都在同时显示

最后程序外面套个while(1)就可以实现无限循环了 还有一种方式就是用74HC595和4个数码管连接起来,74HC595是一个串行锁存寄存器,只需要4个74HC595和4个数码管就行,最少只占用单片机2个IO 这里就说明一下74HC595的控制方式

1、首先我们先打开keil。2、接着,我们要定义好库函数,void main(){while(1)//不断循环显示{dispaly();}}void dispaly(){P0=smg[1];//选择显示数字几,P1=0x7f;//控制是否点亮数码管。3、接着,我们加上一条

1、由于单片机IO口的驱动能力有限,在单片机和数码管中间增加了缓冲器 这样可以有效的保护单片机,提高了驱动能力。2、接法:四位数码管有四个选择端,保证统一时间只A-G字段,只对一个数码管有效。3、点亮数码管,通过选取

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管 上显示P ”个字符;2)等待按键,如按了任何一个键,则将这 4个字符清除, 改为显示0000”个字符(为数字的0

display(1,2,3,4);//主程序始终调用数码管显示子程序 } } void display(uchar a,uchar b,uchar c,uchar d){ P2=0xef;P0=table[a];//给第一个数码管送"a"delay(1);//延时1ms P2=0xdf;P0=table[b];//

shiftOut(0x04); // 第3位 break;case 3:shiftOut(0x08); // 第4位 break;default:break;} // 数据锁存 RCLK = 1;delay(1);RCLK = 0;// 数码管刷新延时 delay(5);// 切换显示的位 digit = (digit

如何利用单片机让4位数码管显示?

16键码显示的程序 我们在P1端口接一支共阴数码管SLED,在P2、P3端口接16个按键,分别编号为KEY_0、KEY_1到KEY_F,操作时只能按一个键,按键后SLED显示对应键编号。代码 1. #include 2. #define SLED

程序如下 include sbit k1=P1^0;void delay(){ unsigned int j;for(j=40000;j>0;j--);} void main(){ while(1){ P0=0xff;if(k1==0){ P0=0x55;delay();P0=0xAA;delay();} } } 仿真结果

define uchar unsigned char define uint unsigned int define dataport P1//P1直接驱动数码管的8个阳极 sbit wei1=P3^3;//再有三个管脚接3个三极管驱动数码管的阴极 sbit wei2=P3^4;sbit wei3=P3^5;uint a=0;//

51单片机怎样用键盘控制数码管显示的方法。如下参考:1.首先,编写代码并点亮数码管。2.在编写源代码之后,确保原始代码是正确的。3.确认代码正确后,进入下一步,就是在这一行代码(箭头所指)中,删除这四个单词。4.然后

includesbit led1=P1^0;sbit led2=P1^1;sbit led3=P1^2;sbit key1=P1^4;sbit key2=P1^5;sbit key3=P1^6;main(){while(1) { led1=key1; led2=key2; led3=key3; }}

采用共阴极LED数码管,51单片机P1口输出数据:ORG 0000H JMP MAIN ORG 0100H MAIN:MOV DPTR,#TAB MOV R1,#00H DISP:MOV A,R1 MOVC A,@A+DPTR MOV P1,A LCALL DELAY INC R1 CJNE R1,#0AH,DISP SJMP TAB:

define uchar unsigned char define uint unsigned int uchar j,k;sbit key1=P3^0;sbit key2=P3^1;sbit key3=P3^2;void delay(int ms){ uchar i;while(ms--)for(i=0;i<123;i++);} uchar code tab[]={

利用51单片机控制3个LED数码管在3个数码管上显示字符LED,怎样编写程序?

P1 = 0x00;//清除其他位 P1.2 = 1;//延时 delay();//送第一位数据,假设数据总线为P0,data[]为要显示的数据数组 P0 = data[3];//送位选 P1 = 0x00;//清除其他位 P1.3 = 1;//延时 delay();}

1、首先我们先打开keil。2、接着,我们要定义好库函数,void main(){while(1)//不断循环显示{dispaly();}}void dispaly(){P0=smg[1];//选择显示数字几,P1=0x7f;//控制是否点亮数码管。3、接着,我们加上一条

不停地利用人的视觉暂留,在一个合适的速度下依次显示1个2,1个0,1个3,1个5.当显示一个“2”的时候,其他三位都是空的,以此类推。但人眼是看不到短时间内这些变化的,假如这个行为不断循环,那么人看到的就是“2

如果电路与软件是配合的,并且单片机是真正支持静态的,让时钟足够低,例如10赫兹,可能可以在同一个或同两个数码管 相继 显示5个数;一般的电路单片机的时钟都比较高,数码管上是看不到连续几个数字的,除非你在for循环

单片机控制数码管显示数字1234void smgxs(void)/数码管显示函数{ p20=1;开通位1 P0=shumaguan[1];赋值yanshi();延时p20=0;关闭位1 p21单片机学习之八:用数码管显示数字让最右面的数码管显示数字2,小数点也显示。同时

3. 将74HC4511的LT引脚接地,以使其亮度最大;4. 将一个8位数据线连接到74HC4511的BIN引脚,用于输入要显示的数字;5. 将一个单片机的I/O端口连接到74HC4511的E引脚,以控制其使能端。现在我们已经将74HC4511和7段

单片机连续显示4个数

要用51单片机显示四位数,可用四位一体的共阴数码管,P0口输出段码,P2口输出位码,组成典型的数码管显示电路,就可以显示1234,仿真效果如下图。延时一会,再显示4321

MOV 33H,#03H MOV 34H,#04H MOV 35H,#05H MOV 36H,#06H ACALL D0 JMP $-2 D0: MOV R0,#31H MOV R2,#11111110B MOV DPTR,#TAB D1: ORL P1,#00111111B MOV A,@R0

用四位一体的共阴数码管,用定时器T0定时,实现3秒切换显示四组数字。仿真实现,仿真图如下 include define uchar unsigned char define uint unsigned int uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,

用51单片机组成四位共阳极数码管显示1234 ,proteus仿真图如下所示,P0口输出段码,P2口输出位码。

单片机控制数码管显示数字1234void smgxs(void)/数码管显示函数{ p20=1;开通位1 P0=shumaguan[1];赋值yanshi();延时p20=0;关闭位1 p21单片机学习之八:用数码管显示数字让最右面的数码管显示数字2,小数点也显示。同时

AJMP MAIN ORG 30H MAIN: LCALL DISP MOV 20H,#1 MOV 21H,#2 MOV 22H,#3 MOV 23H,#4 AJMP MAIN DISP: MOV A,20H ACALL SEG7 MOV P0,A SETB P2.0 ACALL DLY CLR P2.0 MOV A,21H ACALL SEG7 MOV

shiftOut(0x04); // 第3位 break;case 3:shiftOut(0x08); // 第4位 break;default:break;} // 数据锁存 RCLK = 1;delay(1);RCLK = 0;// 数码管刷新延时 delay(5);// 切换显示的位 digit = (digit

用51单片机控制4位一体数码管实现1234轮流显示的程序代码是什么,求!proteus仿真

采用共阴极LED数码管,51单片机P1口输出数据:ORG 0000H JMP MAIN ORG 0100H MAIN:MOV DPTR,#TAB MOV R1,#00H DISP:MOV A,R1 MOVC A,@A+DPTR MOV P1,A LCALL DELAY INC R1 CJNE R1,#0AH,DISP SJMP $ TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHDELAY: MOV R4,#2 DELAY100MS:MOV R5,#200 DELAY5MS: MOV R6,#250 LOOP: DJNZ R6,LOOP DJNZ R5,DELAY5MS DJNZ R4,DELAY100MS RET
#include#define uchar unsigned charuchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9void t1isr() interrupt 3 //显示{ TH1=0xec; TL1=0x78; P2=1<<2; P0=~ledtab[3];}main(){ TMOD=0x10; TH1=0xec; TL1=0x78; TR1=1; ET1=1; EA=1; while(1);}
我给你一个数码管代码,自己修改: /******************************************************************************* * 标题: 伟纳电子ME300B单片机开发系统演示程序 - LED数码管显示1-8 * * 文件: wl004.C * * 日期: 2004-1-5 * * 版本: 1.0 * * 作者: 伟纳电子 - Freeman * * 邮箱: freeman@willar.com * * 网站: http://www.willar.com * ******************************************************************************** * 描述: * * LED数码管显示演示程序 * * 在8个LED数码管上依次显示1,2,3,4,5,6,7,8 * * * * * ******************************************************************************** * 【版权】 Copyright(C)伟纳电子 www.willar.com All Rights Reserved * * 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! * *******************************************************************************/ #include #include unsigned char data dis_digit; unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off unsigned char data dis_buf[8]; unsigned char data dis_index; void main() { P0 = 0xff; P2 = 0xff; TMOD = 0x01; TH0 = 0xFC; TL0 = 0x17; IE = 0x82; dis_buf[0] = dis_code[0x1]; dis_buf[1] = dis_code[0x2]; dis_buf[2] = dis_code[0x3]; dis_buf[3] = dis_code[0x4]; dis_buf[4] = dis_code[0x5]; dis_buf[5] = dis_code[0x6]; dis_buf[6] = dis_code[0x7]; dis_buf[7] = dis_code[0x8]; dis_digit = 0xfe; dis_index = 0; TR0 = 1; while(1); } void timer0() interrupt 1 // 定时器0中断服务程序, 用于数码管的动态扫描 // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量 // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时, // 选通P2.0口数码管 // dis_buf --- 显于缓冲区基地址 { TH0 = 0xFC; TL0 = 0x17; P2 = 0xff; // 先关闭所有数码管 P0 = dis_buf[dis_index]; // 显示代码传送到P0口 P2 = dis_digit; // dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管 dis_index++; // dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描 } ;******************************************************************************** ;* 标题: 伟纳电子ME300B单片机开发系统演示程序 - LED数码管显示1-8 * ;* 文件: wl004.asm * ;* 日期: 2004-1-5 * ;* 版本: 1.0 * ;* 作者: 伟纳电子 - Freeman * ;* 邮箱: freeman@willar.com * ;* 网站: http://www.willar.com * ;******************************************************************************** ;* 描述: * ;* LED数码管显示演示程序 * ;* 在8个LED数码管上依次显示1,2,3,4,5,6,7,8 * ;* * ;* * ;******************************************************************************** ;* 【版权】 Copyright(C)伟纳电子 www.willar.com All Rights Reserved * ;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! * ;******************************************************************************** CODE_SEG SEGMENT CODE DATA_SEG SEGMENT DATA RSEG DATA_SEG dis_digit: DS 1 dis_index: DS 1 dis_buf: DS 8 stack: DS 20 ;=========================================================== CSEG AT 00000H ; Reset向量 LJMP MAIN CSEG AT 0000BH ; 定时器0中断向量 LJMP TIMER0 ;=========================================================== RSEG CODE_SEG MAIN: MOV SP,#(stack-1) ; 初始化堆栈指针 MOV P0,#0FFH ; 初始化I/O口 MOV P2,#0FFH MOV TMOD,#01H ; 初始化timer0 MOV TH0,#0FCH MOV TL0,#017H MOV IE,#082H MOV DPTR, #DIS_CODE ; 设定显示初值 MOV A,#1 MOVC A,@A+DPTR MOV dis_buf,A MOV A,#2 MOVC A,@A+DPTR MOV dis_buf+01H,A MOV A,#3 MOVC A,@A+DPTR MOV dis_buf+02H,A MOV A,#4 MOVC A,@A+DPTR MOV dis_buf+03H,A MOV A,#5 MOVC A,@A+DPTR MOV dis_buf+04H,A MOV A,#6 MOVC A,@A+DPTR MOV dis_buf+05H,A MOV A,#7 MOVC A,@A+DPTR MOV dis_buf+06H,A MOV A,#8 MOVC A,@A+DPTR MOV dis_buf+07H,A MOV dis_digit,#0FEH ; 初始从第一个数码管开始扫描 MOV dis_index,A SETB TR0 ; 启动定时器0,开始动态扫描显示 MAIN_LP: ; 主程序循环,增加其它代码 SJMP MAIN_LP ; END OF main ;=========================================================== USING 0 TIMER0: ; 定时器0中断服程序, 用于数码管的动态扫描 ; DIS_INDEX --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量 ; DIS_DIGIT --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时, ; 选通P2.0口数码管 ; DIS_BUF --- 显于缓冲区基地址 PUSH ACC PUSH PSW PUSH AR0 MOV TH0,#0FCH MOV TL0,#017H MOV P2,#0FFH ; 先关闭所有数码管 MOV A,#DIS_BUF ; 获得显示缓冲区基地址 ADD A,DIS_INDEX ; 获得偏移量 MOV R0,A ; R0 = 基地址 + 偏移量 MOV A,@R0 ; 获得显示代码 MOV P0,A ; 显示代码传送到P0口 MOV P2,DIS_DIGIT ; MOV A,DIS_DIGIT ; 位选通值左移, 下次中断时选通下一位数码管 RL A MOV DIS_DIGIT,A INC DIS_INDEX ; DIS_INDEX加1, 下次中断时显示下一位 ANL DIS_INDEX,#0x07 ; 当DIS_INDEX等于8(0000 1000)时, 清0 POP AR0 POP PSW POP ACC RETI ; END OF timer0 ;=========================================================== RSEG CODE_SEG DIS_CODE: DB 0C0H DB 0F9H DB 0A4H DB 0B0H DB 099H DB 092H DB 082H DB 0F8H DB 080H DB 090H DB 0FFH END
/***数显秒表,范围0~999999***/ /***源程序默认硬件环境:52单片机,12MHz晶振,6位共阳数码管,P1 口段选,P30~P35 高电平位选(NPN三极管驱动),P35为最高位数码管***/ #include"reg52.h" //包含52头文件 #define TRUE 1 //定义布尔量'1':真 #define FALSE 0 //定义布尔量'0':假 #define uchar unsigned char //定义 无符号字符型数据 简称 #define uint unsigned int //定义 无符号整型数据 简称 #define ulong unsigned long //定义 无符号长整型数据 简称 #define th0 0xfc #define tl0 0x18 //1ms at 12MHz(定时器工作模式1 状态) #define SEG_Num 6 //数码管位数 #define SEG_Data P1 //数码管段驱动接口 #define SEG_En P3 //数码管位驱动接口 #define SEG_AllOff (SEG_En&=0xc0) //关闭所有数码管(位驱动) #define DisTimeAt1msCount 3 //单'位'数码管显示时间,数码管刷新频率f=1/(N×t),其中 N为数码管位数, t为单'位'数码管显示时间 #define T1sAt1msCount 1000 //1秒 计数值(在定时器为1ms 情况下计数) #define TimesEnd 1000000 //显示内容范围 0~999999 uchar code SEG_B_List[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管代码表"0-9" ulong Sec; uchar bdata Flag=1; sbit DisplayFlag=Flag^0; //显示标志位 sbit TimesUpFlag=Flag^1; //时间更新标志位 void Timer0() interrupt 1 //定时器0中断函数 { static uchar t1ms; //定义静态变量 t1ms 定时计数寄存空间 static uint t1ms_sec; TL0=tl0; TH0=th0; //重赋 1ms 定时初值 t1ms=++t1ms%DisTimeAt1msCount; //先计数值加1,后对计数范围进行限制0~(DisTimeAt1msCount-1) if(!t1ms) DisplayFlag=TRUE; //若定时计数值归0,则表示计数值曾到达 单'位'显示时间(DisTimeAt1msCount),显示标志 置位 t1ms_sec=++t1ms_sec%T1sAt1msCount; //在 T1sAt1msCount(1000) 范围内加1 if(!t1ms_sec) TimesUpFlag=TRUE; //若 归0,则1s 时间到,时间更新标志位 置位 } void SystemInit() //系统初始化函数 { TMOD=0x01; //关闭定时器1,开启定时器0,且工作在模式1(16位定时器) TH0=th0; TL0=tl0; //装定时初值(1ms at 12MHz) TR0=1; //启动计时 ET0=1; //允许定时器0中断 EA=1; //开启系统中断功能 } float Pow_Self(float x,uint y)//自编简易 x 的 y 次方函数,y只能是 非负整数 { float sum; if(x==0 && y==0) return; //0 的 0 次方无意义 else if(x==0) sum=0; //可有可无,y!=0的情况已经包含x=0,不加不影响结果,但影响运算速度 else if(y==0) sum=1; //除上述情况外,任何数的 0 次方均为 1 else if(y==1) sum=x; //任何数的 1 次方 均为 本身 else if(y>1) sum=Pow_Self(x,--y)*x; //递归调用,降幂 return sum; //返回计算结果 } void TimesUpdata() //时间更新 函数 { if(TimesUpFlag) //若 时间更新标志 为真 { Sec=++Sec%TimesEnd; //Sec (秒)在 TimesEnd (0~999) 范围内加1 TimesUpFlag=FALSE; //清 时间更新标志位 } } void Display(ulong dis_num) //显示函数,显示内容为 无符号整型数据 dis_num { static uchar dis_loca; //定义静态变量 显示位置 if(DisplayFlag) //若显示标志位为真(单'位'显示时间结束),则执行以下任务 { DisplayFlag=FALSE; //清显示标志位 dis_loca=++dis_loca%SEG_Num; //先对 显示位置 加1,后对变量范围进行限制 0~(SEG_Num-1) SEG_AllOff; //关闭所有数码管显示(位驱动) SEG_Data=SEG_B_List[(dis_num/(ulong)(Pow_Self(10,dis_loca)))%10]; //将显示内容(dis_num) 本次需显示的位(dis_loca)上的数值转成代码,并送到数据端口 SEG_En|=1<<dis_loca; //开启本次需要显示的位驱动 } } void main() //主函数 { SystemInit(); //调用 系统初始化函数 while(1) //循环系统 { TimesUpdata(); //调用 时间更新函数 Display(Sec); //调用 显示函数 显示内容为 Sec } }
首先你要明确这是要在实验板上实现呢?还是只是画个仿真来实现呢? 那要仿真,首先你要画个仿真图,仿真图也不会画吗? 如果没有实验板,也没有仿真图,写了程序也没有用,那怎么执行程序呢?
你好!是滚动显示吗