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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4068|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)程序問(wèn)題 一個(gè)按鍵按一下,然后串口顯示01,再按下為02

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:467518 發(fā)表于 2019-1-20 00:53 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
以下是我編寫(xiě)的一個(gè)程序,目的是讓單片機(jī)一個(gè)按鍵按一下,然后串口顯示01,再按下為02,但是我寫(xiě)的這個(gè)程燒錄到單片機(jī)上的時(shí)候一直按那個(gè)按鍵,單片機(jī)串口一直都顯示01,從來(lái)都不變,有沒(méi)有大佬幫忙看一下為什么呀

單片機(jī)代碼:
  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;        //打開(kāi)總中斷
  10.         ES = 1; //打開(kāi)串口中斷
  11.         SM0 = 0;        
  12.     SM1 = 1;//串口工作方式1,8位UART波特率可變
  13.         REN = 1;//串口允許接收
  14.         TR1 = 1;//啟動(dòng)定時(shí)器1
  15.         TMOD |= 0x20;//定時(shí)器1,工作模式2 8位自動(dòng)重裝
  16.         TH1 = 0xfd;
  17.         TL1 = 0xfd;//設(shè)置比特率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)//此為延時(shí)函數(shù),就是前面的延時(shí)都是需要調(diào)用這一個(gè)函數(shù)
  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;        //打開(kāi)總中斷
  47.         ET0 = 1;//打開(kāi)定時(shí)器0中斷
  48.         TR0 = 1;         //啟動(dòng)定時(shí)器0
  49.         REN = 1;//允許串口接收
  50.         TMOD |= 0X01; //定時(shí)器工作模式1,16位定時(shí)模式
  51.         TH0 = 0xED;
  52.         TL0 = 0xFF; //定時(shí)5ms
  53. }


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

  60. }

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


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

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2019-1-20 08:21 | 只看該作者
如果只需要串口發(fā)送不需要串口接收就不必開(kāi)串口接收中斷。你的主要問(wèn)題是按鍵掃描程序放在主循環(huán)外了。給你改了下,無(wú)關(guān)的語(yǔ)句都屏蔽了,你試試。
#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;
//此為延時(shí)函數(shù),就是前面的延時(shí)都是需要調(diào)用這一個(gè)函數(shù)
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;//定時(shí)器1,工作模式2 8位自動(dòng)重裝
        TH1 = 0xfd;
        TL1 = 0xfd;//設(shè)置比特率9600
        TR1 = 1;//啟動(dòng)定時(shí)器1
        TR1 = 1;//啟動(dòng)定時(shí)器1
        SM0 = 0;        
        SM1 = 1;//串口工作方式1,8位UART波特率可變
//        EA = 1;        //打開(kāi)總中斷
//        ES = 1; //打開(kāi)串口中斷
}
//按鍵掃描
void  keyscan()
{
        key=1;
        if(key==0)
        {
                delayms(50);
                if(key==0)
                {
                        key_count++;
                        if(key_count==10)
                                key_count=0;
                        k=1;//允許發(fā)送標(biāo)志置1
                        while(!key);
                }
        }
}
/*
void timer0Init()
{
        EA = 1;        //打開(kāi)總中斷
        ET0 = 1;//打開(kāi)定時(shí)器0中斷
        TR0 = 1;         //啟動(dòng)定時(shí)器0
        REN = 1;//允許串口接收
        TMOD |= 0X01; //定時(shí)器工作模式1,16位定時(shí)模式
        TH0 = 0xED;
        TL0 = 0xFF; //定時(shí)5ms
}*/
void  main()
{
//        timer0Init();//定時(shí)器0初始化
        UARTInit();//串口初始
        while(1)
        {
                keyscan();
                if(k==1)                //如果允許發(fā)送
                {
                        k=0;        //發(fā)送標(biāo)志清0,防止重復(fù)發(fā)送
                        SBUF=key_count;        //發(fā)送數(shù)據(jù)
                        while(!TI);        //等待發(fā)送中斷請(qǐng)求標(biāo)志位為1(已發(fā)送)
                        TI=0;                //發(fā)送中斷請(qǐng)求標(biāo)志位清0
                }
        }
}
/*
//定時(shí)器0中斷函數(shù)
void timer0() interrupt 1
{
        TH0 = 0xED;
        TL0 = 0xFF; //定時(shí)5ms
}
//串口中斷函數(shù)
void UART() interrupt 4
{
        uchar temp;
        if(RI)//判斷接收是否完成
        {
                key_count = SBUF;//讀SBUF,讀出串口接收到的數(shù)據(jù)
                RI = 0;//軟件清零接收標(biāo)志位        
                temp = key_count;//
                SBUF = ++temp;//寫(xiě)SBUF,把要發(fā)送的數(shù)據(jù)送給發(fā)送緩存器
        }
        if(TI)//判斷是否發(fā)送完成
        TI = 0;//清零發(fā)送完成標(biāo)志位        
}*/
回復(fù)

使用道具 舉報(bào)

板凳
ID:467518 發(fā)表于 2019-1-20 13:52 | 只看該作者
wulin 發(fā)表于 2019-1-20 08:21
如果只需要串口發(fā)送不需要串口接收就不必開(kāi)串口接收中斷。你的主要問(wèn)題是按鍵掃描程序放在主循環(huán)外了。給你 ...

嗯嗯,這樣可以實(shí)現(xiàn)了,非常感謝了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表