Ⅰ C51單片機多機通信C語言
單片機a,b,c.a為主機,bc為從機。a上有一個外部中斷0輸入,按第一次a的兩個LED亮500ms,再按一下,b機的兩個LED燈亮500ms,第三次按下c機的兩個LED燈亮500ms,然後周而復始。兩個數碼管分別顯示0/1/2,和abc(bc由從機反饋)
/*
主從通信基本步驟:
1.主機從機初始化為方式2或者3,從機都置SM2=1,允許中斷
2.主機置TB8=1,發送從機地址
3.所有從機均接收主機發送要定址的從機地址
4.被定址的從機確認地址後,置本機SM2=0,向主機返回地址,供主機核對
5.核對無誤後,主機向被定址的從機發送命令,通知從機接受或者發送數據。
6.本次通信結束後,主從機重置SM2=1,主機可再對其他從機定址
*/
******************************************************************
主機a:
******************************************************************
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharleddata[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00};
ucharMode;
sbitP10=P1^0;
sbitP13=P1^3;
sbitP17=P1^7;
sbitP20=P2^0;
sbitP21=P2^1;
voidUART_init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0xd0;
ES=1;
EX0=1;
IT0=1;//INT0下跳觸發
EA=1;
TI=0;
}
voidDelayMs(intms)
{
uchari;
while(ms--)
for(i=0;i<120;i++);
}
voidputc_to_SerialPort(ucharc)
{
SBUF=c;
while(TI==0);
TI=0;
}
voidMasterControl(unsignedcharAddr,unsignedcharComd)
{
TB8=1;
putc_to_SerialPort(Addr);
DelayMs(50);
TB8=0;
putc_to_SerialPort(Comd);
DelayMs(50);
}
Ex0_int(void)interrupt0
{
P0=leddata[Mode];
P20=0;
if(Mode==0)
{
P2=leddata[10];
P10=0;
P13=0;
DelayMs(500);
P10=1;
P13=1;
//MasterControl('b','C');
//MasterControl('c','C');
}
elseif(Mode==1)
{
P10=1;
P13=1;
MasterControl('b','O');
//MasterControl('c','C');
}
elseif(Mode==2)
{
P10=1;
P13=1;
//MasterControl('b','C');
MasterControl('c','O');
}
Mode=(Mode+1)%3;
}
com_int(void)interrupt4
{
if(RI)
{
RI=0;
if(SBUF=='b')
{
P2=leddata[11];
}
if(SBUF=='c')
{
P2=leddata[12];
}
}
}
voidmain(void)
{
P0=0x00;
P1=0xff;
P2=0x00;
UART_init();
Mode=0;
while(1);
}
******************************************************************
從機b:
******************************************************************
#include<reg51.h>
#defineucharunsignedchar
ucharRecData;
sbitP10=P1^0;
sbitP13=P1^3;
voidUART_init()
{
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0xf0;
ES=1;
PS=1;
EA=1;
}
voidDelayMs(intms)
{
uchari;
while(ms--)
for(i=0;i<120;i++);
}
voidputc_to_SerialPort(ucharc)
{
SBUF=c;
while(TI==0);
TI=0;
}
com_int(void)interrupt4
{
if(RI)
{
RecData=SBUF;
RI=0;
if(RB8==1)//地址
{
if(RecData=='b')//是自己的地址,置SM2=0,准備接受數據
{
SM2=0;
putc_to_SerialPort('b');
}
else//不是自己的地址
{
SM2=1;
}
}
if(RB8==0)//數據
{
if(RecData=='O')
{
P10=0;
P13=0;
DelayMs(500);
P10=1;
P13=1;
}
if(RecData=='C')
{
P10=1;
P13=1;
}
SM2=1;
}
}
}
voidmain(void)
{
P0=0xff;
P1=0xff;
UART_init();
while(1);
}
******************************************************************
從機c:
******************************************************************
#include<reg51.h>
#defineucharunsignedchar
ucharRecData;
sbitP10=P1^0;
sbitP13=P1^3;
voidUART_init()
{
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0xf0;
ES=1;
PS=1;
EA=1;
}
voidDelayMs(intms)
{
uchari;
while(ms--)
for(i=0;i<120;i++);
}
voidputc_to_SerialPort(ucharc)
{
SBUF=c;
while(TI==0);
TI=0;
}
com_int(void)interrupt4
{
if(RI)
{
RecData=SBUF;
RI=0;
if(RB8==1)//地址
{
if(RecData=='c')//是自己的地址,置SM2=0,准備接受數據
{
SM2=0;
putc_to_SerialPort('c');
}
else//不是自己的地址
{
SM2=1;
}
}
if(RB8==0)//數據
{
if(RecData=='O')
{
P10=0;
P13=0;
DelayMs(500);
P10=1;
P13=1;
SM2=1;
}
if(RecData=='C')
{
P10=1;
P13=1;
SM2=1;
}
}
}
}
voidmain(void)
{
P0=0xff;
P1=0xff;
UART_init();
while(1);
}
Ⅱ 在51單片機上用C語言實現電子琴功能,但同時數碼管可以顯示簡譜,怎麼編程序
1,數據管顯示就沒什麼了,找幾個簡單的數碼管驅動程序改改就可以了,一般都是先選中數碼管,然後設置值,就可以顯示了,不過需要注意刷新,10ms刷新一個應該就可以了,刷新頻率比較低的話會閃閃的,這個你應該明白。
2,蜂鳴器發do音,這個硬體實現我就不知道了,也許有硬體可以 編碼控制自動生成對應頻率的值。我想如果通過軟體實現的話,不妨考慮一下定時器。假設do音是1000Hz的頻率(沒有查,不清楚,假設的),那麼你可以控制定時器的觸發頻率為1000hz,觸發一次,對應的輸出到蜂鳴器的口的電平跳變一下,如果定時器的頻率為1000hz的話,那麼應該有500hz的頻率,一個周期需要一高一低嘛!中斷讀取按鍵信號,分析按鍵,然後設定定時器的頻率,啟動定時器,設置一個響的時間,然後到時間關閉定時器,這樣你按下k1就會發出一聲do的聲音,然後停了。
3,按鍵讀取程序,中斷或者查詢方式,自己選擇吧,別忘了延遲5ms左右再次讀取按鍵,這個是消抖的。
4,建議模塊化編程,先搞定按鍵的,然後搞定數碼管的,然後搞定定時器的,然後再考慮如何把它們組合起來。好了不說了,說得有點多了,再說會我都回到大學時代了,哈哈。總之自己一點一點的做,應該不難,51熟練,c語言熟練,板子焊接的結構比較清晰的話,很快就可以搞定的。
5,還是建議你自己寫一份各個模塊的驅動的代碼,例如按鍵的,數碼管的,led的,溫度感測器的,光敏的,蜂鳴器的,遙控器的,定時器的,中斷的,等等等等模塊(可以借鑒別人寫的,自己一定要會),然後需要的時候,過來,改改就行,快而且bug少。建議keil c語言編程,用匯編編碼太耗時了。
Ⅲ 51單片機 c語言編程 4*4矩陣鍵盤如何實現等待按鍵松開功能
1、在程序檢測到按鍵後,加個延時去抖,不要加鬆手檢測。然後執行第一個按鍵相對應的程序。然後繼續按鍵掃描。注意這里說的是繼續,也就是繼續往下檢測。否則的程序就只能執行第一個按鍵所對應的程序了。這樣,就能檢測到第二次按鍵的鍵值了。
2、常式:
ucharshaomiao()
{
ucharl,h;
P1=0xf0;//獲取高四位信息。在此低四位接到行。行低電平
l=P1|0x0f;
P1=l;//只把被按下鍵所在列置低
h=P1|0xf0;
switch(h)
{
case0xfe:h=0;break;//11111110
case0xfd:h=1;break;
case0xfb:h=2;break;
case0xf7:h=3;break;
}
switch(l)
{
case0xef:l=0;break;//11101111
case0xdf:l=1;break;
case0xbf:l=2;break;
case0x7f:l=3;break;
}
P1=0xf0;
/******關鍵問題解決如下******/
while(P1!=0xf0)
{
while(P1!=0xf0);//等待放開按鍵
delayms(50);//防止抖動
}
return(h*4+l);
}
Ⅳ 51單片機是什麼如何學習它的編程都用在哪些方面
51單片機是對所有兼容Intel 8031指令系統的單片機的統稱。
由於intel生產的8031的升級版8051工藝成熟,成為當時市場應用量最大的單片機,所以對此類兼容晶元統稱51單片機。
該系列單片機的始祖是Intel的8031單片機,後來隨著Flash rom技術的發展,8031單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用於工業測控系統之中。很多公司都有51系列的兼容機型推出,今後很長的一段時間內將佔有大量市場。51單片機是基礎入門的一個單片機,還是應用最廣泛的一種。
現在每年仍舊會使用幾十億片51系列的兼容晶元,在你想得到的電器、玩具上,比如:遙控燈具、洗衣機、冰箱、電子鍾表、顯示器、汽車(每輛汽車可能會用到十幾到幾十片)。。。。。
學習它很簡單,到當地書店、圖書館、隨手可以找到幾十種單片機入門書,8成以上是講51系列單片機的。
----------------
學習編輯
作為一個初學者,如何單片機入門?
知識上,其實不需要多少東西,會簡單的C語言,知道51單片機的基本結構就可以了。一般的大學畢業生都可以了,自學過這2門課程的高中生也夠條件。設備上,一般是建議購買一個模擬器,例如,的「雙功能下載線」就具有良好的穩定性和較快的下載速度,上位機可擴展,可以下載更多的單片機及嵌入式晶元。通過實驗,這樣才可以進行實際的,全面的學習。日後在工作上,模擬器也大有用處。還有,一般光有模擬器是不行,還得有一個實際的電路,即學習板,如圖,即為,單片機最小系統。
學習板以強大的介面為主,單片機的學習分兩方面,一方面是單片機的原理及內部結構,另一方面是單片機的介面技術。這些都是需要平時多積累,多動手,多思考,這樣才能學好單片機技術。
註:「雙功能下載線」在網路文庫里有詳細的使用說明,並且上位機會定期更新以支持更多的單片機。
單片機學習的4個階段
一、整體了解
要知道 單片機是什麼?單片機有何用?如何系統學習單片機?單片機系統設計的流程是怎樣的,需要掌握哪些輔助軟體?
了解這些之後,我們的學習就有了目標和方向。
二、揭秘單片機很難學,是因為其內部結構、編程語言抽象,且實際應用中與其他電子技術和元器件知識相互關聯,需結合起來一起設計開發產品。所以,第二階段要了解單片機的內部結構是怎樣的?單片機開發經常會用到哪些電子技術和元器件知識?如何將一條條編程指令組合成一段段有效的程序?
三、解密之所以單片機能成為控制核心,設計出包羅萬象的應用系統來,是因為開發者利用了單片機提供的種種功能及各種外設。所以,第三階段我們要掌握單片機的各種功能,再加上諸如感測器、模數轉換、掃描顯示、串列、中斷的應用思維,結合更多的元器件、電子電路知識,逐個學習、體會實際的單片機系統的秘密。
四、遠航通過以上三個階段,讀者基本就可掌握單片機的應用了。但要設計出豐富的單片機系統,解決復雜的實際問題,還需要了解更多的外設知識及其與單片機的聯系(如電動機、各類
存儲器、繼電器、紅外管等)。這些需要不斷的學習和積累。有時候,接到一些開發任務,就需要你針對這個任務自覺地去搜集、學習相關知識,在實踐中不斷載學習和提高。
參考網路:http://ke..com/link?url=
Ⅳ 51單片機的優先順序怎麼用C語言怎麼寫
有些單片機的中斷優先順序在默認的情況下是確定的,不需要設置,例如51單片機,其優先順序從高到低以及向量地址是:00H 復位中斷 優先順序0(最高)03H 外部中斷0 10BH 定時器0 213H 外部中斷1 31BH 定時器1 423H 串口 5單片機在運行時,當發生中斷時,CPU會自動把相應的中斷向量地址裝載到PC中,也就是程序會自動跑到相應中斷的向量地址上面去。例如發生定時器0中斷,在發生中斷前PC的值不管多少,一發生中斷,PC的值就會變成0BH。在執行完中斷服務程序後會返回到發生中斷時的程序地址。所以,相應的中斷服務程序必須寫在對應的中斷向量的地址,但是由於兩個相鄰向量的地址之間的間隔太小,不能放下太多的指令,所以在用匯編寫程序的時候一般是在其向量地址上面放一條跳轉指令,而正真的中斷服務程序寫在別的地方。例如:ORG 0BH;定時器0中斷向量地址 LCALL TIMER0;跳轉到真正的中斷服務程序。...... ;其他主程序TIMER0: ;真正的中斷服務程序 ..........RETI ;返回到主程序而用C語言就更簡單了,把中斷服務程序就是一個函數,不過這個函數加個interrupt的關鍵字來修飾就是了。而interrupt後面加的是個中斷的中斷號。由於復位中斷的發生是不可逆的,發生後不可能再返回到發生中斷之前。所以復位中斷沒有服務程序,也就沒有中斷號。各個中斷的中斷號就是上表中的優先順序再減1。例如定時器0的中斷函數。void Timer0(void) interrupt 1{// add your code} 各個中斷的優先順序是在上面那個表中,從上到小依次降低的。高優先順序的中斷可以打斷低優先順序的中斷,同等級的中斷不能相互打斷。不過通過設置IP寄存器的值,可以改變中斷的優先順序。例如我想把定時器0的優先順序設置得比外部0高,我就把IP寄存器中的PT0位設置為1,其他位為0就可以了。
Ⅵ 大家幫忙找一些51單片機的基本C語言程序例子,最好帶說明,謝啦
中斷控製程序:
#include <AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
#define port_count P2 //P2接8LED介面
//將計數器的二進制值用8個LED顯示出來
uchar count;//計數器(存儲中斷次數)
void main(void)
{
count=0; //清零計數器
port_count=~count;//清零P2口
IT0=1; //INT0設為邊沿觸發方式�IT0=0則為電平觸發方式
EX0=1; //開INT0中斷
EA=1; //開系統中斷
while(1); //等待中斷處理
}
//INT0中斷處理函數
void int0_interrupt() interrupt 0 //INT0中斷號0
{
count++;
port_count=~count; //當達到255時,溢出,又從0開始
}
I/O控製程序:
#include <AT89X52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define flowlight P2
void delay10ms()
{uchar a,b;
for(a=200;a>0;a--)
for(b=225;b>0;b--);
}
void main()
{
uchar flag=0;//判斷移動方向 flag==0 左移 flag==1 右移
uchar port_state=0x01;
flowlight=~port_state;
while(1)
{
delay10ms();
if(port_state==0X80&&flag==0)
{
flag=1; //流水燈左移到第八位又移回來 ~1000 0000
}
else
if(port_state==0X01&&flag==1)
{
flag=0; //流水燈右移到第1位又移回來 ~0000 0001
}
if(flag==0)
{
port_state=port_state<<1;
flowlight=~port_state;
}
else
{
port_state=port_state>>1;
flowlight=~port_state;
}
}
串口通信程序:
主機程序:
#include <AT89X52.H>
#define NODE_ADDR 3 //目的節點地址
#define COUNT 10 //發送緩沖區buffer大小
typedef unsigned char uchar;
uchar buffer[COUNT]; //定義buffer
int pt; //設置指針
main()//////////////////////////////////////////發送程序
{
//buffer初始化
pt=0;
while(pt<COUNT)
{
buffer[pt]='1'+pt; //[buffer]=0X31,[buffer+1]= 0X32,[buffer+2] 0X33........
pt++;
}
////初始化串口和T1(波特率發生器)/////////PCON預設為0
PCON=0X00;
SCON=0Xc0; //SCON=1100 0000B,置串口為方式3, SM2=0,REN=0,主機不接收地址幀
TMOD=0X20; //20H=0010 0000B,置T1為方式2,TR1控制T1的開關,定時器方式
TH1=253;TL1=253; //方式2為自動重裝///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //啟動T1
ET1=0; //關T1中斷 由於自動重裝
ES=1; //開串口中斷
EA=1; //開系統中斷
pt=0;
///////////////發送地址幀
TB8=1; //地址幀標志
SBUF=NODE_ADDR; //發送目的節點地址
while(pt<COUNT); //等待發送完全部數據
while(1);//不執行任何操作
} //end main
/////發送完中斷函數
void send()interrupt 4
{
TI=0; //清發送中斷標志
if(pt<COUNT)
{
//發送一幀數據
TB8=0;//數據幀標志
SBUF=buffer[pt]; //啟動發送
pt++;//指針指向下一單元
}
else
{
ES=0; //關串口中斷
EA=0; //關系統中斷
return; //若發送完則停止發送並返回
}
}
接收程序:
#include<reg52.h>
#define uchar unsigned char
#define NODE_ADDR 3 //本機節點地址
#define COUNT 10 //定義接收緩沖區buffer大小
uchar buffer[COUNT]; //定義buffer
int pt; //當前位置指針
void send_char_com(unsigned char ch); //向串口發送一個字元的函數聲明
void delay(void);
main() ////////////////串列非同步從機接收程序
{
PCON=0X00; //初始化串口和T1(波特率發生器)/////////PCON預設為0
SCON=0XF0; //SCON=1111 0000B,方式3,SM2=1,REN=1,允許接收地址幀
TMOD=0X20; //20H=0010 0000B,置T1為方式2,TR1控制T1的開關,定時器方式
TH1=253;TL1=253; //方式2為自動重裝///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //啟動T1
ET1=0; //關T1中斷 由於自動重裝
ES=1; //開串口中斷
EA=1; //開系統中斷
pt=0;
while(pt<COUNT); //等待接收地址幀和全部數據幀
delay() ;
//接收完後返回數據
SCON=0XC0; //SCON=1100 0000B,置串口為方式3, SM2=0,REN=0,主機不接收地址幀
EA=0;
for(pt=0;pt<COUNT;pt++)
{
send_char_com(buffer[pt]);
}
while(1);
} //end main
///////////串口接收中斷函數
void receive()interrupt 4 using 3
{
RI=0; //清除接收中斷標志
if(RB8==1) //地址幀
{//若為本機地址,則置SM2=0,以便接收數據
if(SBUF==NODE_ADDR)
{
SM2=0;
}
}
/////RB8=0,數據幀
else if(RB8==0)
{buffer[pt]=SBUF; //數據幀送buffer
pt++;
if(pt>=COUNT)
SM2=1; //若接收完全部數據幀,則通信結束;置SM2=1,准備下一次通信
}
}
//向串口發送一個字元
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
///////////////////////////////////////////////////////////////////////////////////
void delay(void)
{uchar i=100;
while(i--);
}
Ⅶ 51單片機控制喇叭的程序(c語言)
/************************************************************************
[文件名] C51音樂程序(八月桂花)
[功能] 通過單片機演奏音樂
注意:通過了74HC14控制ULN2003 驅動晶元驅動蜂鳴器 *
/**********************************************************************/
#include <REG52.H>
#include <INTRINS.H>
//本例採用89C52, 晶振為11.0592MHZ
//關於如何編制音樂代碼, 其實十分簡單,各位可以看以下代碼.
//頻率常數即音樂術語中的音調,而節拍常數即音樂術語中的多少拍;
//所以拿出譜子, 試探編吧!
sbit Beep = P1^5 ;
unsigned char n=0; //n為節拍常數變數
unsigned char code music_tab[] ={
0x18, 0x30, 0x1C , 0x10, //格式為: 頻率常數, 節拍常數, 頻率常數, 節拍常數,
0x20, 0x40, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x10,
0x1C, 0x10, 0x18 , 0x40,
0x1C, 0x20, 0x20 , 0x20,
0x1C, 0x20, 0x18 , 0x20,
0x20, 0x80, 0xFF , 0x20,
0x30, 0x1C, 0x10 , 0x18,
0x20, 0x15, 0x20 , 0x1C,
0x20, 0x20, 0x20 , 0x26,
0x40, 0x20, 0x20 , 0x2B,
0x20, 0x26, 0x20 , 0x20,
0x20, 0x30, 0x80 , 0xFF,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x80,
0x20, 0x30, 0x1C , 0x10,
0x20, 0x10, 0x1C , 0x10,
0x20, 0x20, 0x26 , 0x20,
0x2B, 0x20, 0x30 , 0x20,
0x2B, 0x40, 0x20 , 0x15,
0x1F, 0x05, 0x20 , 0x10,
0x1C, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x30,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x40, 0x1C , 0x20,
0x20, 0x20, 0x26 , 0x40,
0x13, 0x60, 0x18 , 0x20,
0x15, 0x40, 0x13 , 0x40,
0x18, 0x80, 0x00
};
void int0() interrupt 1 //採用中斷0 控制節拍
{ TH0=0xd8;
TL0=0xef;
n--;
}
void delay (unsigned char m) //控制頻率延時
{
unsigned i=3*m;
while(--i);
}
void delayms(unsigned char a) //豪秒延時子程序
{
while(--a); //採用while(--a) 不要採用while(a--); 各位可編譯一下看看匯編結果就知道了!
}
void main()
{ unsigned char p,m; //m為頻率常數變數
unsigned char i=0;
TMOD&=0x0f;
TMOD|=0x01;
TH0=0xd8;TL0=0xef;
IE=0x82;
play:
while(1)
{
a: p=music_tab[i];
if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到結束符,延時1秒,回到開始再來一遍
else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延時100ms,繼續取下一音符
else {m=music_tab[i++], n=music_tab[i++];} //取頻率常數 和 節拍常數
TR0=1; //開定時器1
while(n!=0) Beep=~Beep,delay(m); //等待節拍完成, 通過P1口輸出音頻(可多聲道哦!)
TR0=0; //關定時器1
}
}
Ⅷ C51系列單片機的實際運用
單片機的主要應用領域
由於單片機有許多優點,因此其應用領域之廣,幾乎到了無孔不入的地步。單片機應用的主要領域有:
1) 智能化家用電器:各種家用電器普遍採用單片機智能化控制代替傳統的電子線路控制,升級換代,提高檔次。如洗衣機、空調、電視機、錄像機、微波爐、電冰箱、電飯煲以及各種視聽設備等。
2) 辦公自動化設備:現代辦公室中使用的大量通信和辦公設備多數嵌入了單片機。如列印機、復印機、傳真機、繪圖機、考勤機、電話以及通用計算機中的鍵盤解碼、磁碟驅動等。
3) 商業營銷設備:在商業營銷系統中已廣泛使用的電子稱、收款機、條形碼閱讀器、IC卡刷卡機、計程車計價器以及倉儲安全監測系統、商場保安系統、空氣調節系統、冷凍保險系統等都採用了單片機控制。
4) 工業自動化控制:工業自動化控制是最早採用單片機控制的領域之一。如各種測控系統、過程式控制制、機電一體化、PLC等。在化工、建築、冶金等各種工業領域都要用到單片機控制。
5) 智能化儀表:採用單片機的智能化儀表大大提升了儀表的檔次,強化了功能。如數據處理和存儲、故障診斷、聯網集控等。
6) 智能化通信產品:最突出的是手機,當然手機內的晶元屬專用型單片機。
7) 汽車電子產品:現代汽車的集中顯示系統、動力監測控制系統、自動駕駛系統、通信系統和運行監視器(黑匣子)等都離不開單片機。
8) 航空航天系統和國防軍事、尖端武器等領域:單片機的應用更是不言而喻。
單片機應用的意義不僅在於它的廣闊范圍及所帶來的經濟效益。更重要的意義在
於,單片機的應用從根本上改變了控制系統傳統的設計思想和設計方法。以前採用硬體電路實現的大部分控制功能,正在用單片機通過軟體方法來實現。以前自動控制中的PID調節,現在可以用單片機實現具有智能化的數字計算控制、模糊控制和自適應控制。這種以軟體取代硬體並能提高系統性能的控制技術稱為微控技術。隨著單片機應用的推廣,微控制技術將不斷發展完善。