现在在学单片机 想实现 8个数码管以间隔1秒的时间依次显示0到7 这个程序不能实现功能 求大神帮我看看

作者&投稿:移翟 (若有异议请与网页底部的电邮联系)
用单片机控制一个8段数码管,其循环显示数字0到9,每位数字显示时间为一秒,定时功能用单片机中断显示~


有一个一模一样的提问,好吧,俺再发布一次

给你一份我自己写的,利用四位数码管显示模拟时钟的程序吧,供你研究

另外,再给你一个一位数码管的,是你要求的那种

这两个都是利用单片机的定时器中断来产生秒信号的

下面这个是 四位数码管的,最下边的是一位数码管的,端口不一样的话,自己改下

/***************************************************************************/
#include
sbit p20=P3^7; sbit p21=P3^6; sbit led=P2^7;//按键及LED端口定义
sbit Axs=P1^3; sbit Bxs=P1^2; sbit Cxs=P1^1; sbit Dxs=P1^0;//数码管位选端口
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
unsigned int h,m,s,t,n;
/***************************************************************************/
void YS(char hs)//延时函数
{char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}
/***************************************************************************/
void XS(int xh,int xm) //显示子函数
{
char d1,d2,d3,d4;
d1=(xh/1)%10; d2=(xh/10)%10;//分离小时
d3=(xm/1)%10; d4=(xm/10)%10;//分离分钟

P0=table[d1];Cxs=0;YS(10);Cxs=1;//小时个位
P0=table[d2];Dxs=0;YS(10);Dxs=1;//小时十位
P0=table[d3];Axs=0;YS(10);Axs=1;//分钟个位
P0=table[d4];Bxs=0;YS(10);Bxs=1;//分钟十位
P0=0x7f; P1=0xfd; YS(10); P1=0xff;//小数点
}
/***************************************************************************/
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定时器初始化
while(1)//主循环
{
if(p20==0){YS(10);if(p20==0){h++;if(h>23){h=0;}}while(!p20){XS(h,m);}}
if(p21==0){YS(10);if(p21==0){m++;if(m>59){m=0;}}while(!p21){XS(h,m);}}
XS(h,m);//调用数码管显示函数
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;t++;
if(t>500){t=0;led=~led;}//LED闪烁
if(n>1000){n=0;s++;}//如果达到一秒,秒加一
if(s>59){s=0;m++;}//如果达到一分,分加一
if(m>59){m=0;h++;}//如果达到一小时,小时加一
if(h>23){h=0;}//如果达到24小时,小时清零
}
/***************************************************************************/


/***************************************************************************/
#include
sbit Axs=P1^3;//数码管位选端口
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
unsigned int h,m,s,t,n;
/***************************************************************************/
void YS(char hs)//延时函数
{char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}
/***************************************************************************/
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定时器初始化
while(1)//主循环
{
P0=table[m];Axs=0;YS(10);Axs=1;//小时个位
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;
if(n>1000){n=0;m++;}//如果达到一秒,秒加一
if(m>9){m=0;}//如果达到一小时,小时加一
}
/***************************************************************************/

时间太长大哥 估计要好几秒 根据你的程序 没必要加延时 还有 如果用不到int这么大的类型 就改为unsigned char 可以节约单片机空间

程序没有错误 2个警告 应该可以用 检查一下硬件电路 可以先做仿真


武乡县13249287560: 51单片机控制8个数码管并显示1 - 8 -
资玉东方: 数码管段选连接到单片机P0口,位选连接到P2口 ORG 0000h MAIN:CALL DISPLAYAJMP MAIN DISPLAY:MOV R0,#0MOV R1,#0x01MOV DPTR,#TABLOOP:INC R0MOV A,R0MOVC A,@A+DPTRMOV P0,#0 ;消隐MOV P0,A ;...

武乡县13249287560: 单片机是怎么控制8个数字的数码管?8个数字要64个引脚,单片机总共才40个引脚? -
资玉东方: 驱动的方法有很多,你说的这是单片机直接静态驱动,这种驱动方式编程上最简单,但是消耗IO口太多,一般2位以上的数码管都不用它. 使用单片机直接动态驱动,8位数码管只需要占用16个IO口,其中8个输出段选信号,8个输出片选信号,这种方式比较常用,编程上也不是特别麻烦. 使用锁存器(比如74HC573)通过IO口分时复用来实现,8位数码管只需要8个IO口,段选和片选共用这8个IO口. 最终极的办法:通过串入并出移位寄存器级联驱动,这种方法是静态驱动,无论多少位数码管,只需占用2个IO口,单片机将段选信号串行发出,静态驱动没有片选信号.

武乡县13249287560: 用51单片机编程实现集成4位8段数码管显示不同的数字 -
资玉东方: 刷新时间过短可能造成cpu的不响应. char js(char k) {if(k==4) k=0; return k;} void delayy(int k) {int i,j;for (i=0;i<k;i++){for (j=0;j<60;j++){;}} } void main() { for (;;){z=js(z);i=js(i);P0=0; P1=0xff-(0x01<<z);j=time[i];P0=table[j]; delayy(1);z+...

武乡县13249287560: 51单片机加八个数码管设计一个单片机显示系统,要求八只管分别显示1~8.求这个程序的流程图,没有图 -
资玉东方: 8个数码管的话一般都是由一个三八译码器控制,而且有三个i/o口作为选择数码管的钥匙,三个i/o口按一定顺序组合成的二进制000~111即是数字为0~7的8个数码管分别对应的三极管(开关),三个i/o口对应哪个数字就打开哪个数字的开关从而对应的数码管就会亮,其他一定会灭,所以为i/o口的一次赋值,就只开一个数码管.所以要求8个数码管分别显示1~8其实就是很快地轮次开闭8个数码管的开关,不断循环往复,切换开关的速度让肉眼无法识别有闪动感,而且每切换一次开关之前记得先消除鬼影 如何快速切换开关? 1.定时器中断或定时器中断函数 2.普通的延时函数(延时要自己测试) 3.不延时(开关切换之前要消除鬼影)

武乡县13249287560: 单片机驱动8位数码管 -
资玉东方: 设位码接P1; uchar buf[8] = {0}; void display( ){ //1ms运行一次 static uchar w = 0; P1 = 0; P0 = duan[buf[w]]; P1 = (1 << w); w = (w + 1) % 8; //循环+1 }

武乡县13249287560: 51单片机驱动八位数码管电子钟 -
资玉东方: #include<reg52.h>#include<intrins.h>#define uchar unsigned char #define uint unsigned int#define DP 0x80 uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//八位位选码表 //0 1 2 3 4 5 6 7 uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0...

武乡县13249287560: 单片机开发板数码管编程 8个数码管依次显示5,每个显示1S,循环 -
资玉东方: 看你的数码管怎么接,比如段接P1口,位接P2口 #include<reg52.h> #include <intrins.h>unsigned char a;void main(void) {P1=0x6d;//5的段码P2=0;a=0x80; TMOD=0x01;TH0=0xd8;TL0=0xf0; EA=1;ET0=1;TR0=1;while(1){P2=a;} } ...

武乡县13249287560: 请问如何用单片机实现同时驱动5个4位的8段数码管.目前单片机就15个口可用 -
资玉东方: 使用译码器74HC154,4线-16线,这样一组IO就可以驱动1个4位8段了,然后再使用5个IO口来控制相应的5个.不过,这样你的亮度不会太好,单片机需要扫描160回.

武乡县13249287560: 如何用单片机,电阻,或三级管驱动共阴数码管(8个)或共阳数码管,只用电阻和三极管,不用其他的,求高手 -
资玉东方: 你这个真是自找麻烦,简单说,1)数据总线驱动你要不要(因为并联有8个数码管)?是用集成电路,或是用三极管构成?2)数码管片选信号的产生,如果用3-8译码电路,就仅仅占用3个I/O口,如果用三极管构成就需要占用8个I/O口(不可能用三极管构成3-8译码电路吧?)3)至于共阴数码管要如何驱动,此类资料电路图例网上大把,自己去完成吧.4)其实,能够用到三极管、电阻的,就仅有数码管电流驱动部分.

武乡县13249287560: 求大神做一个C51单片机的程序.问题如下:实现8位共阴数码管循环显示数字20121111,顺便求图.不胜感激!
资玉东方:;项目五 ;任务2 ;点亮8位8段LED数码管 ;CA 共阳 - Common Anode 共同正极 ;CC 共阴 - Common Cathode 共同负极 PORT_O0 EQU P0;DIGITRON字符输出 PORT_O1 EQU P2;DIGITRON字位输出 ORG 0000H LJMP MAIN ORG 0030H ...

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