单片机数码管0-99循环,利用定时器帮我看看有什么问题

作者&投稿:师郊 (若有异议请与网页底部的电邮联系)
单片机数码管0-99循环,帮我看看有什么问题怎么老是错误 。~

首先 wela=0;
wela1=0;
num=0;
必须放在while(1)外面
void main()
{
wela=0;
wela1=0;
num=0;
while(1)
{

num++;
if(num==99)
{num=0;}
shi=num/10;
ge=num%10;
display(shi,ge);
}
}

再者 你知道你while(1)里的这段程序平均1ms扫描多少次么,很多很多次,也就是说你显示一个数的时间差不多也就几十us吧,也就是说一眨眼的时间num都数到99了,又从头开始数了,你肉眼能看见就怪了 。应该每显示完一个数来一段时间间隔,过会儿再让num的值变化。。。
切勿直接来一个大延时,这样动态扫描不起来,最好利用定时器来让num的值变化。

不会再问


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

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

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

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

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

/***************************************************************************/
#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;}//如果达到一小时,小时加一
}
/***************************************************************************/

简单的看了下,觉得这个地方有点问题:
if(num1==20)
{
num1=0;
num1++;
num1++确定不是num++?

void main()
{
TMOD=0x05;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
wela=0;
while(1)
{
}
}

void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==2)
{
num1=0;
num++;
shi=num/10;
ge=num%10;
display(shi,ge);
}
if(num==99)
{
num=0;
}
}
试试好用不

你可以在proteus下仿真试一试啊

可以交流

display(shi,ge);
应该放在外循环,否则要100S才执行显示程序一次


数码管共阴和共阳的管码表分别是什么?
数码管共阴和共阳的管码表如下:共阴数码管管码表(0-9):0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F。共阳数码管管码表(0-9):0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90。现在让我们来详细了解一下这两个概念。首先,数码管是一...

两个数码管轮换显示故障代码(0到99之间数字显示),隔多久比较好?太短怕...
其实,说0.5秒的人,根本就没理解是什么意思,还乱回答。这个时间,选2~4秒比较好些。你说间隔太长,记录下来花费时间太长。那记录的时间就是写字的时间,写字快慢因人而宜,与数码管间隔时间无关。难道选0.5秒,写字就快了,笑话。再说了,0~99的代码会全部出现,那还记什么,0~99全有啊,...

数码管编码0到99有开始暂停清零
MOV P1,#0FDH MOV A,42H MOVC A,@A+DPTR ACALL LOOP RET LOOP: MOV R3,#100;1毫秒延时按12MHZ计算 D1: MOV R4,#10 D2: DJNZ R4,D2 DJNZ R3,D1 RET K1: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;实验板上的7段数码管0~9数字的共阴显示代码 END 注释比...

共阳极数码管显示0~9对应的段码
0xC0、0xF9、0xA4等。根据查询百度文库得知,0xC0、0xF9、0xA4、0xB0、0x99、0x92、0x82、0xF8、0x80、0x90是共阳极数码管中数字0~9的编码,这些编码是根据每个数字或符号对应的LED段的组合而得出的。例如,数字0由哪些LED段组成,数字1由哪些LED段组成,依此类推,直到数字9由哪些LED段组成。...

C51单片机:用数码管显示0到999的值。求c语言程序和原理图
include<reg51.h> define uchar unsigned char uchar temp;int key1,key,disbuf;\/\/ 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};...

单片机中二位数码管的显示,怎样用c语言写一段从0到99的程序啊?
公阳,P0.2,P0.3 分别通过PNP管接个位,十位数码管公共端,P1口输出数据,都是低电平有效 include <reg51.h> sbit shi=P0^3; \/\/十位公共极 sbit ge=P0^2; \/\/个位公共极 define Out P1 \/\/数据输出端 unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,...

51单片机数码管显示0-99的问题
那个lalala有什么用?看程序是在P0口接一个共阳数码管。那同样在P2口再接一个数码管。这样,P0口的数码管显示十位数,P2口的数码管显示个位数。或在P2,P3口各接一个数码管。见下图。这种接法属于静态显示电路。这个学会后,再练习动态显示电路。

七段数码管显示数字0到9
7. 单片机汇编语言编程可以使数码管显示0到9。建议使用STC的51系列单片机替代AT系列,并使用74HC595芯片替代74HC164。8. 编程时应创建项目并准备好数码管的段选表和延时函数。通过位选控制数码管显示,并在死循环中持续刷新显示。9. 晶振频率对于程序的显示效果至关重要。如果显示效果不佳,可以通过调整...

单片机求助,用汇编语言写一个双位数码管0到99循环显示的程序。仿真用...
这个是动态显示的…虽然段的端口都一样,但位不一样,经过软件控制就可以达到动态显示的效果了

单片机用汇编写两个数码管显示0到99循环的程序
从网上见过一个:ORG 0000H ;上电 与 复位 向量 LJMP MAIN ;转移指令 转至 MAIN 处 ORG 0040H ;定义 MAIN 程序 起始地址 MAIN:MOV SP,#5FH ;设置 堆栈 起始地址 MOV DPTR,#TABLE ;数据指针 = TABLE(为显示码 数据表地址)MOV R0,#0 ;R0 = 0 MOV R1,#0 ;R1 = 0 MOV R2,#200 ...

淄川区13934118223: 单片机控制一位数码管显示,数码管从0 - 9依次显示,时间间隔为100ms,循环下去,用定时器编写程序 -
江巧硫唑: 只控制一位数码管没啥意思,如果只是研究一下倒是可以的 给你一份我自己写的,利用四位数码管显示模拟时钟的程序吧,供你研究 另外,再给你一个一位数码管的,是你要求的那种 这两个都是利用单片机的定时器中断来产生秒信号的 下面这...

淄川区13934118223: AT98C51单片机数码管显示0.0秒到9.9秒循环计时C语言程序 -
江巧硫唑: #include<reg51.h>#define uchar unsigned char uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9 unsigned char times=0,sec=0,sec01,scanled; unsigned char disdat[2]; void dischg() { disdat[0]=sec01; disdat[1]=sec; } ...

淄川区13934118223: 实现0到99通过单片机内部的定时计数器完成计数功能的汇编程序 -
江巧硫唑: SECOND EQU 30H COUNT EQU 31H ORG 00H LJMP START ORG 0BH ;定时器0中断入口 LJMP INT_T0 START: MOV SECOND,#00H MOV COUNT,#00H MOV DPTR,#TABLE ;段码表首地址 MOV P0,#3FH ;数码管显示初始化 MOV P2,#...

淄川区13934118223: 设计十进制0 - 99的计数器,采用按键计数,数码管显示,采用单片机内部的定时计数器完成计数功能 -
江巧硫唑: 看这个,跟你要求的差不多 ,你自己稍稍改下就OK啦~\(≧▽≦)/~ #include#define uchar unsigned char #define uint unsigned int uchar DSY_CODE[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F}; uchar count=0; void main() ...

淄川区13934118223: 单片机中,用定时器0实现数码管显示00~99的C程序是应该怎样才编译成功呢,我是初学者 -
江巧硫唑: 用一个单元,存放计数值,每隔1秒加一,然后进行十进制调整,之后向P2输出即可.

淄川区13934118223: 15单片机的定时器编写一秒一加的程序,从0到99一循环 -
江巧硫唑: #include#define uchar unsigned char#define uint unsigned int uchar num=0,a=0;//共阴数码管七段码 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77}; void Delay1ms(uint i) //1ms延时程序 { uint j; for(;i>0;i--) { for(j=0;...

淄川区13934118223: 利用延时功能,实现数码管的计数功能;计数范围从0开始,一直数到99 朋友 这个程序你求到了吗?
江巧硫唑: 很简单的一个程序,我写个你吧,是要按键0-99计数还是就普通空循环延迟让他自动0-99计数?下面这个程序是按键计数,没通过译码器P0口和P2口分别接一个共阴数码管,P3^7口接一个按键. #include <reg51.h> #define uint unsigned int #...

淄川区13934118223: 51单片机数码管倒计时程序,从999999开始倒计时,用定时器T1的中断完成 -
江巧硫唑: 这个和代码顺序有关系: while (1) { if (flag1s == 1) //判断1秒定时标志 { flag1s = 0; //1秒定时标志清零 sec--; //秒计数自减1【这里是先减一,后面再送显示】 //将sec按十进制位从低到高依次提取到buf数组中 buf[0] = sec%10; buf[1] = sec/10%10; ...

淄川区13934118223: 单片机简单实验,中断定时一秒让7段数码管加一,即从零到九变化,用汇编语言哦! -
江巧硫唑: //开始 P2^0//暂停 P2^1//清零 P2^2 #include unsigned char Lcd_code[8];unsigned char code disp_code[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90};unsigned char c_flag;void scanf(void); void InitTimer0(void){ TMOD = 0x01; TH0 = 0xf...

淄川区13934118223: 汇编利用定时中断使静态数码管显示0 - 9数字 -
江巧硫唑: ; ORG 0000H LJMP MAIN;上电,转向主程序 ORG 000BH LJMP CTC0;转向定时器中断程序 MAIN: MOV TMOD, #01H MOV TL0, #0E0H MOV TH0,...

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