Ⅰ 求解 單片機如下程序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;}}