找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1928|回复: 9
打印 上一主题 下一主题
收起左侧

52单片机用串口实现这个程序的思路是什么?

[复制链接]
跳转到指定楼层
楼主
ID:843631 发表于 2020-11-25 23:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
100黑币
我想通过89c52实现这样一个功能:电脑通过串口向单片机发送1,led亮。如果过一段时间(比如200ms)之内电脑没有发送1,led灯自动熄灭,程序应该怎么写呢?

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:844772 发表于 2020-11-26 00:05 | 只看该作者
先说一下,出差呢,没编译器,记事本写的,应该没大问题。
晶振12M的,就为了你led延时亮还用了中断。

#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
sbit ring=P3^7;//注意LED放到这
uchar re=0;
uchar temp=0;
uint iturn=0;

//串口接收程序
uchar receive(void)
{
re=SBUF; //接收数据
while(RI==0);
RI=0;
return re;
}
//串口初始化
void sinti(void)
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = 0xFD;
TR1 = 1;
EA = 1;
ES = 1;
}
void delay(int cnt)
{
while(--cnt);
}

               
/**************************************************************
定时器T0的中断,每次1ms,200次后关灯
**************************************************************/
  void Turnon(void ) interrupt 1 using 1 //定时器T0的中断编号为1,使用第1组寄存器
  {
         
        TH0=(8192-1000)/32;   
        TL0=(8192-1000)%32;   
        if (iturn>=200)
          { iturn=0;
           ring=0;
           TR0=0;
         }
           iturn++;
  }


//主程序
int main (void)
{

   EA=1;         //开总中断
   ET0=1;         //定时器T0中断允许
   TR0=0;      
   TMOD=0x10;    //T0的模式0
   TH0=(8192-1000)/32;   
   TL0=(8192-1000)%32;                                                                        
   ring=0; //关灯
   sinti(); //串口初始化程序  
while(1)
{

   if(receive()=='1')
   {
      ring=1;
      TR0=1;
   }

}
}
//串口中断程序
void UART_SER (void) interrupt 4
{

if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
temp=SBUF;
}
if(TI) //如果是发送标志位,清零
TI=0;
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:420836 发表于 2020-11-26 04:16 | 只看该作者
使用计时器中断。 当200ms到,并且没有命令“ 1”时,关闭LED。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:843631 发表于 2020-11-26 09:17 | 只看该作者
TTQ001 发表于 2020-11-26 04:16
使用计时器中断。 当200ms到,并且没有命令“ 1”时,关闭LED。

怎么判断有没有接收到新命令呢
回复

使用道具 举报

5#
ID:843631 发表于 2020-11-26 09:18 | 只看该作者
glinfei 发表于 2020-11-26 00:05
先说一下,出差呢,没编译器,记事本写的,应该没大问题。
晶振12M的,就为了你led延时亮还用了中断。

如果200ms内一直收到1 就让led继续亮这个怎么实现呢
回复

使用道具 举报

6#
ID:276663 发表于 2020-11-26 09:47 | 只看该作者
本帖最后由 IdeaMing 于 2020-11-26 09:51 编辑

思路如下
1.串口接收
2.定时器1ms中断一次 变量overtime=200,每次中断overtime-1,如果overtime=0,则flag=0;
3.定义一个标志位flag = 0;主循环中循环判断flag=0就关LED,flag=1就开灯。
4.串口中断收到数据如果是1,则flag=1,overtime=200,重新计时。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:744327 发表于 2020-11-26 10:50 | 只看该作者
使用定时器,定时200ms,然后200ms发送数据

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:848171 发表于 2020-11-27 10:18 | 只看该作者
思路如下 1.串口接收 2.定时器1ms中断一次 变量overtime=200,每次中断overtime-1,如果overtime=0,则flag=0; 3.定义一个标志位flag = 0;主循环中循环判断flag=0就关LED,flag=1就开灯。 4.串口中断收到数据如果是1,则flag=1,overtime=200,重新计时。
回复

使用道具 举报

9#
ID:845766 发表于 2020-11-27 14:50 | 只看该作者
校验串口接收到的字符,然后弄个定时器应该就能搞定了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

10#
ID:420836 发表于 2020-11-28 07:39 | 只看该作者
使用串口接收中断。 每次在串行端口中断中,检查命令是“ 1”还是“ 0”。 如果它为“ 1”,则禁用计时器1并保持LED亮起。 如果接收到命令“ 0”,则启用计时器1并使LED继续点亮200 ms,然后关闭LED;如果在200 ms之前接收到命令“ 1”,则禁用计时器1并保持LED点亮。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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