⑴ 單片機 上位機 下位機 通信
上位機接收到的肯定也是一個數字
⑵ 什麼是上位機和下位機,單片機屬於哪個
上位機是指人可以直接發出操控命令的計算機,一般是PC,屏幕上顯示各種信號變化(液壓,水位,溫度等)。系統中起主控,主要作為系統的規劃控制,屬於決策層。
下位機是指直接控制設備獲取設備狀況的的計算機,一般是PLC/單片機之類的。具體執行層,主要完成系統規劃層下達的任務。
單片機屬於下位機。
上位機與下位機的區別:
上位機:系統中起主控,主要作為系統的規劃控制,屬於決策層。
下位機:具體執行層,主要完成系統規劃層下達的任務。
上位機是指人可以直接發出操控命令的計算機,一般是PC,屏幕上顯示各種信號變化(液壓,水位,溫度等)。
下位機是直接控制設備獲取設備狀況的計算機,一般是PLC/單片機之類的。
上位機發出的命令首先給下位機,下位機再根據此命令解釋成相應時序信號直接控制相應設備。
下位機不時讀取設備狀態數據(一般為模擬量),轉換成數字信號反饋給上位機。
簡言之如此,實際情況千差萬別,但萬變不離其宗:上下位機都需要編程,都有專門的開發系統。
參考:
上位機:http://ke..com/view/554441.htm
下位機:http://ke..com/view/1289019.htm
⑶ 做單片機軟體上位機下位機哪個更有前途
好!雖然不是很有經驗,但又有所涉及!
本人的觀點,都應當懂一點!然後才有能力精通一方向!
我在學校是學單片機上的系統開發的,學的還可以,算是比較精通了(學校)。本來覺得
差不多了,能混口飯了,,,那知道,我還空缺
上位機編程部分!
其實上位機:是用來控制
單片機系統
的,,是可以直接通過串口、tcpip
遠程式控制制
單片機的,,,使用在
條件苛刻
、人不宜
直接接觸單片機系統的
場合!!
但是,現在我工作,不做單片機系統開發,,而是.net開發,,做web(瀏覽器)、winform(窗體應用程序);;
我工作還算清閑,,於是就跟學校老師聯系,做一個
溫度遠程監控系統,,不難,,但是直接使用到.net的winform,,,於是,,現在才感覺到
是一個不小的提升,,,當時只知道
用物理按鍵
實現
單片機系統控制,,現在想來,,遠程式控制制
是一個趨勢!!
我說這么多,想說的是,兩方面你都得懂一點,,這樣才會有競爭力,,當然精力、時間有限,你只能精通一方面,,這也行,,但是,如果到時候
需要你跟
人家
做上下位機
介面
對接時,你就會發現,如果你不懂兩方面,,你將會
很不方便!!!!
首先,你需要先精通
下位機
部分,,因為1、下位機可以單獨
執行程序,可以缺少上位機;2、上位機的編程
需要考慮到
下位機
的實現難易程度,從而設計上位機介面部分。因此從這兩個方面,你都需要先精通下位機部分!
前途是相對而言的
,,任何一個方面
都很有前途,,但是
只有你兩方面都懂一點,一方面精通一點,,,這樣你才能夠統領全局,了解整個系統設計!!
當然這樣是最有前途的!
只要專心學,前途肯定是有的!!
很認真了!!!!呵呵!!可以去我空間看看!
祝你好運!
⑷ 上下位機給下位機單片機的信號,下位機能馬上收到嗎
當然能馬上收到,但是通信應該沒有問題才行.傳輸時間很短,有
感覺不到
.
⑸ 求單片機串口通信程序(下位機)
程序我給你做到這,別說其它的你還不會啊。波特率根據你的要求去設置.如果實在不明白的話,發消息給我吧
1.reg51.h頭文件可以,
2.AT89S51內部無時鍾,需外加時鍾
3.那波特率為9600b/s時,TH1和TL1的初值是不應該為FAH?
它有具體的計算公式,波特率你想是多少就是多少
4.假設你用P1口控制8個LED,低電平點亮,程序如下。首先包含intrins.h頭文件。
OK了,問題全解決了,分也該給我了吧。呵呵。
#include<reg52.h>
#define uchar unsigned char
uchar recive;
void main()
{
TMOD=0X20;
SCON=0X50;
TL1=0XF3;
TH1=0XF3;
PCON=0X80;
TR1=1;
EA=1;
ES=1;
P1=0x7f;//初始值,一個燈亮,其它都滅
while(1)
{
if(recive=='R')
LED_right();
if(recive=='L')
LED_left();
}
void es0(void) interrupt 4
(
recive=SBUF;
RI=0;
)
void LED_left(void)
{
P1=_crol_(P1,1);
//delay();調用你想要的延時這個不要說你不會啊,就是做個空循環就行
}
void LED_right(void)
{
P1=_cror_(P1,1);
//delay();
}
⑹ 什麼事下位機,和單片機電路有什麼區別
專業解答:
要理解下位機,那就要了解上位機,這只是一種概念說法。
1:上位機是指:人可以直接發出操控命令的計算機,一般是PC,屏幕上顯示各種信號變化(液壓,水位,溫度等)。
2:下位機是直接控制設備獲取設備狀況的的計算機,一般是PLC/單片機之類的。上位機發出的命令首先給下位機,下位機再根據此命令解釋成相應時序信號直接控制相應設備。下位機不時讀取設備狀態數據(一般模擬量),轉化成數字信號反饋給上位機。
⑺ 單片機modbus下位機程序怎麼編寫
這個是MODBUS控制電磁閥的一個程序。其中還有AD採集的部分。對CRC校驗用查表的方法。至於怎樣把校驗的結果拆分成高低位位元組,再發送,看程序吧。
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define Pressure P0
////////////////
/////////////////////
uchar addr;
uchar Pressure_updata;
uchar Pressure_lowdata;
/////////////////
sbit Dcf_open=P1^0;//電磁閥開啟
sbit Dcf_close=P1^1;//電磁閥關閉
bit dr;
bit Dcf_state=1 ;
bit Halfsecond=0;
bit Onesecond=0;
//////////////////////////////
sbit Mydress_set=P2^5 ;
sbit P_uplimite =P2^6 ;
sbit P_lowlimite=P2^7;
sbit Stor=P3^2;
sbit myint=P3^3;
sbit ADC_wr =P3^6;
sbit ADC_rd =P3^7;
sbit xuantong =P1^7;
sbit addrset=P1^2;
sbit upset=P1^3;
sbit lowset=P1^4;
/////////////////////////
uchar code Myreturnstateopen[3] ={0x01,0x01,0x00};
uchar code Myreturnstateclose[3]={0x01,0x01,0x01};
uchar code Myreturnopen[3] ={0x01,0x01,0x10};
uchar code Myreturnclose[3]={0x01,0x01,0x20};
uchar receive_count=0;
uchar mysend[6],aq[8];
uchar Adc_value;
unsigned long Mycount=0;
uchar jishi=0; //定時一秒計數
uint crc=0,myaw=0;
uint crc16(unsigned char *puchMsg, unsigned int usDataLen);
bit yifasong=0;
void Beginsend( uchar Me );
bit check_modbus() ;
void Open_dcf() ;
void Close_dcf();
void timer0() ;
void uart_init(void) ;
void delay(uint z) ;
void Read_adc();
void Tosend();
/////////
/*************延時*****************/
void delay(uint z)
{
uchar y;
while(z--)
for(y=113;y>0;y--);
}
/************串口初始化*****************/
void uart_init(void) interrupt 4 using 1
{
if(RI)
{
aq[receive_count]=SBUF;
RI=0;
receive_count++;
if(0==receive_count%8)
{
yifasong=0;
receive_count=0;
};
RI=0;
}
}
/**************定時器0初始化**************/
void timer0() interrupt 1 using 1
{
TH0=0x4b;
TL0=0x63;
jishi++;
if (0==jishi%10) {
Halfsecond=1;
aq[0]=0;aq[1]=0;aq[2]=0;aq[3]=0;aq[4]=0;aq[5]=0;aq[6]=0;aq[7]=0;receive_count=0;
}
}
void Read_adc()
{
ADC_rd=1;
ADC_wr=1;
_nop_();
_nop_();
_nop_();
_nop_();
myint=1;
P0=0xff;
ADC_wr=0;
_nop_();
_nop_();
_nop_();
_nop_();
ADC_wr=1;
while( myint==1);
ADC_rd=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Adc_value=P0; //讀出的數據賦與addate
ADC_rd=1;
}
void Open_dcf()
{
Dcf_open=0; delay(1200); Dcf_open=1; Dcf_state=1;
}
void Close_dcf()
{
Dcf_close=0; delay(1200);Dcf_close=1; Dcf_state=0;
}
void Read_Pressure()
{
Read_adc() ;
if (Dcf_state)
{
if((Adc_value<Pressure_lowdata)|| (Adc_value>Pressure_updata))
{
delay(1200);
if((Adc_value<Pressure_lowdata)|| (Adc_value>Pressure_updata)) { Close_dcf(); }
}
else
{ ; }
}
else
{
if((Adc_value>Pressure_lowdata)&&(Adc_value<Pressure_updata))
{ delay(1200);
if((Adc_value>Pressure_lowdata)&&(Adc_value<Pressure_updata)) { Open_dcf(); }
}
else ;
}
}
void initialize()
{
TMOD=0x20;
SCON=0x50;//串口通訊方式1
TH1=0xfd;//波特率9600
TL1=0xfd;
TH0=0x4b;
TL0=0x63;
TI=0;//發送中斷標志位清零
RI=0;//接收中斷標志位清零
Mydress_set=1;P_lowlimite=1; P_uplimite=1; xuantong=1;
Mydress_set=0;delay(20);addrset=1;delay(20);addr=P0;
delay(20);
addrset=0;Mydress_set=1;delay(200);P0=0xff;
P_lowlimite=0;delay(20);lowset=1;delay(20);Pressure_lowdata=P0;
delay(20);
lowset=0;P_lowlimite=1;P0=0xff;
P_uplimite=0; delay(20);upset=1;Pressure_updata=P0;delay(20);upset=0;P_uplimite=1;P0=0xff;
xuantong=0;
}
void main(void)
{
IE=0x92;
TR0=1;TR1=1;
// WDTRST=0x1E;
// WDTRST=0xE1;//初始化看門狗
initialize();
Stor=0;
for(;;) { // WDTRST=0x1E;
//WDTRST=0xE1;//喂狗指令
if (Halfsecond==1) {
Halfsecond=0;
Read_Pressure();
}
//夠一秒開始轉換
if(receive_count==0&&(yifasong==0))
{ Stor=0;
dr= check_modbus();
if (dr&&addr==aq[0])
{ if(aq[1]==0x05)
switch ( aq[3])
{
case 0x00 :
if(!Dcf_state) Open_dcf();
Beginsend(0) ; break;
case 0x01 :
if(Dcf_state) Close_dcf();
Beginsend(1);
break;
default : ;
}
else if(aq[1]==0x01)
{
if(Dcf_state)
{ Beginsend(2);
}
else
{ Beginsend(3);
}
}
else;
}
else
;
}
}
}
void Beginsend(uchar Me )
{
uchar i;
ES=0; Stor=1;
TI=0;
mysend[0]=addr;
switch(Me)
{
case 0:
{ for(i=1;i<4;i++)
{
mysend[i] = Myreturnopen[i-1];
}
i=0;
}break;
case 1:
{for(i=1;i<4;i++)
{
mysend[i] = Myreturnclose[i-1];
} i=0;}break;
case 2:
{ for(i=1;i<4;i++)
{
mysend[i] = Myreturnstateopen[i-1];
} i=0;}break;
case 3:
{for(i=1;i<4;i++)
{
mysend[i] = Myreturnstateclose[i-1];
}i=0;}break;
default : ;}
myaw=crc16(mysend,4);
mysend[4] =myaw&0x00ff;
mysend[5] =(myaw>>8)&0x00ff;
for(i=0;i<6;i++)
{
SBUF=mysend[i];
while(TI!=1);
TI=0;
}
Stor=0;
ES=1;
yifasong=1;
}
bit check_modbus()
{
uchar m,n ;
crc=crc16(aq,6);
m=crc;n=crc>>8&0x00ff;
if(aq[6]==m&&aq[7]==n)
return 1 ;
else
return 0;
}
uint crc16(uchar *puchMsg, uint usDataLen)
{
uchar uchCRCHi = 0xFF ; //* 高CRC位元組初始化
uchar uchCRCLo = 0xFF ; //* 低CRC 位元組初始化
unsigned long uIndex ; // CRC循環中的索引
while (usDataLen--) // 傳輸消息緩沖區
{
uIndex = uchCRCHi ^ *puchMsg++ ; // 計算CRC
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi | uchCRCLo<<8);
}
/***********************CRC校驗*************************/
// CRC 高位位元組值表
⑻ 單片機上下位機間的連接
將主機的TXD和各下位機的RXD連接,將主機的RXD和各下位機的TXD連接,AT89S52的串口沒有地址寄存器,所以要人為的為各個下位機設定一個特定編號,主機向下位機發送命令時必須包含這個編號(實際只要花一個位元組作為特徵代碼就可以),下位機根據對特徵代碼的識別來確定是否向上位機返回數據信息,上位機同時與各下位機的通信只能分時進行。至於AT89S52與LCD12864的連接是靈活的,一般採用串列連接,隨便取單片機的幾個I/O與之連接就可以了,AT89S52與LCD12864的通信只能軟體模擬,上述方案供參考。如果想更方便些,建議單片機的選型,最好選擇同時具備SPI和UART介面的
⑼ 什麼是上位機什麼是下位機現在常用的單片機有哪些,簡單介紹下
上位機與下位機是相對而言,可以理解為「主從」模式,通常上位機指的是PC;常用的單片機有51系列、AVR系列、FREESCALE、PIC、MSP430等,還有arm系列(通常不被歸類於單片機,但也可做單片機使用)
⑽ 電腦做上位機 單片機做下位機 通過USB通信 在電腦端控制單片機怎麼玩
1.先買個usb 下載模塊,到淘寶上買個
2.在自己先弄單片機最小系統在上面添加LED燈和蜂鳴器,可以麵包板來測試先,然後再焊上去,
3.首先你要用上位機軟體來測試,然後自己寫相應的上位機軟體 http://blog.csdn.net/zhs1931/archive/2010/01/16/5193819.aspx 這里的代碼會了 (當然你要回點VC++的基礎)