Ⅰ 51单片机流水灯执行10次 全部闪烁一次 一直循环十次闪烁一次 c语言怎么写
#include<reg51.h>
#include<intrins.h>
#defineucharunsignedchar
voiddelay(uchara)
{
uchari;
while(a--)for(i=0;i<120;i++);
}
main()
{
uchari,led;
while(1)
{
led=0xfe;
for(i=0;i<80;i++)
{
P0=led;
led=_crol_(led,1);
delay(200);
}
P0=0x00;
delay(200);
P0=0xff;
delay(200);
}
}
Ⅱ 51单片机做计数显示时,数字不连续,一闪一闪的。
当然会闪啦,你在每次中断时扫描LED,间隔太长啦!请用以下改过的程序:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,shi,ge;
uchar code table[]={ 0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};
void delay(uint z);
sbit com0=P2^7;
sbit com1=P2^6;
bit flag;
void main()
{
aa=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1){
if(aa==20)
{
aa=0;
temp++;
if(temp==60)temp=0;
shi=temp/10;
ge=temp%10;
}
P1=table[ge] ;
com1=0;
delay(10);
com1=1 ;
P1=table[shi];
com0=0;
delay(10) ;
com0=1;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
Ⅲ 51单片机上电时闪一下怎么解决
这是8051单片机的一个弱点。因为8051单片机不像AVR,PIC等单片机上电时I/O全部设为浮空的高阻态。然后由软件定义它是输入态还是输出态。8051上电复位时定义成“1”。即8051上电时,所有的I/O口输出高电平。这种解决方法只有:
一. 你想办法把你的负载,(比如说LED)用灌电流驱动(即输出为0来驱动它)
二. 如果非要用高电平驱动,你先接一个反相器。(比如74HC04)把上电时的1变成0.然后程序里输出0的话,反相器输出1。这样变相的达到高电平控制
三. 根本方法是你不用51单片机,改用其他单片机。比如PIC,AVR等单片机。
注: 8051它的I/O口是准双向口。不能用软件定义它是输入还是输出口。如果要输出某个值。直接写“1”或者“0”就行了。如果是输入先写“1”,然后再读I/O口的状态。
Ⅳ 51单片机按键时,数码管会闪烁一下.原因是什么
原因很简单,这是代码和数码管驱动的问题
按键会影响数码管显示,这是单片机直接驱动数码管会出现的问题,而数码管则是工作在动态扫描方式的,若是采用带有锁存器件的数码管驱动,则不会出现此类现象,因为单片机是周期性的扫描工作方式,单片机直接驱动数码管的电路,当单片机扫描到按键的时候,数码管部分就停止了(一般的代码都这样,除非数码管是工作在静态扫描方式)
直接驱动数码管,按键的代码一般都会写一些延时,用来软件消除按键的抖动,若延时的时间太长,就会影响数码管的显示效果,另外有些还会增加等待按键松开的语句,这种语句一般都是一个死循环,除非按键被松开
解决办法是,减少按键消抖动延时的时间,在等待按键松开的死循环语句中调用数码管显示函数,这样基本上就可以解决此类问题
Ⅳ 对于下面的51单片机LED闪烁实验C程序,为什么LED会一直不停地闪烁,而不是闪烁一次呢
因为你的代码后面的“空白”处都是复位命令,所以你的代码执行完了就复位了,就闪啦。。
Ⅵ 51单片机数码管显示不停闪烁
动态显示,显示程序的调用,不能有条件。
必须不停的调用。
你的显示程序,是满足了什么什么条件,才调用一次?
这就耽误事了。
你显示的时候,先显示分,仅仅显示几个毫秒,之后,就显示秒。
秒,显示几个毫秒,之后,没有消隐,一直显示到下次调用显示程序。
所以,秒,显示稳定,分,一闪就没了。
Ⅶ 51单片机按键按下的瞬间,数码管会闪一下
标志位都是单片机系统自动置位或复位,如标志位溢出,需要在写程序时清0或者置位。用的时候检测标志位,如中断while(!TI)TI=0;,一旦TI置1,说明数据发送完毕。
Ⅷ 51单片机使灯闪烁,我写的程序按一下开始闪烁,在按一下为什么不能熄灭呢
void main()
{
L1=0;
if(K1==0) //1 按键按下后
{
Delay10ms(); //2 延时去抖动
if(K1==0) //3 确认按下
{
L1=0; //4 以下4句闪烁一次
Delay(1000);
L1=1;
Delay(1000);
}
while(1) //5 这里死循环,不能再执行上面的语句了。
{
while(!K1) //6 判断按键是否按下,如果按下,则延时10ms,再判断是否按下,一致循环,知道你松开手。
{
Delay10ms();
}
while(!K1); //7 按键按下话,一致死等,直到你松开手
{ //8 下面闪烁一次。
L1=0;
Delay(1000);
L1=1; // 9
Delay(1000);
}
}
}
}
你的程序来看,工作流程是这样的,开机后,按下按键不放,只闪烁一次。如果你放开你的手,释放按键,则LED一致闪烁。
你说再按一下为什么不熄灭,因为 标示9句那里置1了,你的硬件应该是L1置1亮吧?
因为L1=1,是你灯闪烁的最后一个状态,而后又会从5再次执行,如果你按下了按键,程序停在了6那里死循环,
则后面7,8都不会执行了。灯则保留了上一个循环最后的状态,也就是9的状态,所以就一致亮了。
你如果又松开按键,灯又会闪烁,你再按下按键,灯又一直亮了。如此循环。
你的程序的就是一个字概括,乱,你的思路很混乱,条理不清晰,建议先在纸上写下流程,再来写代码。想清楚了再下手。
你会学的很快的。
你的main函数有个性,呵呵,没有人会这么写main函数的,去看看单片机C语言的书吧!
Ⅸ 51单片机按键时,数码管会闪烁一下.原因是什么
原因很简单,这是代码和数码管驱动的问题
按键会影响数码管显示,这是单片机直接驱动数码管会出现的问题,而数码管则是工作在动态扫描方式的,若是采用带有锁存器件的数码管驱动,则不会出现此类现象,因为单片机是周期性的扫描工作方式,单片机直接驱动数码管的电路,当单片机扫描到按键的时候,数码管部分就停止了(一般的代码都这样,除非数码管是工作在静态扫描方式)
直接驱动数码管,按键的代码一般都会写一些延时,用来软件消除按键的抖动,若延时的时间太长,就会影响数码管的显示效果,另外有些还会增加等待按键松开的语句,这种语句一般都是一个死循环,除非按键被松开
解决办法是,减少按键消抖动延时的时间,在等待按键松开的死循环语句中调用数码管显示函数,这样基本上就可以解决此类问题
Ⅹ 51单片机流水灯执行10次 全部闪烁一次 一直循环十次闪烁一次 c语言怎么写
#include<reg51.h>
#defineucharunsignedchar
voiddelay(uchara)
{
uchari;
whilie(a--)for(i=0;i<110;i++);
}
main()
{
uchari,j;
for(i=0;i<10;i++)
P0=0xfe;
for(j=0;j<8;j++)
{
P0=_crol_(P0,1);
delay(200);
}
}
P0=0x00;
delay(200);
P0=0xff;
delay(200);
while(1);
}