❶ 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);
}
/************************************************************************************/
❷ 51單片機最小系統原理圖
我是一名單片機工程師,下面的講解你參考一下.
.
51單片機共有40隻引腳.下面這個就是最小系統原理圖,就是靠這四個部分,這個單片機就可以運行起來了.(看下面的數字標記,1234)
.
這個腳是存儲器使用選擇腳,當這個腳接」地」時,那麼就是告訴單片機,選擇使用外部存儲器,當這個腳接」5V」時,說明單片機使用內部存儲器.
如果選擇外部的存儲器,太浪費單片機僅有的資源,所以這一腳永遠接電源5V(如上圖所示),使用單片機的內部存儲器.
5 如果內部存儲器不夠容量,最多選擇更高級的容量,就可以解決容量不夠的問題了,就是這么簡單
.
一天入門51單片機:點我學習
.
我是歲月哥,願你學習愉快!
❸ 求:用AT89C51單片機實現直流電機PWM調速原理圖,protues模擬、程序
/************頭文件*********/
#include<reg51.h>
#include<absacc.h>
#include <intrins.h>
/************************** /
/********自定義變數********/
#define uint unsigned int //自定義變數
#define uchar unsigned char
char gw,sw,bw,qw;
uchar j; //定時次數,每次20ms
uchar f=5; //計數的次數
sbit P10=P1^0; //PWM輸出波形1
sbit P11=P1^1; //PWM輸出波形2
sbit P12=P1^2; //正反轉
sbit P13=P1^3; //加速
sbit P14=P1^4; //減速
sbit P15=P1^5; //停止
sbit P16=P1^6; //啟動
uchar k;
uchar t; //脈沖加減
/**************************/*
/*********控制位定義********************/
uchar code smg[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x73,0x71};//程序存儲區定義字型碼表
char data led[4]={0x08,0x04,0x02,0x01}; //位碼
uint x; //數碼管顯示的數值
display(); //數碼管顯示
delays(); //延時函數
key();
displays();
/*****************************************/
/***************主函數********************/
main (void)
{
TMOD=0x51; //T0方式1 定時計數 T1方式1計數
TH0=0xb1; //裝入初值 20MS
TL0=0xe0;
TH1=0x00; // 計數567
TL1=0x00;
TR0=1; //啟動 t0
TR1=1; //啟動t1
gw=sw=bw=qw=0; //數碼管初始化
P0=0xc0;
P2=1;
while(1) //無限循環
{
display(); //數碼管顯示
key();
}
}
/*****************************************/
/***************數碼管顯示****************/
display()
{
uchar i;
gw=x%10; //求速度個位值,送到個位顯示緩沖區
sw=(x/10)%10; //求速度十位值,送到十位顯示緩沖區
bw=(x/100)%10; //求速度百位值,送到百位顯示緩沖區
qw=x/1000; //求速度千位值,送到千位顯示緩沖區
for(i=0;i<4;)
{
P2=led[i];
if(i==0) //顯示個位
{
P0=smg[gw];
delays();
}
else if(i==1) //顯示十位
{
P0=smg[sw];
delays();
}
else if(i==2) //顯示百位
{
P0=smg[bw];
delays();
}
else if(i==3) //顯示千位
{
if(k==0) //正轉時顯示"三"
{
P0=0x49;
delays();
}
else
{
P0=0x71; //反轉時顯示"F"
}
}
i++;
}
}
/*******************************************************/
/*****************延時函數*************************/
delays()
{
uchar i;
for(i=5000;i>0;i--);
}
/************************************************/
/*********t0定時*中斷函數*************/
void t0() interrupt 1 using 2
{
TH0=0xb1; //重裝t0
TL0=0xe0;
f--;
if(k==0)
{
if(f<t)
P10=1;
else
P10=0;
P11=0;
}
else
{
if(f<t)
P11=1;
else
P11=0;
P10=0;
}
if(f==0)
{
f=5;
}
j++;
if(j==50)
{
j=0;
x=TH1*256+TL1; //t1方式1計數,讀入計數值
TH1=0x00;
TL1=0x00;
x++;
display();
}
}
/****************按鍵掃描**************/
key()
{
if(P12==0) //如果按下,
{
while(!P12) //去抖動
display();
k=~k;
}
if(P16==0) //啟動
{
while(P16==0);
IE=0x8a;
}
if(P13==0) //加速
{
while (P13==0);
t++;
}
if(t>=5)
t=5;
if(P14==0) //減速
{
while(P14==0);
t--;
}
if(t<1)
t=1;
if(P15==0) //停止
{
while(P15==0);
EA=0;
P10=0;
P11=0;
}
}
/******************************************************/
❹ 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應不接。有餘輸入至內部時鍾信號要通過一個二分頻觸發器,因此對外部時鍾信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。
❺ 求教基於AT89C51單片機控制的開關電源原理圖 (輸出電壓12-24V 電流1A)
沒有實用意義,筆者維修多年沒有見過單片機控制的開關電源。輸出電壓12-24V 電流1A,用單片電源IC可以搞定,簡單。
❻ c51單片機復位電路的工作原理
如S22復位鍵按下時:RST經1k電阻接VCC,獲得10k電阻上所分得電壓,形成高電平,進入「復位狀態」
當S22復位鍵斷開時:RST經10k電阻接地,電流降為0,電阻上的電壓也將為0,RST降為低電平,開始正常工作
(6)at98c51單片機原理圖擴展閱讀:
復位電路是一種用來使電路恢復到起始狀態的電路設備,它的操作原理與計算器有著異曲同工之妙,只是啟動原理和手段有所不同。復位電路,就是利用它把電路恢復到起始狀態。就像計算器的清零按鈕的作用一樣,以便回到原始狀態,重新進行計算。
和計算器清零按鈕有所不同的是,復位電路啟動的手段有所不同。一是在給電握絕路通電時馬上進行復位操作;二是在必要時可以由手動操作;三是根據程序或者電路運行的需要自動地進行。復位電路都是比較簡單的大都是只有電阻和電容猜行組合就可以辦到了,再復雜點就有三極體等配合程序來進行了。
單片機復位電路主要有四種類型:
(1)微分型復位電路:
(2)積分型復位電路:
(3)比較器型復位電路:
比較器型復位電路的基本原理。上電復位時,由於組成了一個RC低通網路,所以比較器的正相輸入端的電壓比負相端輸入電壓延遲一定時間.而比較器的負相端網路的時間常數遠遠小於正相端RC網路的時間常數。
因此在正端電壓還沒有超過負端電壓時,比較器輸出低電平,經反相器後產生高電平.復位脈沖的寬度主要取決於正常電壓上升的速度.由於負端電壓放電迴路時間常數較大,因此對電源電壓的波動不敏感.但是容易產生以下二種不利現象:
(1)電源二次開關間隔太短時,復位不可靠:
(2)當電源電壓中有浪涌現象時,可能在浪涌消失後不能產生復位脈沖。
為此,將改進比較器重定電路,如圖9所示.這個改進電路可以消除第一種現象,並減少第二種現象的產生.為了徹底消除這二種現象,可以利用數字邏輯的方法和比較器配合,設計的比較器穗皮嘩重定電路。此電路稍加改進即可作為上電復位和看門狗復位電路共同復位的電路,大大提高了復位的可靠性。
❼ AT89S51單片機八路搶答器工作原理
基於MCS-51系列單片機AT89S51的八路搶答器
基於MCS-51系列單片機AT89S51的八路搶答器
前言
隨著現代電子電路的快速發展,以及電子行業對現有電子工程技術的不斷需求,特別是對實際操作實踐的電子人才的需求越來越多,所以加強學生動手能力、重視實踐應該是電子發展需求的必然趨向。實踐動手能力的培養是一種綜合能力,這種能力當然是在一定難度的前提下完成的,通過一定數量的實踐才能逐步形成的。因此在培養實踐能力的同時,要通過實踐來不斷的發現問題和解決問題的途徑和方法,從而提高實踐能力。
近年來,隨著單片機檔次的不斷提高,功能的不斷完善,其應用日趨成熟、應用領域日趨擴大,特別是工業測控、尖端武器和日用家電等領域更是因為有了單片機而生輝增色。單片機應用技術已成為一項新的工程應用技術。本次實習設計的題目為基於單片機的搶答器。
在本次的課程設計中我主要負責了該系統的印製電路板PCB的製作
一、方案論證
方案一:系統各部分採用中小規模集成數字電路,用機械開關按鈕作為控制開關,完成搶答輸入信號的觸發。該方案的特點是中小規模集成電路應用技術成熟,性能可靠,能方便地完成選手搶答的基本功能,但是由於系統功能要求較高,所以電路連接集成電路相對較多,而且過於復雜,並且製作過程工序比較煩瑣,使用不太方便。
方案二:該系統採用MCS-51系列單片機AT89S51作為控制核心,該系統可以完成運算控制、信號識別以及顯示功能的實現。由於用了單片機,使其技術比較成熟,應用起來方便、簡單並且單片機周圍的輔助電路也比較少,便於控制和實現。整個系統具有極其靈活的可編程性,能方便地對系統進行功能的擴張和更改性。CS-51單片機特點如下:
1>可靠性好:單片機按照工業控制要求設計,抵抗工業雜訊干擾優於一般的CPU,程序指令和數據都可以燒寫在ROM許多信號通道都在同一晶元,因此可靠性高。
2>易擴充:單片機有一般電腦所必須的器件,如三態雙向匯流排,串並行的輸入及輸出引腳,可擴充為各種規模的微電腦系統
3>控制功能強:單片機指令除了輸入輸出指令,邏輯判斷指令外還有更豐富的條件分支跳躍指令。原理框圖如1-1所示;
圖1-1
方案比較及其選用依據,顯然方案二比方案一簡單的多,不但從性能上優於方案一,而且在使用上及其功能的實現上都較方案一簡潔,並且由於單片機具有優越的高集成電路性,使其工作速度更快、效率更高。另外AT89S51單片機採用12MHz的晶振,提高了信號的測量精度,並且使該系統可以通過軟體改進來擴張功能。而方案一採用了中小規模集成電路,有其復雜的電路性能,從而可能會使信號的輸入輸出產生延時及不必要的誤差。依此依據選擇方案二比較適合。
二、原理分析
1.本電路採用單片機AT89C51作為控制晶元,單片機的P0口外接八個發光二極體,每個發光二極體分別作為八位選手的信號指示燈。並在各個外接電路上並接開關按鍵,按鍵另一端接地。發光二極體採用共陽極接法,由於P0口為高電平呈輸入狀態,當有按鍵按下時,P0口呈低電平與按鍵對應的發光二極體滿足點亮條件點亮。在程序編程上採用查詢,查詢P0口P0。0到P0。7的八個埠呈低電平,即查詢是哪個選手先按鍵,然後將選手號碼的位元組數據送至串列口輸出並在數碼管上顯現出來。
2.蜂鳴器是利用三極體處於開關狀態是的導通與截止工作,在三極體導通時蜂鳴器工作,三極體截止時蜂鳴器不工作。三極體採用8550PNP型基極接於P1。2口置其低電平時三極體導通,置其高電平時三極體截止。
3.數碼管採用共陽極七段顯示,其內部發光二極體為共陽極接高電平,當對應發光二極體一端為低電平時發光二極體點亮,顯示的數字或字元由送入的位元組數據控制,位元組數據的輸出採用串形口工作模式0,8位串列位元組數據的輸出通過RXD埠送出,TXD端用於送出同步移位脈沖,作為外接器件的同步移位信號。數據的發送是在TI=0的情況下,由一寫發送緩沖器的指令開始CPU執行完該指令,串列口即將8位數據從RXD端送出,同時TXD端發出同步移位脈沖。8位數據發送完畢後由硬體置位TI=1,通過查詢TI位來確定是否發送完一組數據,TI=1表示發送緩沖器已空,當要發送下一組數據時用軟體使TI清零,然後即可發送下一組數據。
4.軟體設計分析首先在程序的開始為選手設置了一段違規程序,該程序的作用是為了防止選手在主持人沒有按下搶答鍵時,有的選手已經提前搶答了,本次搶答為無效搶答,並有報警和記錄下該位選手的選號,做違規處理,如果選手超出了在規定的提前搶答次數,則該選手將被取消以後的搶答資格。如果在主持按下搶答鍵時再搶答,該次搶答被視為有效搶答,在主持按下回答問題的鍵時選手就可以在規定的時間內回答問題了
圖1-2
<1>選手查詢程序:
ORG0000H
START:CLRA
MOVA,#0FFH
MOVP0,A
LOP:JNBP2。4,LP
JNBP0。0,SA1
JNBP0。1,SA2
JNBP0。2,SA3
JNBP0。3,SA4
JNBP0。4,SA5
JNBP0。5,SA6
JNBP0。6,SA7
JNBP0。7,SA8
SJMPLOP
SA1:AJMPSB1
SA2:AJMPSB2
SA3:AJMPSB3
SA4:AJMPSB4
SA5:AJMPSB5
SA6:AJMPSB6
SA7:AJMPSB7
SA8:AJMPSB8
LP:MOVR0,#9
LOP1:LCALLLED
LCALLDEL
JNBP0。0,SIP1
JNBP0。1,SIP2
JNBP0。2,SIP3
JNBP0。3,SIP4
JNBP0。4,SIP5
JNBP0。5,SIP6
JNBP0。6,SIP7
JNBP0。7,SIP8
DECR0
CJNER0,#0,LOP1
MOVR0,#0
LCALLLED
LCALLDEL
SJMPLOP
SIP1:AJMPDIP1
SIP2:AJMPDIP2
SIP3:AJMPDIP3
SIP4:AJMPDIP4
SIP5:AJMPDIP5
SIP6:AJMPDIP6
SIP7:AJMPDIP7
SIP8:AJMPDIP8
SB1:MOVR2,#1
LCALLLED1
LCALLDE
SJMPLP1
SB2:MOVR2,#2
LCALLLED1
LCALLDE
SJMPLP1
SB3:MOVR2,#3
LCALLLED1
LCALLDE
SJMPLP1
SB4:MOVR2,#4
LCALLLED1
LCALLDE
SJMPLP1
SB5:MOVR2,#5
LCALLLED1
LCALLDE
SJMPLP1
SB6:MOVR2,#6
LCALLLED1
LCALLDE
SJMPLP1
SB7:MOVR2,#7
LCALLLED1
LCALLDE
SJMPLP1
SB8:MOVR2,#8
LCALLLED1
LCALLDE
SJMPLP1
LP1:JNBP2。4,LOP2
SJMPLP1
DIP1:MOVR2,#1
LCALLLED1
LCALLDE
SJMPLH1
DIP2:MOVR2,#2
LCALLLED1
LCALLDE
SJMPLH1
DIP3:MOVR2,#3
LCALLLED1
LCALLDE
SJMPLH1
DIP4:MOVR2,#4
LCALLLED1
LCALLDE
SJMPLH1
DIP5:MOVR2,#5
LCALLLED1
LCALLDE
SJMPLH1
DIP6:MOVR2,#6
LCALLLED1
LCALLDE
SJMPLH1
DIP7:MOVR2,#7
LCALLLED1
LCALLDE
SJMPLH1
DIP8:MOVR2,#8
LCALLLED1
LCALLDE
SJMPLH1
LH1:JNBP2。4,LOOP
SJMPLH1
LOP2:MOVA,#11H
MOVSBUF,A
JNBTI,$
CLRTI
LCALLDEL
AJMPLOP
<2>串列輸出程序:
該部分程序的設計利用了單片機的串列模式0輸出,該輸出方式佔用IO口少。可以省去許多IO口作為功能的擴展使用。在該模式下,我們採用了輸出查詢的方式,就是要藉助發送標志TI,當程序執行到發送標志位時,查詢其標志位TI的值,只要TI的值是0程序就繼續查詢,知道查詢到TI為1時才結束,然後在進入下一組數據的發送。由於串列輸出時送進去的數都是十進制數,以致計算機不能識別,所以還要把送進去的十進制數轉化成而進制數,這樣才能輸出。因此在輸出程序前必須有拆字程序,把原來送進去的十進制數轉化成二進制數,然後在輸出並通過數碼管顯示出來。但是如果在顯示選手選號與顯示選手回答問題所用的到計同用一段串列輸出程序時就會造成程序的混亂,所以在此處設計了兩段初始值不同的顯示程序,從而可能增加了程序的煩瑣化。
LED1:MOVA,R2
MOVB,#10
DIVAB
MOVR1,A
MOVR3,B
MOVA,R1
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
MOVA,R3
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
RET。
LED:MOVA,R0
MOVB,#10
DIVAB
MOVR1,A
MOVR3,B
MOVA,R1
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
MOVA,R3
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
RET
DE:CLRP1。2
LCALLDEL01
SETBP1。2
LCALLDEL01
RET
TAB:DB11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H
RET
<3>倒計時程序
該程序為選手回答問題時的30秒倒計時程序,其中前25秒為正常的倒計時,在後5秒倒計時時伴隨有報警聲,用於提示選手回答問題的剩餘時間。如果該選手在正常的倒計時內沒有完成問題的回答,那麼倒計時將被清零。
LOOP:MOVR0,#30
LPP:LCALLLED
LCALLDEL
JNBP2。4,LOP2
DECR0
CJNER0,#5,LPP
MOVR0,#5
LPP1:JNBP2。4,LOP2
LCALLLED
LCALLDE
DECR0
CJNER0,#0,LPP1
MOVR0,#0
LCALLLED
LCALLDEL
LJMPSTART
<4>延時程序
該系統設計了兩段延時程序,一段1秒延時,是為了30秒倒計時調用和程序中一秒延時所用;另一段為0。5秒延時,用於報警。程序的設計中報警時間為一秒,但是由於在硬體的設計時只設計了一個按鍵,這樣就會造成連續按鍵時會使所設定的報警聲不斷的響,這是設計中不允許的,所以在軟體編程時設計了一個0。5秒的延時,被報警時所調用,這樣就使報警聲能很清楚地區分出來了
DEL:MOVR6,#20DEL01:MOVR6,#10
DEL1:MOVR5,#100DEL11:MOVR5,#100
DEL2:MOVR4,#250DEL21:MOVR4,#250
DJNZR4,$DJNZR4,$
DJNZR5,DEL2DJNZR5,DEL21
DJNZR6,DEL1DJNZR6,DEL11
RETRET
<5>報警程序
該段程序主要是用於本系統中的所有報警使用,報警時間延時為1秒鍾。
DE:CLRP1。2
LCALLDEL01
SETBP1。2
LCALLDEL01
RET
三、製作過程
五、參考文獻
曾峰,鞏海洪,曾波,電子工業出版社,印刷電路板(PCB)設計與製作2005.8
梅海鳳,王艷秋,張軍,汪毓鐸,清華大學出版社單片機原理與介面技術2004.2
北京交通大學出版社
第二個文獻:基於51單片機八路搶答器設計程序及電路圖
基於51單片機八路搶答器設計程序及電路圖
說明:本人的這個設計改進後解決了前一個版本中1號搶答優先的問題,並增加了錦囊的設置,當參賽選手在回答問題時要求使用錦囊,則主持人按下搶答開始鍵,計時重新開始。
;八路搶答器電路請看下圖是用ps模擬的,已經測試成功
<單片機八路搶答器電路圖>
;============================================================
;================單片機八路搶答器程序=====================
;================51hei=======================
;================2008年5月=======================
;============================================================
OKEQU20H;搶答開始標志位
RINGEQU22H;響鈴標志位
ORG0000H
AJMPMAIN
ORG0003H
AJMPINT0SUB
ORG000BH
AJMPT0INT
ORG0013H
AJMPINT1SUB
ORG001BH
AJMPT1INT
ORG0040H
MAIN:MOVR1,#30;初設搶答時間為30s
MOVR2,#60;初設答題時間為60s
MOVTMOD,#11H;設置未定時器/模式1
MOVTH0,#0F0H
MOVTL0,#0FFH;越高發聲頻率越高,越尖
MOVTH1,#3CH
MOVTL1,#0B0H;50ms為一次溢出中斷
SETBEA
SETBET0
SETBET1
SETBEX0
SETBEX1;允許四個中斷,T0/T1/INT0/INT1
CLROK
CLRRING
SETBTR1
SETBTR0;一開始就運行定時器,以開始顯示FFF.如果想重新計數,重置TH1/TL1就可以了
;=====查詢程序=====
START:MOVR5,#0BH
MOVR4,#0BH
MOVR3,#0BH
ACALLDISPLAY;未開始搶答時候顯示FFF
JBP3.0,NEXT;ddddddd
ACALLDELAY
JBP3.0,NEXT;去抖動,如果"開始鍵"按下就向下執行,否者跳到非法搶答查詢
ACALLBARK;按鍵發聲
MOVA,R1
MOVR6,A;送R1->R6,因為R1中保存了搶答時間
SETBOK;搶答標志位,用於COUNT只程序中判斷是否查詢搶答
MOVR7,#01H;讀搶答鍵數據信號標志,這里表示只讀一次有用信號
MOVR3,#0AH;搶答只顯示計時,滅號數
AJMPCOUNT;進入倒計時程序,"查詢有效搶答的程序"在COUNT裡面
NEXT:JNBP1.0,FALSE1
JNBP1.1,FALSE2
JNBP1.2,FALSE3
JNBP1.3,FALSE4
JNBP1.4,FALSE5
JNBP1.5,FALSE6
JNBP1.6,FALSE7
JNBP1.7,FALSE8
AJMPSTART
;=====非法搶答處理程序=====
FALSE1:MOVR3,#01H
AJMPERROR
FALSE2:MOVR3,#02H
AJMPERROR
FALSE3:MOVR3,#03H
AJMPERROR
FALSE4:MOVR3,#04H
AJMPERROR
FALSE5:MOVR3,#05H
AJMPERROR
FALSE6:MOVR3,#06H
AJMPERROR
FALSE7:MOVR3,#07H
AJMPERROR
FALSE8:MOVR3,#08H
AJMPERROR
;=====INT0(搶答時間R1調整程序)=====
INT0SUB:MOVA,R1
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
MOVR3,#0AH
ACALLDISPLAY;先在兩個時間LED上顯示R1
JNBP3.4,INC0;P3.4為+1s鍵,如按下跳到INCO
JNBP3.5,DEC0;P3.5為-1s鍵,如按下跳到DECO
JNBP3.1,BACK0;P3.1為確定鍵,如按下跳到BACKO
AJMPINT0SUB
INC0:MOVA,R1
CJNEA,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。
MOVR1,#00H
ACALLDELAY1
AJMPINT0SUB
ADD0:INCR1
ACALLDELAY1
AJMPINT0SUB
DEC0:MOVA,R1
JZSETR1;如果R1為0,R1就置99,
DECR1
ACALLDELAY1
AJMPINT0SUB
SETR1:MOVR1,#63H
ACALLDELAY1
AJMPINT0SUB
BACK0:RETI
;=====INT1(回答時間R2調整程序)=====
INT1SUB:MOVA,R2
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
MOVR3,#0AH
ACALLDISPLAY
JNBP3.4,INC1
JNBP3.5,DEC1
JNBP3.1,BACK1
AJMPINT1SUB
INC1:MOVA,R2
CJNEA,#63H,ADD1
MOVR2,#00H
ACALLDELAY1
AJMPINT1SUB
ADD1:INCR2
ACALLDELAY1
AJMPINT1SUB
DEC1:MOVA,R2
JZSETR2
DECR2
ACALLDELAY1
AJMPINT1SUB
SETR2:MOVR2,#63H
ACALLDELAY1
AJMPINT1SUB
BACK1:RETI
;=====倒計時程序(搶答倒計時和回答倒計時都跳到改程序)=====
REPEAT:MOVA,R2;使用錦囊時重新計時
MOVR6,A
CLRRING
COUNT:MOVR0,#00H;重置定時器中斷次數
MOVTH1,#3CH
MOVTL1,#0B0H;重置定時器
RECOUNT:MOVA,R6;R6保存了倒計時的時間,之前先將搶答時間或回答時間給R6
MOVB,#0AH
DIVAB;除十分出個位/十位
MOV30H,A;十位存於(30H)
MOV31H,B;個位存於(31H)
MOVR5,30H;取十位
MOVR4,31H;取個位
MOVA,R6
SUBBA,#07H
JNCLARGER;大於5s跳到LARGER,小於等於5s會提醒
MOVA,R0
CJNEA,#0AH,FULL;1s中0.5s向下運行
CLRRING
AJMPCHECK
FULL:CJNEA,#14H,CHECK;下面是1s的情況,響並顯示號數並清R0,重新計
SETBRING
MOVA,R6
JZQUIT;計時完畢
MOVR0,#00H
DECR6;一秒標志減1
AJMPCHECK
LARGER:MOVA,R0
CJNEA,#14H,CHECK;如果1s向下運行,否者跳到查"停/顯示"
DECR6;計時一秒R6自動減1
MOVR0,#00H
CHECK:JNBP3.1,QUIT;如按下停止鍵退出
JNBOK,CHECKK;只在回答倒計時才有效
AJMPNEXTT
CHECKK:JNBP3.0,REPEAT;判斷是否使用錦囊
NEXTT:ACALLDISPLAY
JBOK,ACCOUT;如果是搶答倒計時,如是則查詢搶答,否者跳過查詢繼續倒數(這里起到鎖搶答作用)
AJMPRECOUNT
ACCOUT:
MOVA,36H
JNBACC.0,TRUE1
JNBACC.1,TRUE2
JNBACC.2,TRUE3
JNBACC.3,TRUE4
JNBACC.4,TRUE5
JNBACC.5,TRUE6
JNBACC.6,TZ1
JNBACC.7,TZ2
AJMPRECOUNT
TZ1:JMPTRUE7
TZ2:JMPTRUE8
QUIT:CLROK;如果按下了"停止鍵"執行的程序
CLRRING
AJMPSTART
;=====正常搶答處理程序=====
TRUE1:ACALLBARK
MOVA,R2
MOVR6,A;搶答時間R2送R6
MOVR3,#01H
CLROK;因為答題的計時不再查詢搶答,所以就鎖了搶答
AJMPCOUNT
TRUE2:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#02H
CLROK
AJMPCOUNT
TRUE3:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#03H
CLROK
AJMPCOUNT
TRUE4:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#04H
CLROK
AJMPCOUNT
TRUE5:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#05H
CLROK
AJMPCOUNT
TRUE6:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#06H
CLROK
AJMPCOUNT
TRUE7:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#07H
CLROK
AJMPCOUNT
TRUE8:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#08H
CLROK
AJMPCOUNT
;=====犯規搶答程序=====
ERROR:MOVR0,#00H
MOVTH1,#3CH
MOVTL1,#0B0H
MOV34H,R3;犯規號數暫存與(34H)
HERE:MOVA,R0
CJNEA,#06H,FLASH;0.3s向下運行->滅並停響
CLRRING
MOVR3,#0AH
MOVR4,#0AH
MOVR5,#0AH;三燈全滅
AJMPCHECK1
FLASH:CJNEA,#0CH,CHECK1;下面是0.8s的情況,響並顯示號數並清R0,重新計
SETBRING
MOVR0,#00H
MOVR3,34H;取回號數
MOVR5,#0BH
MOVR4,#0BH;顯示FF和號數
AJMPCHECK1
CHECK1:JNBP3.1,QUIT1
ACALLDISPLAY
AJMPHERE
QUIT1:CLRRING
CLROK
AJMPSTART
;=====顯示程序=====
DISPLAY:MOVDPTR,#DAT1;查表顯示程序,利用P0口做段選碼口輸出/P2低三位做位選碼輸出,
MOVA,R3
MOVCA,@A+DPTR
MOVP2,#0feH
MOVP0,A
ACALLDELAY2
MOVDPTR,#DAT2
MOVA,R5
MOVCA,@A+DPTR
MOVP2,#0fdH
MOVP0,A
ACALLDELAY2
MOVA,R4
MOVCA,@A+DPTR
MOVP2,#0fbH
MOVP0,A
ACALLDELAY2
RET
DAT1:DB00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
;"滅","1","2","3","4","5","6","7","8","9","滅","F"
DAT2:DB3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
;第一個為零,其他與上相同,因為十位如果為零顯示熄滅
;====加減時間延時(起到不會按下就加N個數)======
DELAY1:MOV35H,#08H
LOOP0:ACALLDISPLAY
DJNZ35H,LOOP0
RET
;=====延時4236個機器周期(去抖動用到)=====
DELAY:MOV32H,#12H
LOOP:MOV33H,#0AFH
LOOP1:DJNZ33H,LOOP1
DJNZ32H,LOOP
RET
;=====延時4236個機器周期(顯示用到)=====
DELAY2:MOV32H,#43H
LOOP3:MOV33H,#1EH
MOVA,R7;每隔60~70個機器周期讀一次P1口,全為1時為無效數據,繼續讀,有一個不為1時,轉到正常搶答處理
JNZAAAA1;沒讀到有效數據時繼續轉到AAAA1
LOOP2:DJNZ33H,LOOP2
DJNZ32H,LOOP3
RET
;=====讀搶答按鍵數據口程序=====
;由於在讀搶答數據口的時候,單片機首先進入倒計時程序,再調用顯示程序,最後才檢測按鍵口
;然而在檢測按鍵口時動態掃描要調用三次(4ms)延時程序.這樣就會導致讀數據口出現滯後,造成1號優先最高.8號最低.
;故採用在延時子程序中加了讀數據口程序.保證了靈敏度和可靠性
AAAA1:MOVA,P1
CJNEA,#0FFH,AA1;當不全為1時的數據為有效數據
AA0:MOV36H,A;將有效數據送到36H暫存
AJMPLOOP2
AA1:DECR7
AJMPAA0
;=====發聲程序=====
BARK:SETBRING
ACALLDELAY1
ACALLDELAY1
CLRRING;按鍵發聲
RET
;=====TO溢出中斷(響鈴程序)=====
T0INT:MOVTH0,#0ECH
MOVTL0,#0FFH
JNBRING,OUT;
CPLP3.6;RING標志位為1時候P3.6口不短取反使喇叭發出一定頻率的聲音
OUT:RETI
;=====T1溢出中斷(計時程序)=====
T1INT:MOVTH1,#3CH
MOVTL1,#0B0H
INCR0
RETI
僅供參考。
❽ 急求基於AT89C51單片機的循跡避障小車電路原理圖和主程序(避障模塊是超聲波測距的),感激不盡啊。
#include<reg51.h>
#define ucharunsignedchar
#defineuintunsignedint
sbitP1_O=P1^0;
sbitP1_1=P1^1;
sbitP1_2=P1^2;
sbitP1_3=P1^3;
sbitP0_2=P0^1;
sbitP0_3=P0^2;
voiddelaym1(uintz)
{
uinti;
for(i=0;i<z;i++);
}
voidmain(void)
{蔽攔
while(1);
{
TRIG=1;
delay(1);
TRIG=0;
while(ECHO==0);
while(ECHO==1)a++;//a每次加1,所時間約21us
delay(30);
a=((340*a*21)/1000)/2;
display();
scan();
z=a;
a=0;
delay(200);}
voidliudianji1()
{
uinti,j;
P0=0X00;
//走直線
for(i=0;i<200;i++)
{for(i=0;i<500;i++)
{
P0_O=1;
P0_1=0;
delaym1(280);
P0_O=0;
P0_1=0;
P0_2=1;
P0_3=0;
delaym1(420);
P0_2=0;
P0_3=0;
}
P0=0X00;
delaym1(30000);
delaym1(30000);}
//右轉彎
voidliudianji2()
{for(j=0;j<300;j++)
{P0_O=1;
皮並櫻P0_1=0;
delaym1(300);
P0_O=0;
P0_1=0;
P0_2=1;
P0_3=0;
delaym1(160);
P0_2=0;
P0_3=0;
}
P0=0X00;
delaym1(30000);
delaym1(30000);
//左轉彎
voidliudianji3()
{for(i=0;i<600;i++)
{
P0_O=1;
P0_1=0;
delaym1(155);
P0_O=0;
P0_1=0;
P0_2=1;
P0_3=0;
delaym1(650);
P0_2=0;
P0_3=0;
}
P0=0X00;
燃叢delaym1(30000);
delaym1(30000);}
P0=0x00;
while(1);
}
}
voidmain(void)
{
while(1)
{
TRIG=1;
delay(1);
TRIG=0;
while(ECHO==0);
while(ECHO==1)a++;//a每次加1,所時間約21us
delay(30);
a=((340*a*21)/1000)/2;
if(a==50)
esle
{voidliudianji3();}
delay(200);
voidliudianji1();
z=a;
a=0;
delay(200);
}
❾ 如何用AT89C51單片機點亮32個LED燈求詳細原理圖。各位幫幫忙了!!!謝謝啦!
呵呵,最簡單的,就是把四個埠的32條IO各連到一個LED的負極,然後每個LED各串一個電阻到電源.
不過這樣的話,你的單片機就不能幹別的事了.
當然也可以通過擴展,或者用矩陣,方法就很多了.
❿ 新手學習C51單片機(AT89C51),不懂晶振 能不能解釋下下圖的晶振電路
1、這是51系列單片機的晶振和復位電路。
2、C1,C2,X1構成晶振電路,X1是晶振,兩個電容為負載電容,作用是容易啟震和減小頻率的溫漂。
3、R1,C3組成復位電路,跟晶振沒有關系。