『壹』 單片機設計
首先要清楚你要做一個什麼樣的產品,這個產品包含哪些功能,要採集哪些信號?要控制哪些設備?要走哪些通訊協議?通訊協議走什麼介面?是不是要顯示界面?是不是要聲光提示?是不是要低功耗?清楚了這些需求以後就可以選型了。
比如說我要做一個單片機密碼鎖,要求:
1. 有4位數碼管顯示;
2. 控制一個繼電器;
3. 控制一個蜂鳴器;
4. 控制五個LED燈;
5. 兩個按鍵輸入;
2 晶元選型
根據你的需求來確定所選晶元型號。如第一部分的功能需求,這5個需求都只需要用到單片機的IO口,沒有用到片上資源,所以只要IO口夠用就可以了。
1. 4位數碼管:為了方便大家學習,這里選用74HC595來驅動,該晶元與單片機相連只需要3個IO口;
2. 控制一個繼電器;這個地方主要考慮線圈電壓,單片機是5V供電,所以選用5V的繼電器,佔用1個IO口;
3. 控制蜂鳴器:選用有源蜂鳴器,即只要給電蜂鳴器就發聲,佔用1個IO口;
4. 控制5個LED燈:採用灌電流的方式,佔用5個IO口;
5. 兩個按鍵輸入:採用上拉電阻,按下低電平實現,佔用2個IO口;
總共用了3+1+1+5+2=12個IO口;為了方便初學者,那我們就選用STC的51單片機來完成這個設計吧,所選型號為STC89C51,封裝形式為DIP40,相信大家在大學里學單片機的時候老師都是用這一款教的吧。
3 硬體原理設計
晶元選型完畢之後,又有了設計思路,那就趕快把電路圖畫出來吧。畫電路圖用什麼軟體呢?這樣的EDA工具很多,像Protel99se、DXP、Altium Designer 等,這些都是軟體都是一家出的,還有Cadence、PowerPcb等。本人用的是AD09。原理圖設計的內容是什麼呢?設計的內容包括單片機的最小系統、還有擴展出來的功能。
4 硬體PCB設計
當原理圖畫完,並且檢查沒有錯誤後,就開始畫PCB吧,什麼是PCB?PCB就是電路板,什麼是電路板,就像下圖這樣的:
50171510883016
這是焊接之前的電路板,PCB文件設計好後,發給廠家去打樣製版,做回來的就是這樣的電路板。上圖中的電路板用的都是直插元件。什麼是直插元件,什麼是貼片元件?這就設計到元器件的封裝問題了。
如果大家感興趣,我明後天把畫pcb板的過程推送給大家。
5 樣板焊接
什麼是樣板焊接?就是把電子元器件焊接在pcb板上。如果封裝簡單、樣板數量少那完全可以自己動手焊接了,順便也鍛煉一下自己的焊接水平,對於一個搞電的人而言,一般都是從焊電路板過來的。如果搞電但不會焊接,別人會笑話你的。
6 調試程序
程序該怎麼寫?用什麼工具寫?不同的單片機有不同的編程環境,比如PIC單片機使用MPLAB編程環境,MSP430單片機使用IAR Embedded Workbench編程環境,DSP使用CCS編程環境。這里重點介紹的編程環境是Keil,Keil是目前所有編程環境中最好用的,也是支持晶元最多的,可以說Keil是目前最主流的編程環境,本人使用的是Keil的編程環境,Keil的C51版本和MDK版本都在用。
7 程序燒錄
程序燒錄的意思就是把寫好的程序下載到單片機里,這樣單片機才會按照用戶編寫的程序來執行命名、實現功能。程序要怎麼樣才能燒寫到單片機中去呢?每種單片機都有各自的程序燒錄介面。
『貳』 51單片機接入乙太網的幾種方案
1、MAC+PHY方案
所謂的TCP/IP協議棧是一系列網路協議的統稱,不僅包括我們熟知的TCP協議和IP協議。
還有網路層的ICMP(Internet控制報文)協議、IGMP(Internet組管理)協議、ARP(地址解析)協議,傳輸層的UDP(用戶數據包)協議,應用層的HTTP(超文本傳輸)協議、DNS(域名解析)協議、FTP(文件傳送)協議、SMTP(簡單郵件管理)協議等等。
傳統的乙太網接入方案由MCU+MAC+PHY再加入網路介面實現乙太網的物理連接,通過在主控晶元中植入TCP/IP協議代碼實現通信及上層應用。
應用這種軟體TCP/IP協議棧方式實現的比較成熟方案有ENC28J60,CS8900A,DM9000,當然也有像STM32F107這類(內部自帶MAC)+PHY等方案。
2、硬體協議棧晶元方案
由MCU+硬體協議棧晶元(內含MAC和PHY)直接加網路介面,便可方便的實現單片機聯網,所有的處理TCP/IP協議的工作都是通過這位MCU的「小秘書」——硬體協議棧晶元來完成。
乙太網晶元的內核由傳輸層的TCP、UDP、ICMP、IGMP等協議、網路層的IP、ARP、PPPoE等協議以及鏈路層的MAC構成,再加上物理層的PHY和外圍的寄存器、內存、SPI介面組成了這一整套硬體化的乙太網解決方案。
這套硬體TCP/IP協議棧代替了以往的MCU來處理這些中斷請求,即MCU只需要處理面向用戶的應用層數據即可,傳輸層、網路層、鏈路層及物理層全部由外圍WIZnet的晶元完成。
這套方案從硬體開銷和軟體開發兩個方面來簡化前面所述的五層網路模型,簡化產品開發方案。這樣一來,工程師們就不必再面對繁瑣的通信協議代碼,只需要了解簡單的寄存器功能以及Socket編程便能完成產品開發工作的的網路功能開發部分。
(2)單片機方案擴展閱讀
乙太網協議:
一個標準的乙太網物理傳輸幀由七部分組成。
PR SD DA SA TYPE DATA FCS
同步位 分隔位 目的地址 源地址 類型欄位 數據段 幀校驗序列 7 1 6 6 2 46~1500 4
除了數據段的長度不定外,其他部分的長度固定不變。數據段為46~1500位元組。乙太網規定整個傳輸包的最大長度不能超過1514位元組(14位元組為DA、SA、TYPE),最小不能小於60位元組。
除去DA、SA、TYPE14位元組,還必須傳輸46位元組的數據,當數據段的數據不足46位元組時需填充,填充字元的個數不包括在長度欄位里;超過1500位元組時,需拆成多個幀傳送。
事實上,發送數據時,PR、SD、FCS及填充欄位這幾個數據段由乙太網控制器自動產生;而接收數據時,PR、SD被跳過,控制器一旦檢測到有效的前序欄位(即PR、SD),就認為接收數據開始。
『叄』 單片機 求 方案
這是一個利用溫感DB18B20做的溫控系統!程序跟電路如下:系統描述:在LCD1602上實時顯示時鍾,溫度,濕度,系統運行時間。利用ds18b20
檢測當前溫度,通過和設定參數的比較,給ISD1420發出報警脈沖,通過
功率放大器LM386 驅動喇叭報警。
*************************************************************************/#include<reg51.h>
#include<intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int#define BUSY 0x80 //lcd忙檢測標志
#define DATAPORT P0 //定義P0口為LCD通訊埠
#define PLAYE_ADDR XBYTE[0XBFFF] //語音報警地址sbit RED_ALARM=P1^0; //紅色指示燈
sbit WRITE_ALARM=P1^1; //白色指示燈
sbit GREEN_ALARM=P1^2; //綠色指示燈
sbit P1_4=P1^4; //時鍾調整
sbit P1_5=P1^5; //時鍾加
sbit P1_6=P1^6; //時鍾減sbit DQ = P1^7; //定義ds18b20通信埠
sbit LCM_RS=P2^0; //數據/命令端
sbit LCM_RW=P2^1; //讀/寫選擇端
sbit LCM_EN=P2^2; //LCD使能信號
sbit ad_busy=P3^2; //adc中斷方式介面
sbit RECLED_EOC=P3^5; //ISD1420放音結束查詢標志
sbit OUT=P3^7;uchar ad_data; //ad采樣值存儲
uchar seconde=0; //定義並初始化時鍾變數
uchar minite=0;
uchar hour=12;
uchar mstcnt=0;
uchar temp1,temp2,temp; //溫度顯示變數
uchar t,set;
uchar T;
bit ON_OFF;
bit outflag;uchar code str0[]={"--- : : ---OF"};
uchar code str1[]={"SET: C SA: . C"};void delay_LCM(uint); //LCD延時子程序
void initLCM( void); //LCD初始化子程序
void lcd_wait(void); //LCD檢測忙子程序
void WriteCommandLCM(uchar WCLCM,uchar BusyC); //寫指令到ICM子函數
void WriteDataLCM(uchar WDLCM); //寫數據到LCM子函數
void DisplayOneChar(uchar X,uchar Y,uchar DData); //顯示指定坐標的一個字元子函數
void DisplayListChar(uchar X,uchar Y,uchar code *DData); //顯示指定坐標的一串字元子函數
void init_timer0(void); //定時器初始化
void displayfun1(void);
void displayfun2(void);
void displayfun3(void);
void displayfun4(void);
void keyscan(void ); //鍵盤掃描子程序
void set_adj(void);
void inc_key(void);
void dec_key(void);
void delay_18B20(unsigned int i);
void Init_DS18B20(void) ;
uchar ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void ReadTemperature(void);
void ad0809(void);
void playalarm(void);
/*********延時K*1ms,12.000mhz**********/void delay_LCM(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<60;j++)
{;}
}
}
/**********寫指令到ICM子函數************/void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
if(BusyC)lcd_wait();
DATAPORT=WCLCM;
LCM_RS=0; // 選中指令寄存器
LCM_RW=0; // 寫模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}/**********寫數據到LCM子函數************/void WriteDataLCM(uchar WDLCM)
{
lcd_wait( ); //檢測忙信號
DATAPORT=WDLCM;
LCM_RS=1; // 選中數據寄存器
LCM_RW=0; // 寫模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}/***********lcm內部等待函數*************/void lcd_wait(void)
{
DATAPORT=0xff;
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
while(DATAPORT&BUSY)
{ LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}
LCM_EN=0;
}/**********LCM初始化子函數***********/void initLCM( )
{
DATAPORT=0;
delay_LCM(15);
WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
delay_LCM(5);
WriteCommandLCM(0x38,0);
delay_LCM(5);
WriteCommandLCM(0x38,0);
delay_LCM(5); WriteCommandLCM(0x38,1); //8bit數據傳送,2行顯示,5*7字型,檢測忙信號
WriteCommandLCM(0x08,1); //關閉顯示,檢測忙信號
WriteCommandLCM(0x01,1); //清屏,檢測忙信號
WriteCommandLCM(0x06,1); //顯示游標右移設置,檢測忙信號
WriteCommandLCM(0x0c,1); //顯示屏打開,游標不顯示,不閃爍,檢測忙信號
}/****************顯示指定坐標的一個字元子函數*************/void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=1;
X&=15;
if(Y)X|=0x40; //若y為1(顯示第二行),地址碼+0X40
X|=0x80; //指令碼為地址碼+0X80
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}/***********顯示指定坐標的一串字元子函數***********/void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
uchar ListLength=0;
Y&=0x01;
X&=0x0f;
while(X<16)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}/***********ds18b20延遲子函數(晶振12MHz )*******/ void delay_18B20(unsigned int i)
{
while(i--);
}/**********ds18b20初始化函數**********************/void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復位
delay_18B20(8); //稍做延時
DQ = 0; //單片機將DQ拉低
delay_18B20(80); //精確延時 大於 480us
DQ = 1; //拉高匯流排
delay_18B20(14);
x=DQ; //稍做延時後 如果x=0則初始化成功 x=1則初始化失敗
delay_18B20(20);
}/***********ds18b20讀一個位元組**************/ unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}/*************ds18b20寫一個位元組****************/ void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}/**************讀取ds18b20當前溫度************/void ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0; Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換 delay_18B20(100); // this message is wery important Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度 delay_18B20(100); a=ReadOneChar(); //讀取溫度值低位
b=ReadOneChar(); //讀取溫度值高位
temp1=b<<4;
temp1+=(a&0xf0)>>4;
temp2=a&0x0f; temp=((b*256+a)>>4); //當前採集溫度值除16得實際溫度值
}/***************液晶顯示子函數1正常顯示*****************/void displayfun1(void)
{
WriteCommandLCM(0x0c,1); //顯示屏打開,游標不顯示,不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0x30); //液晶上顯示小時
DisplayOneChar(4,0,hour%10+0x30); DisplayOneChar(6,0,minite/10+0x30); //液晶上顯示分
DisplayOneChar(7,0,minite%10+0x30);
DisplayOneChar(9,0,seconde/10+0x30); //液晶上顯示秒
DisplayOneChar(10,0,seconde%10+0x30); DisplayOneChar(4,1,T/10+0x30); //液晶上顯示設定的溫度
DisplayOneChar(5,1,T%10+0x30);
DisplayOneChar(11,1,temp1/10+0x30); //液晶上顯示測得的溫度
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30); if(ON_OFF==0) //若溫控標志為0
{
DisplayOneChar(14,0,0x4f); // 液晶上顯示不控溫的標志
DisplayOneChar(15,0,0x46);
}
else
{
DisplayOneChar(14,0,0x4f); // 液晶上顯示控溫的標志
DisplayOneChar(15,0,0x4e);
if(outflag==1)
DisplayOneChar(0,0,0x7c);
else
DisplayOneChar(0,0,0xef);
}
}
/************液晶顯示子函數2***************/void displayfun2(void)
{
WriteCommandLCM(0x0c,1); //顯示屏打開,游標不顯示,不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(6,0,minite/10+0x30);
DisplayOneChar(7,0,minite%10+0x30);
DisplayOneChar(9,0,seconde/10+0x30);
DisplayOneChar(10,0,seconde%10+0x30); DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30); WriteCommandLCM(0x0f,1); //顯示屏打開,游標顯示,閃爍,檢測忙信號
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
}/**************液晶顯示子函數3*****************/void displayfun3(void)
{
WriteCommandLCM(0x0c,1); //顯示屏打開,游標不顯示,不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30); DisplayOneChar(9,0,seconde/10+0x30);
DisplayOneChar(10,0,seconde%10+0x30); DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30); DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30);
WriteCommandLCM(0x0f,1); //顯示屏打開,游標顯示,閃爍,檢測忙信號
DisplayOneChar(6,0,minite/10+0x30);
DisplayOneChar(7,0,minite%10+0x30);}/**************液晶顯示子函數4 *****************/void displayfun4(void)
{
WriteCommandLCM(0x0c,1); //顯示屏打開,游標不顯示,不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30); DisplayOneChar(6,0,minite/10+0x30);
DisplayOneChar(7,0,minite%10+0x30); DisplayOneChar(9,0,seconde/10+0x30);
DisplayOneChar(10,0,seconde%10+0x30);
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30);
WriteCommandLCM(0x0f,1); //顯示屏打開,游標顯示,閃爍,檢測忙信號
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);}/**************鍵盤掃描子函數******************/void keyscan(void)
{
uchar xx; //局部變數
P1=0xff;
if(P1!=0xff)
{
delay_LCM(30);
if(P1!=0xff)
{
xx=P1;
『肆』 單片機硬體方案怎麼寫
1、列出你的需求方案。
2、根據需求分析建立你的硬體方案。
3、硬體實現過程。
『伍』 求單片機開發方案
我有的,加我
『陸』 單片機的替代方案
高級單片機,arm內核有很多32位(
stm32
、ti的430系列等等)的,很多現成的帶顯示器、觸摸屏的
開發板
淘寶有賣。
『柒』 單片機低功耗有什麼好方案
找低功耗單片機.
找不到就採用間歇工作的方法.
『捌』 單片機控制LED方案
支持zhang_xin_gui3 你可以用8個口接8個三極體做行驅動再用相同的辦法做8個列驅動 這樣只用16個口即可控制8*8=64個led 而且只用了16個三極體 用8050或8550應該就可以 成本也很低
『玖』 求單片機科技製作的方案
石家莊英達單片機培訓開發中心成立於2005年,中心以優質的服務,良好的合作空間,一流的技術水平.服務於電子行業各個領域.承各界朋友的大力支持,取得了輝煌的成績.中心致力於以下幾個方面工作:
1、承接各種單片機產品開發、電路設計、上位機軟體開發
2、單片機系統應用培訓(包括單片機程序設計和電路製作)
地 址: 石家莊市裕華
『拾』 誰幫我規劃一個學習單片機的方案
兩種學習思路;
我剛學完單片機,我就說說我導師教我我們的思路吧,首先用AT89S52上手,這是最簡單,也是新手最容易上手的。價格便宜,我們學校批量購買就七八塊錢一片,零售估計也貴不到哪去。首先搞清以它構成的小系統板的原理圖,這是學習的一切前提(你要可以告訴我郵箱,我發給你,還有編程軟體,下載軟體,LED流水燈,8LED字數碼管程序實例等一些程序)編程軟體我用的keil3,下載用的Progisp,等到你能用LED8字數碼管編出一個時鍾程序時,單片機你就入門了。再接著用STC12C5410AD繼續深一步學習,現在多說無益,等你入門後自己自然就找到感覺了,而且STC有自己專用的STC下載軟體。
另一個學習思路就是:買一本配有光碟的單片機書,郭天祥的《51單片機C語言教程》是個不錯的選擇,裡面有教學視屏,有軟體,當然你就可以買他教學的配套系統版學習了,三百多,我有幾個同學是這樣學的,效果不錯。
我覺得已經說得夠實際夠具體了,希望能幫到。