上位机与单片机串口通信控制继电器

上位机软件部分先不考虑(不归我管)
我想用AVR单片机异步串口UART接受上位机发送来的信息,收到的信息是在数据寄存器UDR中吗
我如何把UDR接收到的数据对应给单片机其它IO口驱动继电器呢,就是UDR中的8位数如何转化为驱动继电器IO口的高低电平
可以用if,else函数吗,提前设定好对应关系,比如UDR的0000001对应继电器1的IO口高电平(继电器1接PB5),上位机发送数据0000001,if udr=0000001,PORTB=PORTB |= (1 << 5),PB5口高电平,从而驱动继电器动作,这样可以吗(自己想的,不知可行否),还是有其它方法

不能这样。

单片机串口通讯通常是这样的:

设备上电-关闭所有中断-配置串口参数-开中断-进入主循环


当串口有信息传来时会触发串口接收中断,因此要编写接收中断函数,对接收寄存器读操作,对读出的数据进行处理-清空接收寄存器同时再打开中断


你的 if udr=0000001 什么的是不行的,应该这样  int temp; temp=udr; if(temp=0000001) P1^0=1;等等怎么怎么…… 必须中断了在读,给你个以前搞的51的例子,你看着编你自己的

上电初始化及主函数部分:

void main()
{ uchar i,j;
TMOD=0x20;  //定时器1方式2
TH1=0xe6;
TL1=0xe6;
SM0=0;  //方式一
SM1=1;
REN=1;

EA=1;
TR1=1;
ES=1;
for(i=0;i<12;i++)
{
  Init_DS18B20(i) ;

while (1)
{  
if(flag==0)
{
TI=1;
ES=0;
flag=0;
for(j=0;j<12;j++)
{
  ReadTemp(j);                    
  temp_to_str();                 
  delay(1400);printf("%c%c%c%c%c%c",room[j],TempBuffer[0],TempBuffer[1],TempBuffer[2],TempBuffer[3],TempBuffer[4]);           
   }
while(!TI);
TI=0; 
ES=1;
}  
 
}

}

接收中断:

void se() interrupt 4
{
RI=0;
temp=SBUF;
chuli(temp);
flag=0;
}

具体处理,我的是控制电机吹风

void chuli(char x)
{
switch(x)
{
case('1'):{P00=0;}break;
case('2'):{P01=0;}break;
case('3'):{P02=0;}break;
case('4'):{P03=0;}break;
case('5'):{P04=0;}break;
case('6'):{P05=0;}break;
case('7'):{P06=0;}break;
case('8'):{P07=0;}break;
case('9'):{P20=0;}break;
case('a'):{P21=0;}break;
case('b'):{P22=0;}break;
case('c'):{P23=0;}break;
case('j'):{P00=1;}break;
case('k'):{P01=1;}break;
case('l'):{P02=1;}break;
case('m'):{P03=1;}break;
case('n'):{P04=1;}break;
case('o'):{P05=1;}break;
case('p'):{P06=1;}break;
case('q'):{P07=1;}break;
case('r'):{P20=1;}break;
case('s'):{P21=1;}break;
case('t'):{P22=1;}break;
case('u'):{P23=1;}break;
default:P0=0xff;P2=0xff;break;
}
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-15
最好,自己设计一个传输协议。
参考:
|| 字头|| 设备地址 || 指令类型(读、写)|| 数据 || 异或 || 字尾 ||

数据接收回来后如果是ASCII码,需要进行相应的转换,转换完后可以直接赋给IO口(在主函数的while循环中)。

继电器还有外部驱动电路,通过单片机出来的高低电平控制,需要光耦隔离等。

上位机与单片机串口通信控制继电器
不能这样。单片机串口通讯通常是这样的:设备上电-关闭所有中断-配置串口参数-开中断-进入主循环 当串口有信息传来时会触发串口接收中断,因此要编写接收中断函数,对接收寄存器读操作,对读出的数据进行处理-清空接收寄存器同时再打开中断 你的 if udr=0000001 什么的是不行的,应该这样 int temp; temp...

用串口转usb接口的模块可以实现上位机与plc和单片机之间的通讯么_百度...
DSP利用同步串行口接收FPGA送来的同步串行数据,利用异步串口接收GPS接收机送来时间信息(用于初始化FPGA授时时钟),利用外部总线接口访问FPGA授时时钟、外部SRAM、ISP1581的片内寄存器。可以看出DSP模块主要用于完成数据帧的接收、重组以及转存调度等任务。 ISP1581芯片是PHILIPS公司推出的高速USB2.0设备控制器,实现了USB2.0\/1....

51单片机串行口发送数据到上位机(1)
51单片机的串行口工作模式包括通用异步收发器(UART)的模式0、模式1、模式2和模式3。模式0通常用于扩展并行输入或输出口,模式1用于10位数据的异步通信,而模式2和模式3则用于11位数据的异步通信,增加了奇偶校验位。此外,串行通信控制寄存器(SCON)用于设置工作方式和波特率,而电源管理控制寄存器(PCON...

为什么上位机通过单片机控制控制步进电机只能单步的控制
首先上位机如果是WINDOWS操作系统,那它不是实时操作系统 你应该用上位机发脉冲数指令给单片机,单片机收到脉冲数指令后,再去控制脉冲的发送过程。例如:上位机要求步进电机走2000步,那你就让上位机发2000给单片机。单片机收到2000后,再去控制连续发送2000个脉冲给步进电机驱动器 这样做就比较流畅了。

串口通讯,上位机每正常发送10次,单片机正常接收一次
程序好像没有什么问题 看看上位机每帧是不是多发了2两个数,即每帧22个字节

如何用上位机控制单片机停止运行?
大致方法就是用PC机的串口或者USB虚拟串口和单片机通信。对PC没什么要求。在PC端的编程可能用到VB的串口控件或者用C++之类写的话要用到WINDOWS的串口通信API。网上有很多“PC机串口编程”的例子。比如你要电机走100步,你在PC机上输入“走100步”,然后PC通过串口(USB虚拟串口)发送到单片机串口,单片机...

串口控制器的概述:
串口控制器就是1台写入了串口通信程序的单片机控制器,有2种工作模式:1)上位机监控模式:可由上位机串口控制,实现串口监控;2)脱机控制模式:在通过上位机设置好相关参数后,也可脱离上位机进行独立控制。【备注】:a.串口通信程序:即单片机控制器与上位机通信的程序。b.若一台单片机控制器若没写入...

怎么用上位机通过串口去控制51单片机点亮一个LED? 求程序。。
上位机发送Open led就点亮LED,发送Close led就关闭led,我要C语言的程序。llbb121 | 浏览2998 次 |举报 我有更好的答案推荐于2017-12-16 17:19:05 最佳答案 编了一个小程序,供参考,没有环境调试,大概意思就这样,你可以参考自己试试。#include<reg51.h>#include<string.h>#define uchar unsigned charsbit...

如何实现(电脑)PC机与单片机的串行通信
最后要注意的是波特率和单片机晶振的选用,不知道你用的是什么型号的单片机。软件部分,可以用简单的VB编写上位机软件,这方面网上有很多的代码。单片机部分只要按照普通的串行写程序就行了,测试时可以用“串口调试助手”这款软件,调试好后再写VB程序。上述是我们做项目和产品的经验,希望对你有所帮助。

...电脑上创建一个窗口,点击相应的按钮,控制单片机上LED灯的亮灭_百度...
你好!这个涉及到上位机和单片机直接的串口通信问题,制定好通信协议,就可以用电脑控制单片机 你的电脑端,采用什么语言来编程呢,具体要控制几个灯,私信说明一下

相似回答
大家正在搜