久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2321|回復: 6
打印 上一主題 下一主題
收起左側

單片機串口通信控制LCD燈,為什么加上延遲函數之后,不能控制燈?

[復制鏈接]
跳轉到指定樓層
樓主
串口通信控制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)
{}
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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)
{
}
}
這樣也不行啊搞不懂為什么
回復

使用道具 舉報

5#
ID:564486 發表于 2020-5-13 17:23 | 只看該作者
沒看看接收到的是什么東西?
回復

使用道具 舉報

6#
ID:379466 發表于 2020-5-13 18:04 | 只看該作者
void UartISR(void) interrupt 4 //中斷服務響應
{
uchar tempdata;
if(RI)//接收到完整數據
tempdata=SBUF;
LCD1=!LCD0;
}
你可以試試看這樣子亮不亮,如果亮了就是你tempdata判斷錯了
回復

使用道具 舉報

7#
ID:213173 發表于 2020-5-13 20:59 | 只看該作者
sadkh 發表于 2020-5-13 13:11
void UartInit(void)//初始化
{
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收   ...

如果不仔細,任何一點疏漏都會導致失敗。下面這個程序基本沒有改動,經實物驗證無誤。


  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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天插天天射天天干 | 亚洲一区视频 | 精品国产久 | 国产色 | 亚洲午夜视频在线观看 | 国产免费拔擦拔擦8x高清 | 欧美国产精品一区二区三区 | 久久久国产一区二区三区四区小说 | 国产精品亚洲成在人线 | 国产剧情一区 | 国产成人小视频 | 国产精品视频一区二区三区不卡 | 99久久精品国产麻豆演员表 | 日韩视频一区二区 | 狠狠狠干| 国内精品伊人久久久久网站 | 亚洲不卡在线视频 | 男人天堂午夜 | 精品国产免费一区二区三区演员表 | 日韩免费视频 | 精品视频在线观看 | 国产激情一区二区三区 | 91一区二区三区在线观看 | 91 视频网站| 伊人最新网址 | 国产成人精品一区二区三 | 亚洲国产黄 | 亚洲国产欧美精品 | av黄色国产| 一区二区国产精品 | 曰韩一二三区 | 亚洲人成在线观看 | 精品一区免费 | 手机看黄av免费网址 | 欧美在线视频一区二区 | 91精品国产高清一区二区三区 | 亚洲欧美v | 午夜免费网站 | 国产日韩一区二区 | 日韩三级在线 | 欧美日韩综合一区 |