51单片机数码管显示0到9一直闪怎么修改延时都没用

51单片机,数码管循环显示0-9,当每按一次中断,数码管显示0,延时一段时间后恢复之前中断时的显示_百度知道大神求助啊,程序烧进去,数码管一直在闪烁,_51单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:35,924贴子:
大神求助啊,程序烧进去,数码管一直在闪烁,收藏
#include &reg51.h&#include &intrins.h&#include &XPT2046.h&//--定义使用的IO--//#define GPIO_DIG P0//数码管IO口sbit LSA = P2^2;sbit LSB = P2^3;sbit LSC = P2^4;#define GPIO_KEY P1
//独立键盘用P1口#define KEYUP_VAL0xEF//P1.4
增加#defineKEYDOWN_VAL0xDF//P1.5
减小const unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};static uchar DisplayData[8];//用来存放要显示的8位数的值static unsigned int g_iPressV//压力数据static unsigned int g_iSpeedV//速度数据static unsigned int g_iPowerV//功率数据void Delay10ms(unsigned int c)
//误差 0us{
unsigned char a,
for (;c&0;c--){for (b=38;b&0;b--){for (a=130;a&0;a--);}
}//void disp_init(void){for(i = 0;i & 8;i++){DisplayData[i] = 0;}} //void disp_setVal(unsigned int Val){DisplayData[0]=DIG_CODE[0];DisplayData[1]=DIG_CODE[0];DisplayData[2]=DIG_CODE[0];DisplayData[3]=DIG_CODE[Val%00];DisplayData[4]=DIG_CODE[Val%];DisplayData[5]=DIG_CODE[Val%];DisplayData[6]=DIG_CODE[Val%100/10];DisplayData[7]=DIG_CODE[Val%10/1];//最低位}void DigDisplay(void){for(i=0;i&8;i++){switch(i) //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0;//显示第0位case(1):LSA=1;LSB=0;LSC=0;//显示第1位case(2):LSA=0;LSB=1;LSC=0;//显示第2位case(3):LSA=1;LSB=1;LSC=0;//显示第3位case(4):LSA=0;LSB=0;LSC=1;//显示第4位case(5):LSA=1;LSB=0;LSC=1;//显示第5位case(6):LSA=0;LSB=1;LSC=1;//显示第6位case(7):LSA=1;LSB=1;LSC=1;//显示第7位}GPIO_DIG=DisplayData[i];//发送段码j=5; //扫描间隔时间设定while(j--);GPIO_DIG=0x00;//消隐}}unsigned char Key_Scan(){unsigned char keyValue = 0 , //保存键值//--检测按键--//if (GPIO_KEY != 0xFF)//检测按键否按下{Delay10ms(1);//消除抖动if (GPIO_KEY != 0xFF)//再次检测按键是否按下{keyValue = GPIO_KEY;i = 0;while ((i&50) && (GPIO_KEY != 0xFF)) //检测按键是否松开{Delay10ms(1);i++;}}}return keyV
//将读取到键值的值返回}unsigned int sys_getTorque(void)//获得扭矩{unsigned int resVresVal = Read_AD_Data(0x94);//AIN0 电位器模拟压力/*原始的AD数据范围为0~4095,需要转换的在下面对resVal利用公式转换成压力*//*这里没有转换,相当于压力从0N~4095N*/return resV}void timer_init(void){TMOD=0X01;//设置定时器1为模式一,即16位计算模式TH0=()/256;//给计数寄存器赋值,50毫秒时间TL0=()%256;EA=1;//开启总中断ET0=1;//开启定时器0中断TR0=1;//启定定时器0}void main(void){unsigned char keyV
g_iSpeedVal = 4725;disp_init();timer_init();//定时中断初始化while(1){keyVal = Key_Scan();switch(keyVal)//根据按键调节速度{case KEYUP_VAL:g_iSpeedVal += 200;case KEYDOWN_VAL:if(g_iSpeedVal & 200){g_iSpeedVal -= 200;}else{g_iSpeedVal = 0;}default:}DigDisplay();//更新显示的数据}}void timer_task(void){static unsigned int _clock = 0;_clock += 1;
if(_clock == 50000){_clock = 0;}switch(_clock % 10)//分配500ms任务周期{case 0:g_iPressVal = sys_getTorque();//在这里获取扭矩的压力数据case 1://计算功率g_iPowerVal = ((unsigned long)g_iPressVal * (unsigned long)g_iSpeedVal) / 9545; case 2:
//更新显示数据
disp_setVal(g_iPowerVal);default:}}void timer() interrupt 1{TH0=()/256;//重新赋值TL0=()%256;timer_task();}
51单片机培训,尚观科技专业嵌入式培训——0基础0元入学,4个月从入门到精通,先就业后付款!7天免费试学,试学,让您更好的选择!
数据传输口对地接一个100uf的电解电容就不闪烁了
可以去21ic电子技术论坛上问问,那里面大神比较多,祝你成功!
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或查看: 1278|回复: 11
数码管三位数累加的,一直闪怎么回事?有程序
999.jpg (98.51 KB, 下载次数: 38)
18:04 上传
 真心看不懂,要让数码管显示数累加显示不用这么复杂吧!
temp[0]=j/100;
temp[1]=j%100/10;
temp[3]=j%10;
if(j==999)j=0;
for(i=0;i&3;i++)
P0=weima[temp[i]];
while(k--);
回帖助人的奖励!
 楼主你的电路图来,数码管和单片机是这么连线的,还有中间使用到了驱动芯片了吗,最好是弄一个电路图上来,这样才看得清楚一些
楼主你的电路图来,数码管和单片机是这么连线的,还有中间使用到了驱动芯片了吗,最好是弄一个电路图上来,这样才看得清楚一些
楼主的延时是多少时间,如果延时超过过长会有闪烁感
本帖最后由 liaolinhui 于
01:44 编辑
真心看不懂,要让数码管显示数累加显示不用这么复杂吧!
是你自己看不懂,你那程序简单是简单了,但是没有动态显示,你只用到P0
就数码管闪的原因,可能是刷新速度太低,一般用定时器做更好一些,延时程序会因程序原因本身变得不确定
回帖助人的奖励!
while()放后面吧
回帖助人的奖励!
显示完成后没有关断数码管而闪烁
回帖助人的奖励!
延时问题,把延时时间调一下,数码时钟的是0.6ms左右
回帖助人的奖励!
回帖助人的奖励!
Powered by查看: 4094|回复: 9
帮我看看数码管怎么闪烁
马上注册,结交更多好友,享用更多交流,硬件的世界向你敞开大门!
才可以下载或查看,没有帐号?
正在做数码管时钟,想按一下键分闪,在按一下,时闪,断码是573控制,位码是138控制,
& & #include&reg52.h&
#include&intrins.h&
#define uchar unsigned char
#define uint unsigned int
uchar shu,shu1,shu2,shu3,t0,bai,miao,miao1,LED,aa,fen,fen1,shi,shi1,i,biaozhi,
sbit key_1=P3^0;//调时
sbit key_2=P3^1;//
sbit key_3=P3^2;//调分
sbit key_4=P3^3;//
uchar code table[]={0,1,2,3,4,5,6,7,0xff,0x00};
uchar code table1[]={0x3f,0x06,0x5b,0x4f,
& &&&0x66,0x6d,0x7d,0x07,
& &&&0x7f,0x6f,0x77,0x7c,
& &&&0x39,0x5e,0x79,0x71,0x40,0x00};
uchar code table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//星期
void delay( int t)
uchar x,y;
for(x=t;x&0;x--)
for (y=110;y&0;y--);
void init()
TMOD=0x01;
TH0=()/256;
TL0=()%256;
void time0() interrupt 1
& &TH0=()/256;
TL0=()%256;
&&if(t0==20)
&&if(shu==60)
& &shu1++;
& &if(shu1==60)
& & shu1=0;
& & shu2++;
& & if(shu2==24)
& &&&shu2=0;
& && &&&i++;
& &&&if(i==7)
& && &i=0;
& &&&P1=table2[i];
miao=shu%100/10;
miao1=shu%10;
fen=shu1%100/10;
fen1=shu1%10;
shi=shu2%100/10;
shi1=shu2%10;
void display()
& & P2=table[6];
P0=table1[miao];
P2=table[7];
P0=table1[miao1];
P2=table[3];
P0=table1[fen];
P2=table[4];
P0=table1[fen1];
P2=table[0];
P0=table1[shi];
P2=table[1];
P0=table1[shi1];
P2=table[5];
P0=table1[16];
P2=table[2];
P0=table1[16];
void key_function()
& & if(key_4==0)//功能键
& &&&delay(5);
& &if(key_4==0)
& & num++;
& & TR0=0;
& &&&while(!key_4);
& &&&if(num==1)
& && & P2=table[6];
& & P0=table1[17];
& & delay(200);
& & P2=table[7];
& & P0=table1[17];
& & delay(200);
& &&&if(num==2)
& &&&if(num==3)
& && &num=0;
& & TR0=1;
& & if(key_3==0)//分加
& &&&delay(13);
& &if(key_3==0)
& & //TR0=0;
& & delay(13);
& &&&//TR0=0;
& & shu1++;
& & if(shu1==60)
& &&&shu1=0;
& & while(!key_3);
& & delay(10);
& && &//P2=
& && &&&//flag=1;
& & if(key_4==0)//分减
& &&&delay(13);
& &if(key_4==0)
& & delay(13);
& & shu1--;
& & if(shu1==-1)
& &&&shu1=59;
& & while(!key_4);
& & delay(10);
& && &//P2=da_
& &&&//flag=1;
& & if(key_1==0)//时加
& &&&delay(15);
& &if(key_1==0)
& & delay(15);
& & shu2++;
& & if(shu2==24)
& &&&shu2=0;
& & while(!key_1);
& & delay(10);
& & if(key_2==0)//时减
& &&&delay(13);
& &if(key_2==0)
& & delay(13);
& & shu2--;
& & if(shu2==-1)
& &&&shu2=23;
& & while(!key_2);
& & delay(10);
& && &//P2=da_
& &&&//flag=1;
void main()
& &key_function();
& &display();
用三个按键,一个模式按键(也就是选择调整时、分的),一个按键做加,一个按键做减。你做几个模式,你就可以设置相应的模式标志位,在显示子函数就可以选择你的相应位(时、分、秒)进行闪烁了。数码管无非就是亮和灭,通过定时一个时标,选择时标进行亮和灭。就这样,不会可以内线探讨!希望对你有所启发。
你好,我还在做万年历,按键数码管这还是没实现,现在有三个键,功能键,加减键,按功能键我想让数码管闪烁,现在按键都能用就是不知道怎么闪烁,要闪就一起闪,现在功能键按下标志位置1,还应该怎么做。&
加一个标志字节,记录分闪还是时闪还是都不闪,
加一个时间标志字节,在中断内计时,控制数码管闪烁速度
然后根据标志字节确定描数码管是闪还是不闪,若闪,根据时间标志字节控制数码管亮灭
另外,把display内的代码写在中断里比较合适,否则按住键不松的话,就不会再扫描数码管了
利用显示程序来进行延时,这应该可以解决按键不松开数码管不显示的问题,只是时间不好掌握!&
我是这样做的:
void fen_san() //分钟位闪烁
& & & &&&a=b;& &//b=6&&b里面放的是亮与熄灭的比例时间可调整
& &&&while(a--){display(sg,sl,fg,fl,);}&&//fg=分钟高位,fl=分钟低位于 亮(显示数字)
& && & & &&&a=b;
& &&&while(a--){display(sw,sq,0xff,0xff);}&&//0xff=分钟高位低位熄灭&&可以把0xff放在数组函数里如:tab[]={1,2,3.,,,,9.0xff}
其实可以看做是一个有限状态机
zhang_cl 发表于
加一个标志字节,记录分闪还是时闪还是都不闪,
加一个时间标志字节,在中断内计时,控制数码管闪烁速度
利用显示程序来进行延时,这应该可以解决按键不松开数码管不显示的问题,只是时间不好掌握!
按键程序里有个while(!key_4);如果不松开,程序就不跑了,只有中断运行了&
i明天 发表于
利用显示程序来进行延时,这应该可以解决按键不松开数码管不显示的问题,只是时间不好掌握! ...
按键程序里有个while(!key_4);如果不松开,程序就不跑了,只有中断运行了
可以在里面循环显示程序呀&
zhang_cl 发表于
按键程序里有个while(!key_4);如果不松开,程序就不跑了,只有中断运行了
可以在里面循环显示程序呀
i明天 发表于
用三个按键,一个模式按键(也就是选择调整时、分的),一个按键做加,一个按键做减。你做几个模式,你就可 ...
你好,我还在做万年历,按键数码管这还是没实现,现在有三个键,功能键,加减键,按功能键我想让数码管闪烁,现在按键都能用就是不知道怎么闪烁,要闪就一起闪,现在功能键按下标志位置1,还应该怎么做。
地址:辽宁省大连市高新园区火炬路7号17层 QQ:
Copyright (C)
All Rights Reserved.怎样用51单片机(限用C语言)控制数码管的闪烁,并且还要通过按键控制闪烁的位置,不用中断或者计时器_百度知道

我要回帖

更多关于 单片机驱动数码管 的文章

 

随机推荐