打印
[51单片机]

单片机工作状态转换

[复制链接]
3417|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cellagent|  楼主 | 2013-9-26 11:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人目前的一个项目是上位机(pc)通过串口控制51单片机检测电流、电压信号,然后将检测的数据通过串口发回pc,串口是通过单片机的IO口模拟的,波特率9600bps,当单片机仅仅从事数据的传输时能够得到正确的结果,例如上位机发'1',单片机往上发"Hello World !"。我的想法是当上位机有命令发下来时单片机才从事检测工作,其它情况下该干什么干什么。我自己写了个测试程序,主程序的主要部分如下:
while(1)
{
  if(StartBitOn())   //有串口命令  负跳变
  {
        gch=PGetChar();  //单片机从串口获取一个字节
        if(gch=='1')
                PSendString(snd_string,strlen(snd_string));  //单片机网串口发字符串 "Hello World !"
        else
                PSendChar(gch);
  }
  else   //没有串口命令,就从事其它工作 此处是让一个led灯闪烁
  {
       P1=0xfe;
       delay500ms();
       P1=0xff;
       delay500ms();
  }         
}
程序我都注释清楚了。但我把程序下到单片机后,即使通过上位机串口软件发送数据,P1.0对应的led灯一直在闪烁。没有如我设想中的那样进行工作状态的转换。我看了下模拟串口的io口,单片机模拟的TXD有数据(对应的led闪烁),而模拟的RXD没有数据(对应的led不闪烁)。请问各位,怎样转换单片机的工作状态呢?单片机某时刻只能做一件事,有什么好的方式跳转工作?中断、时间片?请给小弟些指点。

相关帖子

沙发
cellagent|  楼主 | 2013-9-26 11:37 | 只看该作者
怎么没人帮忙解答呢? 自己顶个

使用特权

评论回复
板凳
yangfan19641964| | 2013-9-26 12:06 | 只看该作者
程序结构不好。
while(1)
{

       if    (500mS标志)      用定时中断数次计数获得
    {
             清除500mS标志
             P1=P1^0x01;
      }

  if(StartBitOn())   //有串口命令  负跳变
  {
        gch=PGetChar();  //单片机从串口获取一个字节
        if(gch=='1')
                PSendString(snd_string,strlen(snd_string));  //单片机网串口发字符串 "Hello World !"
        else
                PSendChar(gch);
  }
      
}

使用特权

评论回复
地板
南宫云明| | 2013-9-26 12:32 | 只看该作者
StartBitOn()是干什么用的。。。

使用特权

评论回复
5
cellagent|  楼主 | 2013-9-26 13:38 | 只看该作者
南宫云明 发表于 2013-9-26 12:32
StartBitOn()是干什么用的。。。

就是串口标志,表示此时开始进行串口通信

使用特权

评论回复
6
南宫云明| | 2013-9-26 13:40 | 只看该作者
cellagent 发表于 2013-9-26 13:38
就是串口标志,表示此时开始进行串口通信

那就是有问题呀。。。。你大多数时间都在delay里面循环,用这个函数检测串口开始通信很难检测到呀

使用特权

评论回复
7
南宫云明| | 2013-9-26 13:44 | 只看该作者
接收最好用串口中断来做,查询的方式太笨了。。。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
cellagent + 3 赞一个!
8
cellagent|  楼主 | 2013-9-26 13:49 | 只看该作者
yangfan19641964 发表于 2013-9-26 12:06
程序结构不好。
while(1)
{

谢谢你的回复,你的意思是先做别的事情,最后监听串口信号的吗?
我之前和一个同学交流过,他的意思是:
else                 //没有串口通信的情况  
  {
  P1=0xfe;
  //delay500ms();
  P1=0xff;
  //delay500ms();       
  //break;
  }         

把延时注释掉。因为不管有没有串口信号,其实单片机都在从事监听工作,延时500ms可能会漏检串口信号,即StartBitOn()。
按照这个意思,程序是可以运行,效果是led灯亮不闪烁,上位机串口可以下发字符。但是总觉得没有达到我的目的,我的设想是
有串口信号时才进行串口通信,否则做其它事情。

使用特权

评论回复
9
cellagent|  楼主 | 2013-9-26 13:53 | 只看该作者
南宫云明 发表于 2013-9-26 13:44
接收最好用串口中断来做,查询的方式太笨了。。。

谢谢你的回复,我试试。

使用特权

评论回复
10
xiaoyaoym| | 2013-9-26 14:16 | 只看该作者
你可以把通信的程序放到中断里,而且延时也可以用定时器实现,同样用中断。这样延时就不会占用你的主程序,能省不少事。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
cellagent + 3 赞一个!
11
yangfan19641964| | 2013-9-26 16:02 | 只看该作者
我写的就是达到你的目的。500毫秒到,则P1.0状态转换、LED灯闪烁。(顺便说一句,你原来那样来闪烁太低效,实际上无法达到很多实际要求)没有到500毫秒时间点,继续向下执行主循环体内的语句,也就是连续不停检测串口。

使用特权

评论回复
12
yangfan19641964| | 2013-9-26 16:04 | 只看该作者
延时注释掉,LED灯也在闪烁,但是是以极快的速度闪烁,你的肉眼分辨不出来。其视觉效果就是LED一直亮,只是亮度降低大约一半。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
cellagent + 2 赞一个!
13
jackcms| | 2013-9-27 09:47 | 只看该作者

使用特权

评论回复
14
q3742829| | 2013-9-27 11:16 | 只看该作者
顶个

使用特权

评论回复
15
jiabin1024| | 2013-9-27 11:21 | 只看该作者
有串口不用干嘛要模拟呢?

使用特权

评论回复
16
Leeone| | 2013-9-27 13:30 | 只看该作者
delay500ms()是致命啊

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
cellagent + 2 赞一个!
17
很忙| | 2013-9-27 13:37 | 只看该作者
学习中。中断确实是好东西。

使用特权

评论回复
18
cellagent|  楼主 | 2013-9-27 13:40 | 只看该作者
jiabin1024 发表于 2013-9-27 11:21
有串口不用干嘛要模拟呢?

一朋友手里有一款单片机,HT46R0662,据说没有串口。我问了它一个问题,既然没有串口,那程序是怎样下载进去的呢? 我查了下资料,单片机程序下载的方式有ISP和串口,我手里的stc89c52rc单片机就是使用串口下载的。

使用特权

评论回复
19
cellagent|  楼主 | 2013-9-27 13:40 | 只看该作者
Leeone 发表于 2013-9-27 13:30
delay500ms()是致命啊

谢谢提醒,确实是延时的问题

使用特权

评论回复
20
cellagent|  楼主 | 2013-9-27 13:41 | 只看该作者
yangfan19641964 发表于 2013-9-26 16:04
延时注释掉,LED灯也在闪烁,但是是以极快的速度闪烁,你的肉眼分辨不出来。其视觉效果就是LED一直亮,只是 ...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

171

帖子

3

粉丝