搜索
bottom↓
回复: 8

串口通讯问题..

[复制链接]

出0入0汤圆

发表于 2012-3-25 18:05:14 | 显示全部楼层 |阅读模式
最近为一个串口的问题苦恼了很久.
要求是这样的:
1、上位机有开始和停止2个按键,按下开始 会给单片机发送0xAA,0x30,0x00,0x00,0x7E  按下停止会给单片机发送0xAA,0x31,0x00,0x00,0x7E
2、上位机有1个温度显示..温度值显示命令(假设水温为10℃):0xAA,0x10,0x00,0x0a,0x7E(0x10和0x7e中间2位数为温度值)
3、要求按下开始后,点亮1个led灯,上位机温度显示每分钟上升5度,按下停止后 led灯熄灭 上位机温度显示每分钟下降5度

我就是发送和接收可以单独写,写在一起就只能接收上位机命令而发不出去命令了。求大大们帮忙

补充内容 (2012-3-27 07:05):
代码和图片请看6和7楼..

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2012-3-25 19:03:08 | 显示全部楼层
有没有大大帮下忙的?

出0入0汤圆

 楼主| 发表于 2012-3-25 21:15:31 | 显示全部楼层
求高人来啊。.

出0入0汤圆

 楼主| 发表于 2012-3-26 12:54:01 | 显示全部楼层
怎么就是没人帮忙解决下

出0入0汤圆

发表于 2012-3-26 13:13:01 | 显示全部楼层
说的这么乱,让别人怎么帮呢??
温度到底是怎么搞的呢??
上位机,下位机,到底是怎么个关系??
还有相关的程序呢??
问问题是有学问的,高手不会浪费时间做阅读理解

最关键一点,就串口通讯
你自己有没有做足功课,有没有搜索一些资料,尽最大努力试图自己解决呢?
这就是在咱们论坛学习到的第一件事

出0入0汤圆

 楼主| 发表于 2012-3-27 06:59:16 | 显示全部楼层
上位机界面和通信命令都在附件里。..不会贴图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-3-27 07:05:13 | 显示全部楼层
#include <REG52.H>
#define uchar unsigned char
sbit LED = P1^0;
uchar light[5]={0xAA,0x20,0xff,0xff,0x7E};
uchar buf[5];
uchar UART_buff;
bit New_rec = 0, Send_ed = 1, Money = 0;
uchar i,k;
//----------------------------------------------
void main (void)
{
    SCON = 0x50;   //串口方式1, 8-n-1, 允许接收.
    TMOD = 0x20;   //T1方式2
    TH1 = 0xFD;    //9600bps@11.0592MHz
    TL1 = 0xFD;
    TR1 = 1;                        
    ES  = 1;       //开中断.
    EA  = 1;

        while(1)  
        {
                if ((New_rec == 1) && (Send_ed == 1))  
                {
                SBUF = light[i]; //发送.
                i++;
                if(i==5)
                        i=0;
                New_rec = 0;
                Send_ed = 0;
                }
        }
}
//----------------------------------------------
void ser_int (void) interrupt 4
{
        if(RI == 1)
        {  //如果收到.
                RI = 0;      //清除标志.
                New_rec = 1;
                buf[k] = SBUF;  //接收.
                k++;
                if(k==5)
                {
                        if(buf[1]==0x30)
                        LED=0;
                        else
                        LED=1;
                        k=0;       
                }
        }
        else  
        {        //如果送毕.
                TI = 0;      //清除标志.
                Send_ed = 1;
        }
}

代码如下..只能接收而不能发送

出0入0汤圆

 楼主| 发表于 2012-3-27 22:43:04 | 显示全部楼层
大家帮帮忙吧

出0入0汤圆

发表于 2012-3-31 08:57:46 | 显示全部楼层
本帖最后由 xue2003265029 于 2012-3-31 13:32 编辑
bit New_rec = 0, Send_ed = 1, Money = 0;
uchar i,k;

这里i,k应初始化为零。

建议串口中断服务程序ISR改为

void serial_0(void)  interrupt 4   
{
      if(_testbit_(RI))  // 接收
     {
          ……       
     }

    if(_testbit_(TI))   // 发送
    {       
            ……       
       
      }
}


还有在串口中断RI 、TI标志,在串口中断服务程序ISR中会自动清零,因此程序中不必加RI=0,TI=0

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 03:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表