⑴ 单片机 上位机 下位机 通信
上位机接收到的肯定也是一个数字
⑵ 什么是上位机和下位机,单片机属于哪个
上位机是指人可以直接发出操控命令的计算机,一般是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++的基础)