① 51單片機的按鍵控制小燈亮滅的問題(程序類型:c語言)怎麼解決
#include
#define uint unsigned int
sbit LED = P1^0;
sbit KEY1 = P1^2;
void delay(uint);
void main(void)
{
LED = 1; //初始化LED熄滅
KEY1 = 1; //賦值KEY1高電平
while(1)
{
if(!KEY1) //檢測到按鍵按下
{
LED = ~LED; /*LED取反,此時LED = 0,燈亮。當鬆手時,KEY1 = 1,不滿足if語句不
進入循環,LED繼續保持當前狀態即LED = 0,如果再次按下按鍵,此時檢測到KEY1 = 0,進入循
環,LED取反得到LED = 0,燈亮。*/
delay(500); /*此處延遲,保證連續兩次按鍵動作處在程序的延時過程中,不進行其他程序從而不會影響小燈。*/
}
}
}
void delay(uint z) //延時函數
{
uint x, y;
for(x=85; x>0; x--)
for(y=z; y>0; y--);
}
可下載到單片機驗證。
② 單片機控制數碼管顯示電路圖的運行原理是什麼
原理:
數碼管其實是由發光二極體組成,有共陰極和共陽極之分,對於共陽極來說,一位數碼管由8個二極體組成,他們的陽極接在一起接+5v電源,而各個陰極與某個埠,如p1的8個引腳相連,當某個引腳輸出低電平的時候數碼管對應的二極體亮。
③ 關於用51單片機做一個電子時鍾的問題
程序中好像還沒有自動加時的部分,並且按鍵處理還沒有消抖措施
不多說了,上程序,俺剛剛為你編寫的,測試的時候使用的埠和你的不一樣
在我的開發板上測試成功後,按照你的板子埠做了修改
如果你直接復制到你的程序中不能使用,檢查及更改一下埠即可
如果滿意記得採納哦,若有疑問可以隨時向我提問
/***************************************************************************/
//#include<stdio.h>
#include<reg51.h>
sbit p20=P2^0; sbit p21=P2^1; sbit led=P2^7;
char dis_2[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管顯示編碼
unsigned int h,m,s,t,n;
/***************************************************************************/
void delay(char hs)//延時函數
{char hk;for(;hs>0;hs--){for(hk=100;hk>0;hk--);}}
/***************************************************************************/
void XS(unsigned int xh,unsigned int xs) //顯示子函數
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10;
d3=(xh/1)%10; d4=(xh/10)%10;
P0=dis_2[d1]; P1=0x08; delay(10); P1=0x00;//秒個位
P0=dis_2[d2]; P1=0x04; delay(10); P1=0x00;//秒十位
P0=0x7f; P1=0x04; delay(10); P1=0x00;//小數點
P0=dis_2[d3]; P1=0x02; delay(10); P1=0x00;//時個位
P0=dis_2[d4]; P1=0x01; delay(10); P1=0x00;//時十位
}
/***************************************************************************/
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定時器初始化
while(1)//主循環
{
if(p20==0){delay(10);if(p20==0){h++;if(h>23){h=0;}}while(!p20){XS(h,m);}}
if(p21==0){delay(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小時,小時清零
}
/***************************************************************************/
④ 單片機中|0x80為什麼能點亮小數點
這取決於你的電路。
0x80即最高位為1,即最高位置1亮,由此可以判斷出,你的電路是共陰接法,數碼管為高電平驅動,且小數點的段接在IO的bit7。
在上述條件下,當數碼管公共端接地時,若8段中某一段所接的IO輸出高電平,則對應段會亮。|0x80之前應該是取段碼,段碼中不含小數點,再與0x80或之後,則添加上小數點的段碼。