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

上位机软件部分先不考虑(不归我管)
我想用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循环中)。

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