導航:首頁 > 操作系統 > 51單片機可以匯編自鎖嗎

51單片機可以匯編自鎖嗎

發布時間:2025-06-24 09:35:50

❶ 51單片機如何用六腳自鎖開關當作電源開關

開關本身是不分正負極的,只是控制個通斷,你用萬用表現測量下,區分出哪個腳是公共腳(一般中間的是公共腳),然後量下按下通是哪個腳,就用這倆腳就行了,希望對你有幫助

❷ 單片機可以做什麼事

單片機,又稱微處理器,他將一個系統所需要的RAM,Rom ,CPU等相關外設集成在一塊集成電路上,我們通過匯編語言或者C語言寫成我們需要的程序下載到單片機中運行,其實無論哪種單片機無非都是在控制自己的相關IO高低變化從而達到控制外設的目的。

在學習單片機的過程中,大部分人也是從點亮一個LED 燈泡開始的,完後時流水燈,控制繼電器,在然後就是各種協議,IIC,,spi,usart等。

S7200-plc

例如有這么一個控制系統,要求光電檢測物體,當光電檢測到物體到來時,接近感測器隨機檢測物體是否為金屬,當為金屬時系統不做處理,當不為金屬時系統輸出報警型號,控制報警器工作3S後關閉報警器,提示人工挑揀。

方法如下:

1、利用幾點器加延時繼電器進行設計,完全可以達到要求,成本也不是很高。

2、採用PLC,更加簡單,一個梯形圖外加幾個繼電器就搞定,但是成本高了,而且對於PLC的IO口來說一種浪費。

3、採用單片機:我們將光電採集的信號進入單片機的外部中斷,在中斷程序中判斷接近感測器的電平變化,沒有信號就不是金屬物體,我們輸出一個電平信號用定時器延時3秒就可以,而且成本低廉。

接下來我們對此系統進行擴展,加入一個1602液晶顯示屏成本10元以內,在液晶上我們對經過光電的物體進行技術,顯示出非金屬物體有過少個,我們還可以加入按鍵來隨時調節報警輸出時間。成本基本無變化。如果我們用PLC的話,就需要加HDMI,組態。

(2)51單片機可以匯編自鎖嗎擴展閱讀:

單片機分類標准①:通用性

按通用性可分為:通用型/專用型

這是按單片機適用范圍來區分的。例如,80C51是通用型單片機,它不是為某種專用途設計的;專用型單片機是針對一類產品甚至某一個產品設計生產的,例如為了滿足電子體溫計的要求,在片內集成ADC介面等功能的溫度測量控制電路。

單片機分類標准②:匯流排結構

按匯流排結構可分為:匯流排型/非匯流排型

這是按單片機是否提供並行匯流排來區分的。匯流排型單片機普遍設置有並行地址匯流排、 數據匯流排、控制匯流排,這些引腳用以擴展並行外圍器件都可通過串列口與單片機連接。

另外,許多單片機已把所需要的外圍器件及外設介面集成一片內,因此在許多情況下可以不要並行擴展匯流排,大大減省封裝成本和晶元體積,這類單片機稱為非匯流排型單片機。

單片機分類標准③:應用領域

按應用領域可分為:家電類,工控類,通信類,個人信息終端類等等

一般而言,工控型定址范圍大,運算能力強;用於家電的單片機多為專用型,通常是小封裝、低價格,外圍器件和外設介面集成度高。

單片機分類標准④:數據匯流排位數

按單片機數據匯流排位數可分為:4位、8位、16位和32位單片機

4位單片機結構簡單,價格便宜,非常適合用於控制單一的小型電子類產品,如PC機用的輸入裝置(滑鼠、游戲桿)、電池充電器、遙控器、電子玩具、小家電等。 2. 8位單片機。

8位單片機是目前品種最為豐富、應用最為廣泛的單片機,目前,8位單片機主要分為51系列及和非51系列單片機。51系列單片機以其典型的結構,眾多的邏輯位操作功能,以及豐富的指令系統,堪稱一代「名機」。

16位單片機 16位單片機操作速度及數據吞吐能力在性能上比8位機有較大提高。目前,應用較多的有TI的MSP430系列、凌陽SPCE061A系列、Motorola的68HC16系列、Intel的MCS-96/196系列等。

32位單片機 與51單片機相比,32位單片機運行速度和功能大幅提高,隨著技術的發展以及價格的下降,將會與8位單片機並駕齊驅。32位單片機主要由ARM公司研製,因此,提及32位單片機,一般均指ARM單片機。

嚴格來說,ARM不是單片機,而是一種32位處理器內核,實際中使用的ARM晶元有很多型號,常見的ARM晶元主要有飛利浦的LPC2000系列、三星的S3C/S3F/S3P系列等。

❸ 關於自學51單片機需要買什麼

1.建議買個帶MAX232和DB9介面的最小系統板,要擴充硬體時就用杜邦線連接。這樣成察高本低,襪笑結構簡單可靠。
2.USB轉串口的線是必須的,畢竟現在沒幾台電腦是有原生串口的,這個轉接線在串口通信實現和程序下載時非敗好尺常有用。
3.買一本51單片機教材。
4.現在比較合適的就是STC單片機了。AT89S52也不錯,但這需要USBASP下載線。
5.所有的51單片機都能用匯編和C編程,實際上編譯器也只是把C轉變為了匯編。

❹ 單片機自鎖程序

你的意思是K1按下,D1輸出低電平,再按一次K1,D1輸出高電平?
這……這里的按鍵檢測就不需要使用延時了,使用while不用怕會阻塞後面的程序執行。事實在公司寫程序,在檢測按鍵時我從來不用延時,當然也不是使用這種while等待按鍵松開的方式。有興趣可以一起研究一下,呵呵

#include<reg51.h>
#defineKEY1 (1<<0)
#defineKEY2 (1<<1)
#defineKEY3 (1<<2)
#defineKEY4 (1<<3)
#defineKEY5 (1<<4)
#defineKEY6 (1<<5)

sbitD1=P0^0;
sbitD2=P0^1;
sbitD3=P0^2;
sbitD4=P0^3;
sbitD5=P0^4;
sbitD6=P0^5;

voidmain(void)
{
while(1)
{
P1=0xff;
if(!(P1&KEY1))
{
D1=~D1;
while(!(P1&KEY1));
}
if(!(P1&KEY2))
{
D2=~D2;
while(!(P1&KEY2));
}
if(!(P1&KEY3))
{
D3=~D3;
while(!(P1&KEY3));
}
if(!(P1&KEY4))
{
D4=~D4;
while(!(P1&KEY4));
}
if(!(P1&KEY5))
{
D5=~D5;
while(!(P1&KEY5));
}
if(!(P1&KEY6))
{
D6=~D6;
while(!(P1&KEY6));
}
}
}

❺ 51單片機輸出循環

試試下列程序:

#include <reg51.h>
sbit t = P1^0;//LED燈輸出
sbit k = P3^5;//輕觸開關
#define uint unsigned int
#define uchar unsigned char

//延時函數
void delay(uchar z)
{
uint x, y;
for(x = z; x > 0; x--) for(y = 110; y > 0; y--);
}
//按鍵檢測函數
bit key()
{
bit kkk;
kkk = k; //讀入按鍵.
if(kkk == 1) return 0;//沒有按下.
delay(5); //延時.
if(k == kkk) return 1;//兩次相等.
return 0;
}
//主函數
void main()
{
P1 = 0xff;
while(1) {
while(!key()); //靜等按鍵.
t = ~t;
delay(200); //等一會再去檢測,以免閃動太快.
}
}

❻ 51單片機按鍵控制數碼管

#include <reg52.h> // 可以參考一下

#define uchar unsigned char

#include <stdio.h>

unsigned char* c;

sbit k0=P3^2;

sbit k1=P3^3;

sbit k2=P3^4;

sbit k3=P3^5;

sbit k4=P3^7;

sbit led1=P1^7;

uchar k;

bit y0,y1,y2,y3,y4,y5;

bit t,s,ld;

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};

void SendOneChar(char c) //發送位元組到PC

{

TI=0;

SBUF = c;

while(!TI);

TI=0;

}

void SendString(char *st) //發送字元串到PC

{

while(*st)

{

SendOneChar(*st++);

}

}

void main()

{

SCON = 0x50; //SCON: mode 1, 8-bit UART, enable rcvr

TMOD = 0x20; //TMOD: timer 1, mode 2, 8-bit reload

PCON = 0x80; // 數據位8、停止位1。效驗位無 (11.0592M)

TH1 = 0xF4; //TH1: reload value for [email protected]

TR1 = 1; //啟動定時器1

ES = 1; //允許串口中斷位

EA = 1; //允許總中斷位

c=0;

s=1;

k=0;

P1 =~table[k];

while(1)

{

if(k0==0 && y0==0)

{

y0=1;

c = "as";

SendString(c); //發送字元串

}

if(k0==1 ) { y0=0; }

if(k1==0 && y1==0)

{

y1=1;

c = "bs";

SendString(c); //發送字元串

}

if(k1==1 ) { y1=0; }

if(k2==0 && y2==0)

{

y2=1;

c = "ds";

SendString(c); //發送字元串

}

if(k2==1 ) { y2=0; }

if(k3==0 && y3==0)

{

y3=1;

c = "es";

SendString(c); //發送字元串

}

if(k3==1 ) { y3=0; }

if(k4==0 && y4==0)

{

y4=1;

c = "fs";

SendString(c); //發送字元串

}

if(k4==1 ) { y4=0; }

// for(i = 0; i < 4000; i++); //延遲一小段時間

}

}

void chuankou(void) interrupt 4

{

if(RI==1)

{

RI = 0;

if(t==1)

{

if(SBUF=='z') { k++;ld=~ld; }

s=1; t=0;

if(k==10) { k=0;}

P1 =~table[k];

led1=ld;

}

if(SBUF=='a' && s==1) { t=1;s=0;}

}

}

/////////////////////////////////////////

#include <reg51.h> // 接收 試試

#define uchar unsigned char

unsigned char* c;

sbit led1=P3^2; // 接收 az , P.2 輸出低電平, P3.3 輸出高電平。

sbit led2=P3^3; // 接收 aa , P.2 輸出高電平, P3.3 輸出低電平。

sbit k0=P3^5;

bit y0,t,s;

uchar k;

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};

void SendOneChar(char c) //發送位元組到PC

{

TI=0;

SBUF = c;

while(!TI);

TI=0;

}

void SendString(char *st) //發送字元串到PC

{

while(*st)

{

SendOneChar(*st++);

}

}

void main (void)

{

SCON = 0x50; // REN=1允許串列接受狀態,串口工作模式1

TMOD = 0x21; // 定時器工作方式2

PCON = 0x80; // 數據位8、停止位1。效驗位無 (11.0592M)

TH1 = 0xF4; // TH1 = 0xFD; 波特率 2400

TH0=(65536-54253)/256; // 50 mS

TL0=(65536-54253)%256;

TR1 = 1;

ES = 1; // 開串口中斷

EA = 1; // 開總中斷

led1=1;led2=0;

// ET0=1;

// TR0=1;

s=1;

k=0;

P1 =~table[k];

while(1)

{

if(k0==0 && y0==0)

{

y0=1;

c = "az";

SendString(c); //發送字元串

}

if(k0==1 ) { y0=0; }

}

}

void chuankou(void) interrupt 4

{

if(RI==1)

{

RI = 0;

if(t==1)

{

if(SBUF=='s') {led1=~led1;led2=~led2; k++; }

//if(SBUF=='s') {led1=1;led2=0; k--; }

s=1; t=0;

if(k==10) { k=0;}

if(k==255) { k=9; }

P1 =~table[k];

}

// 1號 a 2號 b ---

if(SBUF=='a' && s==1) { t=1;s=0;}

}

}

void T0_time()interrupt 1

{

TH0=(65536-54253)/256; // 50 mS

TL0=(65536-54253)%256;

k++;

if(k==10) // 這里修改時間

{

k=0;

led1=1;

led2=1;

}

}

❼ 315M無線收發模塊如何實際應用在51單片機上

你要是簡單的控制其實315M的配上編解碼晶元直接就能工作,比如PT2262(發)、PT2272(收)。。。畢竟2你只是簡單的控制個電機正反,2262最高能如入6路,2272也輸出6路,不過一般普通的是4路,另外分自鎖輸出和點動輸出

如果單片機的話直接接還真沒接過。。不過我感覺用51的串口通信應該就可以,一個用個AT89C2051這類的20腳小晶元,把P3.1:TXD 串口輸出接在31M發射模塊上,然後剩下的除了晶振和電源,復位引腳外都可以用於做按鍵檢測用。他有15個IO,P1是個標准8位口,P3比正常的少個P3.6,然後你在用於串口1個IO,剩下14個IO,按鍵應該足夠用了。然後在自己給編個碼,比如P1.0按下正轉輸出0x01,P1.1反轉輸出0x02.。。不過用單片機的話你遙控器只能是加個總電源開關,反正節能方面差點。。
然後是接收部分,同樣用串口接收,P3.0:RXD 串口輸入接在接收模塊的輸出DATA上。根據接收到的編碼來判斷哪個IO輸出。比如接收到0x01,認為是電機正轉,接收到0x02認為電機反轉。。。。

❽ 51單片機如何用一個按鍵和一個定時器來模擬PWM控制一個LED燈的亮度

使用定時器T0產生PWM方波,
用按鍵調整占空比,20級可調
控制led燈的亮度等級.
#include "my51.h"
#include "timer0.h"

#define grading 20 //亮度20級變化
sbit keyS3=P3^5; //按鍵調整占空比,PWM_keyChange++
sbit keyS4=P3^6; // PWM_keyChange--

u8 PWM_keyChange=10; //初值,按鍵調整在1~20之間變化
//占空比 PWM_keyChange/grading

void T0_work() //本函數由T0定時器中斷函數調用
{
if(timeMultiple1Flag)
{
led=off(7); //關閉7號燈
timeMultiple1Flag=0; //清定時器復用置位標志
}

if(timeMultiple2Flag)
{
led=on(7); //打開7號燈
timeMultiple2Flag=0; //清定時器復用置位標志
}
}

void main() //測試
{
u8 keyFlag=1; //程序中沒有消抖處理,只是簡易的按鍵進出自鎖標志
led0=ledon; //先打開0號燈,用於和7號燈對比亮度
initT0(1,10,grading); //1毫秒的基本定時,亮的時間1*10毫秒,暗1*(grading-10)毫秒
while(1)
{
if(0==keyS3)
{
if(keyFlag) //防止一次按鍵中多次執行
{
keyFlag=0; //清標志,類似同步鎖
if(++PWM_keyChange>grading)
{
PWM_keyChange=grading; //占空比最大100%
}
initT0(1,PWM_keyChange,grading);
}
}
else if(0==keyS4)
{
if(keyFlag)
{
keyFlag=0;
if(0==--PWM_keyChange) //占空比減小
{
PWM_keyChange=1; //最小占空比 1/20
}
initT0(1,PWM_keyChange,grading); //占空比減小
}
}
else
{
keyFlag=1; //按鍵鎖釋放標志,下一次按鍵時允許調整占空比
}
}
}

C代碼
#ifndef _MY51_H
#define _MY51_H
#include <reg52.h>
//#include <math.h>
#include <intrins.h>
#include <stdio.h>
#include "mytype.h"

#ifndef _51LED_
#define _51LED_
#define led P1 //P1匯流排連8個led燈,燈連573鎖存器,P1置低電平點亮
#define LED led
#define ON(x) P1&(~(1<<(x))) //打開某個燈,開多個燈用 ON(m) & ON(n)
#define OFF(x) P1|(1<<(x)) //關閉某個燈,關多個燈用 OFF(m)| OFF(n)
#define on(x) ON(x) //包含大小寫
#define off(x) OFF(x)

#define ledon 0 //某個燈,打開
#define ledoff 1 //某個燈,關閉

sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit ledLock=P2^5; //鎖定當前8個led的狀態,0鎖定 ,1不鎖定

#endif

/*************二進制輸入宏****************************/
#ifndef _LongToBin_
#define LongToBin(n) \
( \
((n >> 21) & 0x80) | \
((n >> 18) & 0x40) | \
((n >> 15) & 0x20) | \
((n >> 12) & 0x10) | \
((n >> 9) & 0x08) | \
((n >> 6) & 0x04) | \
((n >> 3) & 0x02) | \
((n ) & 0x01) \
)
#define bin(n) LongToBin(0x##n##l)
#define BIN(n) bin(n)
#define B(n) bin(n)
#define b(n) bin(n)
#endif

/*************單個數據位的置位宏*********************/
#ifndef _BIT_
#define BIT(n) (1<<n)
#define bit(n) BIT(n)
#endif

#define high 1 //高電平
#define low 0 //低電平

sbit beep=P2^3; //蜂鳴器

extern void delayms(u16 ms);
extern void delayXus(u8 us); //函數執行(8+6x)個機器周期, 即t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////

#endif

C代碼
#ifndef _TIMER0_H
#define _TIMER0_H
#include "my51.h"

extern u8 timeMultiple1Flag; //中斷時間復用置位標志,須手動清零
extern u8 timeMultiple2Flag; //中斷時間復用置位標志,須手動清零
extern void T0_work(); //該函數未實現,需外部實現
extern void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) ; //定時器初始化

#endif

C代碼
#include "timer0.h"

u8 TH0Cout=0 ; //初值
u8 TL0Cout=0 ;
u16 T0IntCouts1=0; //中斷計數
u16 T0IntCouts2=0; //中斷計數
u16 timeMultiple1=0; //中斷復用時間的倍數
u16 timeMultiple2=0; //中斷復用時間的倍數
u8 timeMultiple1Flag=0; //中斷時間復用置位標志,須手動清零
u8 timeMultiple2Flag=0; //中斷時間復用置位標志,須手動清零

//開啟定時器,定時完成後需要手動關閉TR0,否則將循環定時
//參數一是定時的毫秒數,參數二和三是定時基時的倍率數(定時復用)
void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) //定時器初始化設定,ms取值不超過65
{
u16 N=11059.2*ms/12; //定時器總計數值
TR0=STOP; //停掉定時器
ET0=CLOSE; //關定時器中斷

//對於110592晶振,ms為5的整數倍時沒有計算誤差,但ms最大不超過71毫秒
TH0Cout =(65536-N)/256; //裝入計時值零頭計數初值
TL0Cout =(65536-N)%256;
if(0==t_multiple1) //0倍的基準時間是不合理的,至少1倍
{
t_multiple1=1;
}
if(0==t_multiple2) //0倍的基準時間是不合理的,至少1倍
{
t_multiple2=1;
}
timeMultiple1=t_multiple1; //倍時
timeMultiple2=t_multiple2; //倍時
TMOD &= 0xf0; //清定時器0配置
TMOD |= 0x01; //配置定時器0的工作方式為1

EA =OPEN; //打開總中斷
ET0=OPEN; //打開定時器中斷

TH0=TH0Cout; //定時器裝入初值
TL0=TL0Cout;
TR0=START; //啟動定時器
}
void T0_times() interrupt 1 //T0定時器中斷函數
{
TH0=TH0Cout; //重裝初值
TL0=TL0Cout;
if(++T0IntCouts1==timeMultiple1) //判斷是否復用定時器
{
T0IntCouts1=0; //中斷次數清零,重新計時
timeMultiple1Flag=1; //復用定時器標志,須在T0_work()中手動清零
}
if(++T0IntCouts2==timeMultiple2) //判斷是否復用定時器
{
T0IntCouts1=0; //這個也要清,防止到達最小公倍數時亂掉
T0IntCouts2=0; //中斷次數清零,重新計時
timeMultiple2Flag=1; //復用定時器標志,須在T0_work()中手動清零
}
T0_work(); //調用工作函數
}

閱讀全文

與51單片機可以匯編自鎖嗎相關的資料

熱點內容
為什麼不把伺服器放在太空 瀏覽:144
原理圖pdf 瀏覽:770
歐姆龍編程軟體cxone 瀏覽:144
伺服器如何查我的電腦 瀏覽:94
程序員回長沙要轉行 瀏覽:716
現在拉拉貨用哪個app 瀏覽:587
歐姆龍編程軟體95 瀏覽:988
英語的命令 瀏覽:762
智慧美業系統小程序源碼 瀏覽:951
安卓手機低電量提示不提示了怎麼辦 瀏覽:31
怎樣清理文件夾的內容 瀏覽:353
哆啦a夢百度雲解壓密碼 瀏覽:403
如何調取伺服器信息 瀏覽:336
命令行刪除軟體 瀏覽:592
華為伺服器現在用什麼代工 瀏覽:144
如何拆解伺服器風扇 瀏覽:137
家庭智能伺服器怎麼設置 瀏覽:757
音頻壓縮器 瀏覽:307
蘋果平板怎麼下兩個同一個app 瀏覽:377
臨床數據程序員 瀏覽:72