用51单片机在六位共阴极数码管显示41407,用c语言,谢谢!

作者&投稿:淡俩 (若有异议请与网页底部的电邮联系)
51单片机C语言写的数码管显示哪里出问题了?~

f(P3_6==0) //按下后,数码管闪烁
{
delay(10);
while(!P3_7);
flag=0;
}

这个地方你是不是写错了?应该是查询while(!P3_6);吧?
另外,你在中断里面等待flag==1是不行的,因为你采用查询方式,而且是在主程序里面查询,因此,在中断里面等待是不行的,程序可能会在这个地方进入死循环

#includeunsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void led_display(unsigned char num);unsigned char key_scan();sbit led1=P2^0;sbit led2=P2^1;void main(){unsigned char led_key;P1=0;while(1) {led_key=key_scan();led_display(led_key); }}void led_display(unsigned char num){unsigned char ten,single;int delay;ten=num/10;single=num%10;delay=100;for(delay=200;delay>0;delay--){P0=led[ten];led1=0; led1=1;P0=led[single];led2=0;led2=1;}} /////////////////////////////////////////unsigned char key_scan(void){unsigned char temp,key;P1=0xfe;temp=P1&0xf0;if(temp!=0xf0) {switch(temp) { case 0xe0: key=1; break; case 0xd0: key=2; break; case 0xb0: key=3; break; case 0x70: key=4; }return key; }P1=0xfd;temp=P1&0xf0;if(temp!=0xf0) {switch(temp) { case 0xe0: key=5; break; case 0xd0: key=6; break; case 0xb0: key=7; break; case 0x70: key=8; }return key; }P1=0xfb;temp=P1&0xf0;if(temp!=0xf0) {switch(temp) { case 0xe0: key=9; break; case 0xd0: key=10; break; case 0xb0: key=11; break; case 0x70: key=12; }return key; }P1=0xf7;temp=P1&0xf0;if(temp!=0xf0) {switch(temp) { case 0xe0: key=13; break; case 0xd0: key=14; break; case 0xb0: key=15; break; case 0x70: key=16; }return key; }}你好!很高兴为您解答!我有欢迎采纳!!以上传附件!!

哥们儿,要编写程序的话很简单的,因为这是个数字静态的显示,但编程必须得有该单片机的外围电路图才行的,例如外围中至少有两个锁存器,用于所存片选信号和段码信号。六个数码管的共阴极分别接在一个八位的P口上,按对应的顺序给该P口一个8位的十六进制代码,使得相应的数码管为低电平,其余的为高电平。记住只能使一个数码管有效,单片机一次只能点亮一个数码管。我给你提供个思路吧,由于没有电路图我无法编程。首先点亮显示4的那个数码管,思路:首先写出数字4对应的十六进制数,把该数送入段码锁存器,此时还没有进行位选,故该值被送入了6个数码管。但我们只点亮4对应的那个数码管,所以需要进行片选,通过P口输出地十六进制代码到片选锁存器,使得4所对应的数码管被选中。这样4就被点亮了。然后延迟一段时间。再重复上述的操作,把相应的数字对应的数码管点亮。由于是循环点亮的,利用数码管的余晖我们可以看到该六位数码管均被点亮。但实际在同一时刻只有一个是点亮的。
学习单片机一定会要勤于思考,程序可以很灵活。有不懂得地方欢迎咨询,我还有类似这道题的视频教程,不过文件比较大,你需要的话可以私下联系。如果你看了这些视频相信这个编程你一定没问题了。
算了还是我亲自给你写吧!说实话我真的很忙。那个视频好几百兆不太方便传给你。
我写的这段程序我在单片机实验板上运行过了,完全没问题。我用的是C52的单片机,C52跟C51差别不大,只是ROM的大小不同,定时器计数器的数目不同等等,跟这段程序没关系,也就是说这段程序在C51的板子上完全可以运行。需要说明的是我说过,编程需要单片机的外围结构,我的板子片选端(wela)接的是P2.7,段选端(dula)接的是P2.6,你的板子要是不同的话把程序上相应的部分改一下。还有我的数码管共有8个,从左到右,最右边的为最高位,我是从最左边开始点亮的,跟你的板子不同的你可以相应的改一下。

#include<reg52.h>
#define uchar unsigned char;
sbit dula=P2^6;
sbit wela=P2^7;
void delay();
void main()
{
while(1)
{
dula=1;
P0=0x66;
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
delay();
dula=1;
P0=0x06;
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
delay();
dula=1;
P0=0x66;
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
delay();
dula=1;
P0=0x3f;
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
delay();
dula=1;
P0=0x07;
dula=0;
P0=0xff;
wela=1;
P0=0xef;
delay();
}
}
void delay()
{
unsigned int i;
for(i=500;i>0;i--);
}

有不明白的地方欢迎再咨询。

哈哈。其实很简单的,
这个可以联系我,
我给你写一下。


如何用单片机AT89C51控制六位数码管,可以显示出不同的六个数字(123456...
include<reg51.h> define uchar unsigned char uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};uchar number=0;void t0isr() interrupt 1 { TH0=0xf4;TL0=0x48;switch(number){ case 0:P2=0x01;P0=distab[1];...

利用51单片机画时钟电路图。要求6位数码管,两位秒闪信号,必须能够进行...
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};\/\/P0口共阳数码管0-9显示编码 uchar code port[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};uchar count;uchar sec;uchar min;uchar hou;sbit k5=P1^4;sbit k6=P1^5;sbit k7=P1^6;void...

mcs51单片机最大的位地址是多少?
另外特殊功能寄存器中,有16个可以位寻址,查一下表格就行了88H对应的字节地址也为88H。同理2AH-20H=0AH,0AH*8=50H。单片机片内RAM的20H~2FH,这十六字节,可以按照“位”来寻址。这里面共有128个“位地址”,分别为00H~7FH。例如位地址4EH,是在“字节地址为29H的字节单元”中的第6位。

51单片机 c语言六位数码管小数点
如果电路是普通电路的,一般是最高位驱动小数点的,你只要把最高位置为1就点亮小数点了。例如:x|=0x80;LEDPORT=x;

用51单片机设计数字钟,六位数码管显示时分秒,四个发光二极管做为秒点...
那几个发光二极管自己加就行了 s_set bit p1.0 m_set bit p1.1 h_set bit p1.2 second equ 30h minute equ 31h hour equ 32h tcnt equ 34h org 0000h sjmp start org 000bh ljmp int_t0 start:mov dptr,#table mov hour,#0 mov minute,#0 mov second,#0 mov tcnt,#0 mov...

单片机51芯片能不能直接驱动LED数码管?如果不能应加个什么,,是六位的...
驱动数码管不就是给数码管的位选和段选引脚给高低电平吗,51单片机当然可以的,但是那样的话会占用很多io口的,本来51的io口就那么几个,你要都占用了,别的东西就没法做了。所以,数码管驱动你需要加驱动芯片,比如74hc595等,也可以是译码器,反正最后是需要点亮数码管就行,上网查查驱动数码管的芯片...

天祥51单片机TX-1C六位数码管段选,位选的引角怎么连线?关键是数码管...
我不知道连线是怎么样的,不过最基本的思想就是把那个数码管的片选端选上,在送数据就亮了。如果是用一组端口P1来控制的话,应该会有一个7段数码管的译码器,然后再来个138译码器做为片选。不过要注意是共阳极还是共阴极的。自己看看它的电路图,然后在写程序 ...

请问51单片机的8位CPU中的8位是指什么?是工作寄存器的8位吗?请大家一...
就是该型号或系列的CPU(电脑和单片机都适用)所处理的标准(超出要舍弃、忽略某些位,不足要扩展处理)字长(字节长度)是8位(二进制的位)可以这么等效,但最好不要这么理解

51单片机的地址问题(位地址和字节地址)
1. 8051的内部RAM能作为用户RAM区的只有00~7FH,可以用直接寻址或寄存器间接寻址;80H~FFH是SFR,放了些特殊功能寄存器,只能用直接寻址;2. 位地址00~7FH和片内RAM字节地址00~7FH只是地址的称呼一样,代表的含义不同,位地址只能用位寻址;3. 具体的地址是只能通过指令来区分。其实楼主的理解还是...

pic单片机与51的区别在哪
数据总线都是8位的,但指令总线位数分别位12、14、16位。2、寄存器组区别PIC单片机的所有寄存器,包括I\/O口,定时器和程序计数器等都采用RAM结构形式,而且都只需要一个指令周期就可以完成访问和操作;而51单片机需要两个或两个以上的周期才能改变寄存器的内容。3、流水线结构区别51单片机的取指和执行...

雨湖区15173353161: 求基于51单片机 DS1302 ,用六位共阴极数码管显示的万年历源代码. -
逮琰利君: 你好: 四个按键可调节温度报警上下线和时间的时分秒. 如果是要这个的话,回复我,我给你仿真文件盒程序. 希望我的回答能帮助到你.

雨湖区15173353161: 电子钟的设计(带按键调整) 任务要求:利用AT89C51单片机设计简易电子钟(六位),通过6位共阴 -
逮琰利君: #include#define uchar unsigned char...要是PROTEUS的话差不多是这样,要是不想麻烦搞个74595的话P1就直接连(有没有都一样有的话比较整洁,没有的话程序上省点脑筋)主按键就用INT0,我没用P0口是因为懒得加上拉电阻,高低电平暂时先设成低的,思路就是P2口片选,当INT0触发时,你可以用while循环兜住不让出去,第一次是片选前两位“时”,第二次分第三次秒,如果第四次按下P32,也就是进入中断后第三次按下按键,结束中断,调到main.思路应该是这样当然肯定漏洞很多,先吃个饭再看看.

雨湖区15173353161: 怎样点亮数码管怎样用51单片机点亮数码管 -
逮琰利君: 数码管分共阴极和共阳极 如果是常用的共阴极,把com端接地 然后数码管的abcdefg接到单片机P1口,a对P1.0, g对P1.6 然后P1口输出3F,看到就是0,输出06,看到就是1

雨湖区15173353161: 图中的6位数码管是如何连接到51单片机I/O口上啊
逮琰利君: 每个数码管的对应段都并联在一起,这样一共就有 8根线,这8根线就是段信号,每个数码管的公共端分别引出来,这个都叫位信号,数码管分共阳和共阴的,这个不 一样的话启动方式是不一样的,如果公共端是正的话那就是共阳的,否则就是...

雨湖区15173353161: 我把51单片机的I/O口直接接到了共阴数码管的管脚上,数码管也正常显示,并不像网上说的得加8050 -
逮琰利君: 51单片机是低电平有效的,常规使用的是共阳极数码管 用共阴极数码管,没谁说过不行的,只是单片机提供不了较大的高电平电流 你数码管的亮度不会很高

雨湖区15173353161: 51单片机 c语言 、或、在数码管上的用法 -
逮琰利君: int flag=1; P0 = 0xf9; //假设数码管为共阳极 while(1) { P0 &= 0x7f; //数码管其它位不变 flag=~flag; //“一点”取反“ P0 = (flagdelay() //延迟 }

雨湖区15173353161: 利用AT89c51单片机数码管显示“HELLO”静态的编程 -
逮琰利君: 数码管是共阴极的,HELLO[]={0x6e,0x9e,0x1c,0x1c,0xfc} P0是段选;P2是位选 char i;void delay() { for(i=10000;i>0;i--); } void main() {for(i=0;i<8;i++) { P2=~(0x01<<i); P0=HELLO[i]; delay(); } while(1); }差不多就是这样啦

雨湖区15173353161: 用51单片机,怎么让数码管显示一串矩阵键盘按下的键代表的数(0~f)? -
逮琰利君: 这种显示方式就和手机拨号时,按下号码的显示是一样,第一个数码先在右边显示,再按键,依此向左移动显示.要是6位数码管,就保留6位显示了,按键超过6位时,先按的自然丢掉了.

雨湖区15173353161: 如何同时点亮6个共阴极数码管并显示不同数字,比如52.945 -
逮琰利君: 这个有两种方法了:其一就是用单片机的I/O口分别控制每个数码管,但是这样的话资源浪费就太严重了...其二就是用单片机的两个I/O口对六个数码管进行段选和位选操作,选中其中一个数码管时,其他的均未被选中,也就不会显示数字,被选中的显示对应值,然后选中下一个数码管时,其他的都是不亮的,这样依次显示每个数码管,当人眼看到时,由于人眼睛的视觉暂留效应,就会看到6个管同时显示了

雨湖区15173353161: 求51单片机实现六位led数码管只显示其中两位(1和6) -
逮琰利君: 你可以把电路贴出来,之前我遇到过,类似的问题,把位码和段码送出的先后顺序改变就好了,具体和你的硬件连接有关系.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网