Ⅰ 求解 单片机如下程序num的意思 key 是外部按键 每当key按下数码管显示一个值
这是单片机程序与PC机程序的不同之处,sbit key=p3^4;定义表明key的值是与P3.4单片机引脚关联的,而引脚的状态是由外部按键是否按下决定的。当按下按键时,key为0,不按下时为1.
所以你说的:当按下键时KEY=0了,但抬起按键后,就不会像你想象的那样一直保持0不变了,除非你一直按着按键不放,
数码管会从0到10的变化。
Ⅱ 单片机电子钟电路解释原理
我是初中生,吓解释一下,
U1是处理器,U3是存储器,U1 32到39是8线地址,整个LCD工作显示取决于它。RV1是个可调电阻,它是调节液晶对比度的,RP1 为排阻另一端应该接高电位,8线地址工作只是把电位拉低,X1和X2是两个晶体振荡器,X1为U1提供工作频率,X2为U2提供,当然通过内部分频于倍频得到需要的工作频率。
你想知道工作流程,其实这些流程有些不是说一部分一部分工作的,(即使LCD没有显示,其实也工作了)几乎同时,不过还是有先后的,首先U1工作,调取U3里的数据,U3是个最简单的存储器。运算后由8线地址输出给LED。U1的9脚接了个复位开关,按下开关U1即从新启动。U1的10脚到14脚为调节开关,它会让U1的计算从某个点开始,于是时间调节才实现。还有就是定时功能,当设定的时间与时间符合,闹钟启动蜂鸣LS1
文化有限,只能说这些了,不全面的地方望指教,毕竟我初中毕业
Ⅲ C51单片机的数码管显示问题
#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
uchar shi,ge,t,num,xms;
sbit wela=P2^7;
sbit la=P2^6;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uchar xms)//这里最好把uchar改为uint,当然不改应该也没问题,你下面的i跟xms类型不一样,在这里应该是没问题,最好还是统一一下
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar shi,uchar ge)
{
shi=num/10;
ge=num%10;
la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
wela=1;
P0=0xfd;
wela=0;
//delay(5);
la=1;
P0=table[ge];
la=0;
delay(5);
}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(key1==0)
{
delay(10);//这里消抖也是,也就是说,用按键的话,数码管就是会闪
因为时间有点长对吧,数码管来不及立刻显示,此时用肉眼就能看到闪,所以应该避免不了吧,除非你消抖时间也改短一点,你试试看。看看效果
if(key1==0)
num++;
if(num==60)
num=0;
while(!key1);
delay(10); //按一下十位闪一下就是这里延时太长了,可以不用延时,
数码管动态显示要求扫描很快,你上面就是延时了5ms,如果时间再长一点,那你就能看到数码管不停的闪。所以这里10ms太长了,可以不用。
但为什么个位没闪,应该是在display时,先是现实十位,然后把十位灭掉,再显示个位,一直等到在显示十位时,个位才灭,就是说在这支前,个位是亮的,由于你这延时了10ms,导致此时十位没有很快的显示出来,所以等过了10ms之后,十位才由暗变亮,你就可以看到十位闪了一下。
当你按住key1时,key1一直是0,那么!key1=1;所以程序一直执行while(!key1);这句语句,那么结合上面所说十位就亮不了了,只有个位亮。
你可以试着改改delay函数中的值大小,自己观察一下,display中的delay值可以更小的,3ms,2ms,自己试试吧
}
if(key2==0)
{
delay(10);
if(key2==0)
num--;
if(num==-1)
num=59;
while(!key2);
delay(10);
}
if(key3==0)
{
delay(10);
if(key3==0)
num=0;
while(!key1);
delay(10);
}
if(key4==0)
{
if(key4==0)
{
TR0=~TR0;
}
while(!key4);
}
display(shi,ge);
}
}
void time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)
{
t=0;
num++;
if(num==60)
num=0;}}