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

標題: 單片機程序問題 一個按鍵按一下,然后串口顯示01,再按下為02 [打印本頁]

作者: 匿名信封研    時間: 2019-1-20 00:53
標題: 單片機程序問題 一個按鍵按一下,然后串口顯示01,再按下為02
以下是我編寫的一個程序,目的是讓單片機一個按鍵按一下,然后串口顯示01,再按下為02,但是我寫的這個程燒錄到單片機上的時候一直按那個按鍵,單片機串口一直都顯示01,從來都不變,有沒有大佬幫忙看一下為什么呀

單片機代碼:
  1. #include"reg52.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit key=P3^1;

  5. uchar key_count;

  6. //串口初始化
  7. void UARTInit()
  8. {
  9.         EA = 1;        //打開總中斷
  10.         ES = 1; //打開串口中斷
  11.         SM0 = 0;        
  12.     SM1 = 1;//串口工作方式1,8位UART波特率可變
  13.         REN = 1;//串口允許接收
  14.         TR1 = 1;//啟動定時器1
  15.         TMOD |= 0x20;//定時器1,工作模式2 8位自動重裝
  16.         TH1 = 0xfd;
  17.         TL1 = 0xfd;//設置比特率9600
  18. }

  19. uchar  code duan[]={
  20. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  21. 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
  22. 0x79,0x71};

  23. void  delayms(uint xms)//此為延時函數,就是前面的延時都是需要調用這一個函數
  24. {
  25.     uint  i,j;
  26.     for(i=xms;i>0;i--)
  27.       for(j=110;j>0;j--);
  28. }

  29.   void  keyscan()
  30.   {
  31.     key=1;
  32.     if(key==0)
  33.     {
  34.      delayms(50);
  35.     if(key==0)
  36.     {
  37.       key_count++;
  38.      if(key_count==10)
  39.        key_count=0;
  40.      while(!key);
  41.      }
  42.       }
  43.   }


  44.   void timer0Init()
  45. {
  46.         EA = 1;        //打開總中斷
  47.         ET0 = 1;//打開定時器0中斷
  48.         TR0 = 1;         //啟動定時器0
  49.         REN = 1;//允許串口接收
  50.         TMOD |= 0X01; //定時器工作模式1,16位定時模式
  51.         TH0 = 0xED;
  52.         TL0 = 0xFF; //定時5ms
  53. }


  54. void  main()
  55. {
  56.   timer0Init();//定時器0初始化
  57.         UARTInit();//串口初始
  58.     keyscan();
  59.     while(1);

  60. }

  61. //定時器0中斷函數
  62. void timer0() interrupt 1
  63. {
  64.         TH0 = 0xED;
  65.         TL0 = 0xFF; //定時5ms
  66.         
  67. }
  68. //串口中斷函數
  69. void UART() interrupt 4
  70. {
  71.         uchar temp;
  72.         if(RI)//判斷接收是否完成
  73.         {
  74.                 key_count = SBUF;//讀SBUF,讀出串口接收到的數據
  75.                 RI = 0;//軟件清零接收標志位        
  76.                 temp = key_count;//
  77.                 SBUF = ++temp;//寫SBUF,把要發送的數據送給發送緩存器
  78.         }
  79.         if(TI)//判斷是否發送完成
  80.                 TI = 0;//清零發送完成標志位        
  81. }
復制代碼



作者: wulin    時間: 2019-1-20 08:21
如果只需要串口發送不需要串口接收就不必開串口接收中斷。你的主要問題是按鍵掃描程序放在主循環外了。給你改了下,無關的語句都屏蔽了,你試試。
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit key=P3^1;
/*
uchar  code duan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71}; */
uchar key_count;
bit k;
//此為延時函數,就是前面的延時都是需要調用這一個函數
void  delayms(uint xms)
{
    uint  i,j;
    for(i=xms;i>0;i--)
      for(j=110;j>0;j--);
}
//串口初始化
void UARTInit()
{
        TMOD &= 0x0f;
        TMOD |= 0x20;//定時器1,工作模式2 8位自動重裝
        TH1 = 0xfd;
        TL1 = 0xfd;//設置比特率9600
        TR1 = 1;//啟動定時器1
        TR1 = 1;//啟動定時器1
        SM0 = 0;        
        SM1 = 1;//串口工作方式1,8位UART波特率可變
//        EA = 1;        //打開總中斷
//        ES = 1; //打開串口中斷
}
//按鍵掃描
void  keyscan()
{
        key=1;
        if(key==0)
        {
                delayms(50);
                if(key==0)
                {
                        key_count++;
                        if(key_count==10)
                                key_count=0;
                        k=1;//允許發送標志置1
                        while(!key);
                }
        }
}
/*
void timer0Init()
{
        EA = 1;        //打開總中斷
        ET0 = 1;//打開定時器0中斷
        TR0 = 1;         //啟動定時器0
        REN = 1;//允許串口接收
        TMOD |= 0X01; //定時器工作模式1,16位定時模式
        TH0 = 0xED;
        TL0 = 0xFF; //定時5ms
}*/
void  main()
{
//        timer0Init();//定時器0初始化
        UARTInit();//串口初始
        while(1)
        {
                keyscan();
                if(k==1)                //如果允許發送
                {
                        k=0;        //發送標志清0,防止重復發送
                        SBUF=key_count;        //發送數據
                        while(!TI);        //等待發送中斷請求標志位為1(已發送)
                        TI=0;                //發送中斷請求標志位清0
                }
        }
}
/*
//定時器0中斷函數
void timer0() interrupt 1
{
        TH0 = 0xED;
        TL0 = 0xFF; //定時5ms
}
//串口中斷函數
void UART() interrupt 4
{
        uchar temp;
        if(RI)//判斷接收是否完成
        {
                key_count = SBUF;//讀SBUF,讀出串口接收到的數據
                RI = 0;//軟件清零接收標志位        
                temp = key_count;//
                SBUF = ++temp;//寫SBUF,把要發送的數據送給發送緩存器
        }
        if(TI)//判斷是否發送完成
        TI = 0;//清零發送完成標志位        
}*/
作者: 匿名信封研    時間: 2019-1-20 13:52
wulin 發表于 2019-1-20 08:21
如果只需要串口發送不需要串口接收就不必開串口接收中斷。你的主要問題是按鍵掃描程序放在主循環外了。給你 ...

嗯嗯,這樣可以實現了,非常感謝了




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