① 設計用at89c51單片機P3口控制8個LED的電路原理圖,並簡要說明如何控制LED燈的亮滅
摘要
② 51單片機開發板原理圖
這是一個51開發板原理圖,可以參考。
③ 求教基於AT89C51單片機控制的開關電源原理圖 (輸出電壓12-24V 電流1A)
沒有實用意義,筆者維修多年沒有見過單片機控制的開關電源。輸出電壓12-24V 電流1A,用單片電源IC可以搞定,簡單。
④ 單片機AT89C51電子琴設計的原理圖和c程序
#include<AT89X51.H>
unsignedchartemp;
unsignedcharkey;
unsignedchari,j;
unsignedcharSTH0;
unsignedcharSTL0;
unsignedintcodetab[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178};
voidmain(void)
{
TMOD=0x01;
ET0=1;
EA=1;
while(1)
{
P3=0xff;//將P3口取出
P3_4=0;//使P3_4為低電平,這樣可以判斷第一豎排有沒有鍵按下
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)//有鍵按下
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);//延時
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)//再判斷是否有鍵按下
{
temp=P3;
temp=temp&0x0f;
switch(temp)//判斷是哪個鍵按下
{
case0x0e:
key=0;
break;
case0x0d:
key=1;
break;
case0x0b:
key=2;
break;
case0x07:
key=3;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;//找出鍵對應的頻率的時間,作為定時器中斷初始值
STL0=tab[key]%256;
TR0=1;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_5=0;//跟上面差不多,現在是判斷第二排的按鍵
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=4;
break;
case0x0d:
key=5;
break;
case0x0b:
key=6;
break;
case0x07:
key=7;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=8;
break;
case0x0d:
key=9;
break;
case0x0b:
key=10;
break;
case0x07:
key=11;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=12;
break;
case0x0d:
key=13;
break;
case0x0b:
key=14;
break;
case0x07:
key=15;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
TR0=0;
}
}
}
}
voidt0(void)interrupt1using0
{
TH0=STH0;
TL0=STL0;
P1_0=~P1_0;
}
你自己看下程序吧,我也不願意注釋。
這個是能發出16個音符聲音的
⑤ 這個單片機89c51的電路圖各部分原件有什麼用,以及為什麼要這樣設計
U1是單片機,LS1是一個小喇叭發聲音的。
X1是晶體振盪器,提供單片機的工作頻率。
K1到K4是按鍵,按下以後通過一個中斷信號來通知單片機。用戶有按鍵的動作。
再上面是一個顯示屏。
⑥ AT89C51單片機原理圖都需要上拉電阻嘛
原理上講:只要P0口上來,P0 是開漏,,內部沒有上啦電阻,,所以無法輸出高電平,僅為不確定態,上拉電阻保證P0輸出高電平。
其他IO口的話,加上拉 在一定程度上提高IO口的驅動能力, 上啦電阻和內部上拉電阻並聯,電流增大。。。 一般其他IO口不需要加上拉電阻的,
⑦ 如何用AT89C51單片機點亮32個LED燈求詳細原理圖。各位幫幫忙了!!!謝謝啦!
呵呵,最簡單的,就是把四個埠的32條IO各連到一個LED的負極,然後每個LED各串一個電阻到電源.
不過這樣的話,你的單片機就不能幹別的事了.
當然也可以通過擴展,或者用矩陣,方法就很多了.
⑧ MCS-51單片機電子時鍾 原理圖和程序 主晶元AT89C51
//我不收費的,只求多加點經驗
#include <reg51.h> /*定義頭文件*/
/************************************************************************************/
typedef unsigned char BYTE; /*自定義位元組類型*/
/************************************************************************************/
#define Set_Bit(BIT) (BIT = 1) /*定義置1函數*/
#define Clear_Bit(BIT) (BIT = 0) /*定義清0函數*/
#define HD7279_TEST 0xbf //測試
#define HD7279_RLC 0xa3 //循環左移
#define HD7279_RRC 0xa2 //循環右移
#define HD7279_RL 0xa1 //左移
#define HD7279_RR 0xa0 //右移
#define DECODE0 0x80 //解碼方式0
#define HD7279_DECODE1 0xc8 //解碼方式1
#define UNDECODE 0x90 //解碼方式2: 不解碼
#define HD7279_HIDE 0x98 //消隱
#define HD7279_FLASH 0x88 //閃爍 閃爍
#define HD7279_SEGON 0xe0 //段亮
#define HD7279_SEGOFF 0xc0 //段滅
#define CMD_READ 0x15 //讀
/************************************************************************************/
void Led_On(BYTE); /*定義點亮LED燈函數*/
void Led_Off(BYTE); /*定義熄滅LED燈函數*/
void write7279(BYTE,BYTE); /*定義HD7279寫函數*/
BYTE read7279(BYTE); /*定義HD7279讀函數*/
void Send_Byte(BYTE); /*定義HD7279發送位元組函數*/
BYTE Receive_Byte(void); /*定義HD7279接收位元組函數*/
void Short_Delay(void); /*定義短延時函數*/
void Long_Delay(void); /*定義長延時函數*/
void Mcu_Init(void); /*定義MCU初始化函數*/
void Delay_200_mS(void); /*定義200ms延時函數*/
void distime(void);//顯示時間
void discalendar(void);//顯示日歷
void disweek(void);//顯示星期
void disclock(void);//顯示時鍾
/************************************************************************************/
BYTE Key_number; /*定義鍵值變數*/
unsigned char second=0,minute=30,hour=18,weekday,cs=0,cm=00,ch=0,nextcs; //時間鬧鍾變數
unsigned int day=27,month=9,year=2010,Flag=0,mark=0,XQ,i,j,clock,wait_cnter=0;//年月日等變數
/************************************************************************************/
sbit key=P3^3; /*定義HD7279中斷硬體連接--->INT1*/
sbit HD7279_Clk=P1^0; /*定義HD7279時鍾硬體連接*/
sbit HD7279_Data=P1^1; /*定義HD7279數據硬體連接*/
sbit HD7279_CS=P2^6;
sbit D1=P1^4; //鬧鍾標志
/************************************************************************************/
unsigned char x; //閃爍
void main(void)
{
Mcu_Init();
/*i=((year/1000)*10+(year/100)%10);
j=((year/10)%10+year%10);
XQ=(j+(j/4)+(i/4)-2*i+(26*(month+1)/10)+day-1)%7;*/
while(1)
{
if(clock==20)
{clock=0;
second++;} //一秒計時
if(second==60)
{second=0;
minute++;} //分進位
if(minute==60)
{minute=0;
hour++;} //時進位
if(hour==24)
{hour=0; //天進位
day++;
}
if(((month%2)==0&&month<=6)||month==9||month==11)//2,4,6,9,11月
{if(month==2)
if(month==2)
{
if(day==29) //非閏年的進位
{
if(year%4==0&&year%100!=0||year%400==0)
mark=1; //mark閏年標志位
else
mark=2; }
if(mark==2) //2月為28天的
{
day=1;
month++;
if(month==13)
{
month=1;
year++; }
}
else //2月為29天的
{
if(day==30)
{
day=1;
month++; }
if(month==13)
{
month=1;
year++; }
}
}
if (day==31)
{ day=1;
month++;}
if (month==13)
{ month=1;
year++;
}
}
if(((month+1)%2==0&&month<8)||month==8||month==10||month==12)//1,3,5,7,8,10,12月
{if (day==32)
{ day=1;
month++;}
if (month==13)
{ month=1;
year++;
}
}
if(cs==60) //鬧鈴的設置
cs=0;
if(cm==60)
cm=0;
if(ch==24)
ch=0;
if(month==13)
{month=1;}
if(XQ==8)
{XQ=1;}
if(Flag==0) //顯示日歷
{discalendar();
}
if(Flag==2) //顯示時間
{distime();
}
if(Flag==4) //顯示星期
{if(month==1||month==2) //1,2特殊演算法
{month+=12;
year--;
XQ=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
XQ=XQ+1;
if(month==13||month==14)
{month=month-12;
year++;
}}
XQ=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
XQ=XQ+1;
disweek();}
if(Flag==6) //顯示鬧鍾
{disclock();}
if(second==cs&&minute==cm&&hour==ch) //鬧鈴設置時間與時鍾一致
{
{ D1=0; }
nextcs=cs+30;}
if(second==nextcs&&minute==cm&&hour==ch) //定時30s
D1=1;
}
}
void Mcu_Init(void) /*MCU初始化函數*/
{
Set_Bit(EX1); /*外部中斷1使能*/
Set_Bit(IT1); /*外部中斷1下降沿觸發*/
Set_Bit(ET0);
Set_Bit(TR0);
Set_Bit(EA); /*中斷使能*/
TMOD=0X01;
TH0=0X4C;
TL0=0X00;
HD7279_CS=0;
Send_Byte(0xa4); /*HD7279復位*/
}
/************************************************************************************/
/************************************************************************************/
void int1_HD7279key(void) interrupt 2 /*外部中斷1函數*/
{Key_number=read7279(CMD_READ); //讀取鍵盤的值
Key_number=Key_number&0x0f;
while(!key); wait_cnter=0; //等待
if(Flag==0)
{
switch(Key_number)
{ case 0x00: write7279(DECODE0, (day+=1)%10); write7279(DECODE0, day/10);break; //調節日
case 0x01: write7279(DECODE0+2,(month+=1)%10); write7279(DECODE0+2,month/10);break; //調節月
case 0x02: write7279(DECODE0+4, (year+=1)%10); write7279(DECODE0+4, year/10);break; //調節年
case 0x03: Flag=1; break;
default : break;
}
while(!key); wait_cnter=0;
}
if(Flag==2)
{
switch(Key_number)
{
case 0x00: write7279(DECODE0, (second+=1)%10); write7279(DECODE0, second/10);break; //調節秒
case 0x01: write7279(DECODE0+3,(minute+=1)%10); write7279(DECODE0+3,minute/10);break; //調節分
case 0x02: write7279(DECODE0+6, (hour+=1)%10); write7279(DECODE0+6, hour/10);break; //調節時
case 0x03: Flag=3; break;
default : break;
}
while(!key); wait_cnter=0;
}
if(Flag==4)
{
switch(Key_number)
{
case 0x00: ;break;
case 0x01: ;break;
case 0x02: ;break;
case 0x03: Flag=5; break; //
default : break;
}
while(!key); wait_cnter=0;
}
if(Flag==6)
{
switch(Key_number)
{
case 0x00: write7279(DECODE0, (cs+=1)%10); write7279(DECODE0, cs/10);break; //調節鬧鍾秒
case 0x01: write7279(DECODE0+3,(cm+=1)%10); write7279(DECODE0+3,cm/10);break; //調節鬧鍾分
case 0x02: write7279(DECODE0+6, (ch+=1)%10); write7279(DECODE0+6, ch/10);break; //調節鬧鍾時
case 0x03: Flag=0; break;
default : break;
}
while(!key); wait_cnter=0;
}
if(Flag==1)
Flag=2;
if(Flag==3)
Flag=4;
if(Flag==5)
Flag=6;
}
void int_HD7279key(void) interrupt 1 /*定時中斷0函數*/
{ TH0=0X4C;
TL0=0X00;
clock++;
}
/************************************************************************************/
void Short_Delay(void) /*短延時函數*/
{
BYTE i;
for(i=0;i<0x08;i++);
}
/************************************************************************************/
void Long_Delay(void) /*長延時函數*/
{
BYTE i;
for(i=0;i<0x30;i++);
}
/************************************************************************************/
void write7279(BYTE Command,BYTE Data) /*HD7279寫函數*/
{
Send_Byte(Command);
Send_Byte(Data);
}
/************************************************************************************/
BYTE read7279(BYTE Command) /*HD7279讀函數*/
{
Send_Byte(Command);
return(Receive_Byte());
}
/************************************************************************************/
void Send_Byte(BYTE Data_Out) /*HD7279發送位元組函數*/
{
BYTE i;
Long_Delay();
for(i=0;i<8;i++)
{
if(Data_Out&0x80)
Set_Bit(HD7279_Data);
else Clear_Bit(HD7279_Data);
Set_Bit(HD7279_Clk);
Short_Delay();
Clear_Bit(HD7279_Clk);
Short_Delay();
Data_Out=Data_Out<<1;
}
Clear_Bit(HD7279_Data);
}
/************************************************************************************/
BYTE Receive_Byte(void) /*HD7279接收位元組函數*/
{
BYTE i,Data_In;
Set_Bit(HD7279_Data);
Long_Delay();
for(i=0;i<8;i++)
{
Set_Bit(HD7279_Clk);
Short_Delay();
Data_In=Data_In<<1;
if(HD7279_Data)
Data_In=Data_In|0x01;
Clear_Bit(HD7279_Clk);
Short_Delay();
}
Clear_Bit(HD7279_Data);
return(Data_In);
}
/************************************************************************************/void distime(void)
{
write7279(DECODE0, second%10);
write7279(DECODE0+1,second/10);
write7279(UNDECODE+2,0x01);
write7279(DECODE0+3,minute%10);
write7279(DECODE0+4,minute/10);
write7279(UNDECODE+5,0x01);
write7279(DECODE0+6,hour%10);
write7279(DECODE0+7,hour/10);
}
/************************************************************************************/
void discalendar(void)
{
write7279(DECODE0, day%10);
write7279(DECODE0+1,day/10);
write7279(DECODE0+2, month%10);
write7279(DECODE0+3, month/10);
write7279(DECODE0+4, year%10);
write7279(DECODE0+5, (year/10)%10);
write7279(DECODE0+6, (year/100)%10);
write7279(DECODE0+7, year/1000);
}
/************************************************************************************/
void disweek(void)
{
write7279(DECODE0, XQ%10);
write7279(DECODE0+1,0x0F);
write7279(DECODE0+2, 0x0F);
write7279(DECODE0+3, 0x0F);
write7279(DECODE0+4, 0x0F);
write7279(DECODE0+5, 0x0F);
write7279(DECODE0+6, 0x0F);
write7279(DECODE0+7, 0x0F);
}
/************************************************************************************/
void disclock(void)
{
write7279(DECODE0, cs%10);
write7279(DECODE0+1,cs/10);
write7279(UNDECODE+2,0x01);
write7279(DECODE0+3,cm%10);
write7279(DECODE0+4,cm/10);
write7279(UNDECODE+5,0x01);
write7279(DECODE0+6,ch%10);
write7279(DECODE0+7,ch/10);
}
/************************************************************************************/
⑨ 急需基於單片機AT89C51製作的頻率計原理圖!
原理圖很簡單 就接一塊液晶 然後用T0和TI分別用於計數和定時 就可以了
原理圖差不多就是一塊單片機加一個液晶
⑩ AT89C51單片機的結構原理與引腳功能
AT89C51是一種帶4K位元組閃爍可編程可擦除只讀存儲器(FPEROM—)的低電壓,高性能CMOS8位微處理器,俗稱單片機。AT89C2051是一種帶2K位元組閃爍可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復擦除100次。該器件採用ATMEL高密度非易失存儲器製造技術製造,與工業標準的MCS-51指令集和輸出管腳相兼容。由於將多功能8位CPU和閃爍存儲器組合在單個晶元中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C單片機為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。外形及引腳排列如圖所示
主要特性:
·與MCS-51兼容
·4K位元組可編程閃爍存儲器
·壽命:1000寫/擦循環
·數據保留時間:10年
·全靜態工作:0Hz-24MHz
·三級程序存儲器鎖定
·128×8位內部RAM
·32可編程I/O線
·兩個16位定時器/計數器
·5個中斷源
·可編程串列通道
·低功耗的閑置和掉電模式
·片內振盪器和時鍾電路
管腳說明:
VCC:供電電壓。
GND:接地。
P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用於外部程序數據存儲器,它可以被定義為數據/地址的第八位。在FIASH編程時,P0口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。
P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1後,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由於內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。
P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫「1」時,其管腳被內部上拉電阻拉高,且作為輸入。並因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由於內部上拉的緣故。P2口當用於外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。在給出地址「1」時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。
P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入「1」後,它們被內部上拉為高電平,並用作輸入。作為輸入,由於外部下拉為低電平,P3口將輸出電流(ILL)這是由於上拉的緣故。
P3口也可作為AT89C51的一些特殊功能口,如下表所示:
口管腳備選功能
P3.0RXD(串列輸入口)
P3.1TXD(串列輸出口)
P3.2/INT0(外部中斷0)
P3.3/INT1(外部中斷1)
P3.4T0(記時器0外部輸入)
P3.5T1(記時器1外部輸入)
P3.6/WR(外部數據存儲器寫選通)
P3.7/RD(外部數據存儲器讀選通)
P3口同時為閃爍編程和編程校驗接收一些控制信號。
RST:復位輸入。當振盪器復位器件時,要保持RST腳兩個機器周期的高電平時間。
ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用於鎖存地址的地位位元組。在FLASH編程期間,此引腳用於輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振盪器頻率的1/6。因此它可用作對外部輸出的脈沖或用於定時目的。然而要注意的是:每當用作外部數據存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時,ALE只有在執行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執行狀態ALE禁止,置位無效。
/PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN信號將不出現。
/EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程序存儲器。注意加密方式1時,/EA將內部鎖定為RESET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用於施加12V編程電源(VPP)。
XTAL1:反向振盪放大器的輸入及內部時鍾工作電路的輸入。
XTAL2:來自反向振盪器的輸出。
振盪器特性:
XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內振盪器。石晶振盪和陶瓷振盪均可採用。如採用外部時鍾源驅動器件,XTAL2應不接。有餘輸入至內部時鍾信號要通過一個二分頻觸發器,因此對外部時鍾信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。