找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2019|回复: 6
收起左侧

单片机串口通信控制LCD灯,为什么加上延迟函数之后,不能控制灯?

[复制链接]
ID:536458 发表于 2020-5-12 23:00 | 显示全部楼层 |阅读模式
串口通信控制LCD灯,为什么加上延迟函数之后,不能控制灯,并且,不加延迟函数,串口发送数据灯也不能亮,只有在中断服务为:
void UartISR(void) interrupt 4 //中断服务响应
{
uchar tempdata;
if(RI)//接收到完整数据
tempdata=SBUF;
if(tempdata==1)
{
LCD1=1;
}
}
时,发送任意数据都可以使灯亮。这是为什么啊求大佬解答


#include<reg51.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD1=P3^4;
sbit LCD2=P3^3;
void UartInit(void)//初始化
{
SCON  = 0x50;          // SCON: 模式 1, 8-bit UART, 使能接收  串行控制寄存器
    TMOD |= 0x20;               // TMOD: timer 1, 模式 2, 8-bit 重装
   PCON = 0x00;           //波特率不加倍
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz
   TL1 = TH1;                 //波特率9600
    TR1   = 1;                  // TR1:  timer 1 打开  启动T                       
    EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
}
/*void delay(unsigned int ms)
{
unsigned int i;
uchar j;
for(i=0;i<ms;i++)
{
  for(j=0;j<200;j++);
  for(j=0;j<102;j++);
}
}*/
void UartISR(void) interrupt 4 //中断服务响应
{
uchar tempdata;
if(RI)//接收到完整数据
tempdata=SBUF;
if(tempdata=='1')
{
LCD1=1;
LCD2=0;
//delay(2000);
//LCD1=0;
}
if(tempdata=='2')
{
LCD2=1;
LCD1=0;
}
}
void main(void)
{
LCD1=0;
LCD2=0;
UartInit();
while(1)
{}
}


回复

使用道具 举报

ID:213173 发表于 2020-5-13 08:24 | 显示全部楼层
虽然在串口中断中使用长延时函数是愚蠢行为,但在此程序中不是错误根源。发生错误是因为RI没有清0。
void UartISR(void) interrupt 4 //中断服务响应
{
        uchar tempdata;
        RI=0;
        tempdata=SBUF;
        if(tempdata=='1')
        {
                LCD1=1;
                LCD2=0;
        }
        if(tempdata=='2')
        {
                LCD2=1;
                LCD1=0;
        }
}
回复

使用道具 举报

ID:363812 发表于 2020-5-13 12:11 | 显示全部楼层
在接收中断中接受后清除标志位
回复

使用道具 举报

ID:536458 发表于 2020-5-13 13:11 | 显示全部楼层
wulin 发表于 2020-5-13 08:24
虽然在串口中断中使用长延时函数是愚蠢行为,但在此程序中不是错误根源。发生错误是因为RI没有清0。
void  ...

void UartInit(void)//初始化
{
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  串行控制寄存器
    TMOD |= 0x20;               // TMOD: timer 1, 模式 2, 8-bit 重装
          PCON = 0x00;           //波特率不加倍
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz
          TL1 = TH1;                 //波特率9600
    TR1   = 1;                  // TR1:  timer 1 打开  启动T                       
    EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
}

void UartISR(void) interrupt 4 //中断服务响应
{
        uchar tempdata;
          RI=0;
    tempdata=SBUF;
    if(tempdata=='1')
        {
                LED1=1;
                LED2=0;
        }
        if(tempdata=='2')
        {
                LED2=1;
                LED1=0;
        }
}

void main(void)
{
UartInit();
        LED1=0;
        LDE2=0;
while(1)
{
}
}
这样也不行啊搞不懂为什么
回复

使用道具 举报

ID:564486 发表于 2020-5-13 17:23 | 显示全部楼层
没看看接收到的是什么东西?
回复

使用道具 举报

ID:379466 发表于 2020-5-13 18:04 | 显示全部楼层
void UartISR(void) interrupt 4 //中断服务响应
{
uchar tempdata;
if(RI)//接收到完整数据
tempdata=SBUF;
LCD1=!LCD0;
}
你可以试试看这样子亮不亮,如果亮了就是你tempdata判断错了
回复

使用道具 举报

ID:213173 发表于 2020-5-13 20:59 | 显示全部楼层
sadkh 发表于 2020-5-13 13:11
void UartInit(void)//初始化
{
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收   ...

如果不仔细,任何一点疏漏都会导致失败。下面这个程序基本没有改动,经实物验证无误。
无标题.jpg

  1. #include <reg51.h>                                                   
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit LED1=P3^4;
  5. sbit LED2=P3^3;

  6. void UartInit(void)//初始化
  7. {
  8.         SCON  = 0x50;   // SCON: 模式 1, 8-bit UART, 使能接收  串行控制寄存器
  9.         TMOD |= 0x20;   // TMOD: timer 1, 模式 2, 8-bit 重装
  10.         PCON = 0x00;    //波特率不加倍
  11.         TH1   = 0xFD;   // TH1:  重装值 9600 波特率 晶振 11.0592MHz
  12.         TL1 = TH1;      //波特率9600
  13.         TR1   = 1;      // TR1:  timer 1 打开  启动T                       
  14.         EA    = 1;      //打开总中断
  15.         ES    = 1;      //打开串口中断
  16. }

  17. void UartISR(void) interrupt 4 //中断服务响应
  18. {
  19.         uchar tempdata;
  20.         RI=0;
  21.         tempdata=SBUF;
  22.         if(tempdata=='1')
  23.         {
  24.                 LED1=1;
  25.                 LED2=0;
  26.         }
  27.         if(tempdata=='2')
  28.         {
  29.                 LED2=1;
  30.                 LED1=0;
  31.         }
  32. }

  33. void main(void)
  34. {
  35.         UartInit();
  36.         LED1=0;
  37.         LED2=0;
  38.         while(1)
  39.         {
  40.         }
  41. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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