欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機(jī)串口通信控制LCD燈,為什么加上延遲函數(shù)之后,不能控制燈? [打印本頁(yè)]

作者: sadkh    時(shí)間: 2020-5-12 23:00
標(biāo)題: 單片機(jī)串口通信控制LCD燈,為什么加上延遲函數(shù)之后,不能控制燈?
串口通信控制LCD燈,為什么加上延遲函數(shù)之后,不能控制燈,并且,不加延遲函數(shù),串口發(fā)送數(shù)據(jù)燈也不能亮,只有在中斷服務(wù)為:
void UartISR(void) interrupt 4 //中斷服務(wù)響應(yīng)
{
uchar tempdata;
if(RI)//接收到完整數(shù)據(jù)
tempdata=SBUF;
if(tempdata==1)
{
LCD1=1;
}
}
時(shí),發(fā)送任意數(shù)據(jù)都可以使燈亮。這是為什么啊求大佬解答


#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 打開  啟動(dòng)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 //中斷服務(wù)響應(yīng)
{
uchar tempdata;
if(RI)//接收到完整數(shù)據(jù)
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)
{}
}



作者: wulin    時(shí)間: 2020-5-13 08:24
雖然在串口中斷中使用長(zhǎng)延時(shí)函數(shù)是愚蠢行為,但在此程序中不是錯(cuò)誤根源。發(fā)生錯(cuò)誤是因?yàn)镽I沒有清0。
void UartISR(void) interrupt 4 //中斷服務(wù)響應(yīng)
{
        uchar tempdata;
        RI=0;
        tempdata=SBUF;
        if(tempdata=='1')
        {
                LCD1=1;
                LCD2=0;
        }
        if(tempdata=='2')
        {
                LCD2=1;
                LCD1=0;
        }
}
作者: zhengdianyuanzi    時(shí)間: 2020-5-13 12:11
在接收中斷中接受后清除標(biāo)志位
作者: sadkh    時(shí)間: 2020-5-13 13:11
wulin 發(fā)表于 2020-5-13 08:24
雖然在串口中斷中使用長(zhǎng)延時(shí)函數(shù)是愚蠢行為,但在此程序中不是錯(cuò)誤根源。發(fā)生錯(cuò)誤是因?yàn)镽I沒有清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 打開  啟動(dòng)T                       
    EA    = 1;                  //打開總中斷
    ES    = 1;                  //打開串口中斷
}

void UartISR(void) interrupt 4 //中斷服務(wù)響應(yīng)
{
        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)
{
}
}
這樣也不行啊搞不懂為什么
作者: Crazy·    時(shí)間: 2020-5-13 17:23
沒看看接收到的是什么東西?
作者: jadqin    時(shí)間: 2020-5-13 18:04
void UartISR(void) interrupt 4 //中斷服務(wù)響應(yīng)
{
uchar tempdata;
if(RI)//接收到完整數(shù)據(jù)
tempdata=SBUF;
LCD1=!LCD0;
}
你可以試試看這樣子亮不亮,如果亮了就是你tempdata判斷錯(cuò)了
作者: wulin    時(shí)間: 2020-5-13 20:59
sadkh 發(fā)表于 2020-5-13 13:11
void UartInit(void)//初始化
{
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收   ...

如果不仔細(xì),任何一點(diǎn)疏漏都會(huì)導(dǎo)致失敗。下面這個(gè)程序基本沒有改動(dòng),經(jīng)實(shí)物驗(yàn)證無誤。


  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 打開  啟動(dòng)T                       
  14.         EA    = 1;      //打開總中斷
  15.         ES    = 1;      //打開串口中斷
  16. }

  17. void UartISR(void) interrupt 4 //中斷服務(wù)響應(yīng)
  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. }
復(fù)制代碼








歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1