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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2385|回復: 2
收起左側

52 程序改51

[復制鏈接]
ID:116352 發表于 2016-4-26 16:09 | 顯示全部樓層 |閱讀模式
各位大神 本人新手菜鳥一枚  網上找了52的程序不會改51的 求幫助
#include <reg52.h>
sbit     PINA    = P1^0;
sbit     PINB    = P1^1;
sbit     PIND    = P1^2;
unsigned char  display[3];
unsigned char  code  LEDData[ ] =
{ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00
};
char code reserve[3]_at_ 0x3b; //保留0x3b開始的3個字節
unsigned char  counter = 0;     //編碼器脈沖計數
unsigned char  n,shift;
/**********************************************************
ms延時子函數
**********************************************************/
void delayms(unsigned int ms)
{
  unsigned char k;
  while (ms--)
  {
    for (k = 0; k < 114; k++)
      ;
  }
}
/**********************************************************
掃描編碼器子函數
在編碼器引腳A為低電平期間:
編碼器引腳B從0到1為正轉,編碼器引腳B從1到0為反轉。
**********************************************************/
void scan_encoder(void)
{
   static  bit  Curr_encoder_b;  //定義一個變量來儲存當前B信號
   static  bit  Last_encoder_b;  //定義一個變量來儲存上次B腳信號
   static  bit  updata= 0;
   if( PINA && PINB)           //編碼器無轉動退出
   {
     updata = 0;
     return;
   }
   Last_encoder_b = PINB;       //記錄B信號
   while(!PINA)                //等待A由低變高
   {
     Curr_encoder_b = PINB;     //記錄等待期間的B信號(指當前B信號)
     updata = 1; }
   if(updata)
   {
   updata = 0 ;
     if( (Last_encoder_b == 0)&&(Curr_encoder_b== 1) ) //B從0到1為正轉
     {
   if(counter == 255)
       return;
       counter++;          //正轉計數加
     }
     else if( (Last_encoder_b == 1)&&(Curr_encoder_b == 0) ) //B從1到0為反轉
     {
       if(counter == 0)
       return;
       counter--;         //反轉計數減
     }
   }
}
/**********************************************************
主函數
**********************************************************/
void  main(void)
{
   P0 = 0xff;
   P1 = 0xff;
   P2 = 0xff;
   T2CON = 0x00;               //設置T2CON寄存器         
   TH2 = 0xfc;                 //1ms定時
   TL2 = 0x66;
   ET2 = 1;                    //啟用Timer2中斷
   EA = 1;                     //總中斷允許
   TR2 = 1;                    //啟動定時器2
   counter = 0;                //計數單元清零
   while(1)
   {
   scan_encoder();
  if(! PIND)                //當按下旋鈕時
     {
       counter = 0;            //計數單元清零(歸位)
       delayms(10);
     }
   }
}
/*********************************************************
Timer2中斷函數
**********************************************************/
void  timer2() interrupt 5
{
   TR2 = 0;
   TF2 = 0;                         //手工清中斷標志  
   TH2 = 0xfc;                      //1ms定時常數
   TL2 = 0x66;
   if(n >= 3)                       //3位數碼管顯示
   {
     n = 0;
     shift = 0xfe;                  //送位碼初值
     P2 = 0xff;                     //關閉顯示
   }
   else
   {
     display[0] = counter%10;       //個位數據
     display[1] = (counter%100)/10; //十位數據
     display[2] = counter/100;      //百位數據

     if(display[2] == 0)
     {
       display[2] = 0x0a;           //百位為0,不顯示
       if(display[1] == 0)
       display[1]  =0x0a;           //十位為0,不顯示
}
     P0 = LEDData[display[n++]];    //送段碼
     P2 = shift;                    //送位碼
     shift = (shift<<1)|0x01;       //調整位碼
   }

   TR2 = 1;
}


回復

使用道具 舉報

ID:7485 發表于 2016-4-26 21:31 | 顯示全部樓層
把程序里面的time2改為time1或time0即可。
回復

使用道具 舉報

ID:116352 發表于 2016-4-26 22:04 | 顯示全部樓層
ahshmj 發表于 2016-4-26 21:31
把程序里面的time2改為time1或time0即可。

謝謝  這是我改變后的程序  就是我說的那樣


#include <reg51.h>
sbit     PINA    = P1^0;
sbit     PINB    = P1^1;
sbit     PIND    = P1^2;
unsigned char  display[3];
unsigned char  code  LEDData[ ] =
{  0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00
};
char code reserve[3]_at_ 0x3b; //保留0x3b開始的3個字節
  unsigned char  counter;  //編碼器脈沖計數
unsigned char  n,shift;
/**********************************************************
ms延時子函數
**********************************************************/
void delayms(unsigned int ms)
{
  unsigned char k;
  while (ms--)
  {
    for (k = 0; k < 114; k++)
      ;
  }
}
/**********************************************************
掃描編碼器子函數
在編碼器引腳A為低電平期間:
編碼器引腳B從0到1為正轉,編碼器引腳B從1到0為反轉。
**********************************************************/
void scan_encoder(void)
{
   static  bit  Curr_encoder_b;  //定義一個變量來儲存當前B信號
   static  bit  Last_encoder_b;  //定義一個變量來儲存上次B腳信號
   static  bit  updata= 0;
   if( PINA && PINB)           //編碼器無轉動退出
   {
     updata = 0;
     return;
   }
   Last_encoder_b = PINB;       //記錄B信號
   while(!PINA)                //等待A由低變高
   {
     Curr_encoder_b = PINB;     //記錄等待期間的B信號(指當前B信號)
     updata = 1; }
   if(updata)
   {
   updata = 0 ;
     if( (Last_encoder_b == 0)&&(Curr_encoder_b== 1) ) //B從0到1為正轉
     {
   if(counter == 255)
       return;
       counter++;          //正轉計數加
     }
     else if( (Last_encoder_b == 1)&&(Curr_encoder_b == 0) ) //B從1到0為反轉
     {
       if(counter == 0)
       return;
       counter--;         //反轉計數減
     }
   }
}
/**********************************************************
主函數
**********************************************************/
void  main(void)
{
   P0 = 0xff;
   P1 = 0xff;
   P2 = 0xff;
  
           TMOD &= 0xf1;        //設置定時器模式
        TMOD |= 0x01;        //設置定時器模式
        TL0 = (65636-50000)/256;                //設置定時初值
        TH0 = (65636-50000)%256;                //設置定時初值
        TF0 = 0;                //清除TF0標志
        ET0 = 1;
        TR0 = 1;                //定時器0開始計時;               
        EA = 1;  
                        //啟動定時器2
   counter = 0;                //計數單元清零

   while(1)
   {
  scan_encoder() ;
  
   
  if(! PIND)                //當按下旋鈕時
     {
       counter = 0;            //計數單元清零(歸位)
       delayms(10);
     }
   }
    }
/*********************************************************
Timer0中斷函數
**********************************************************/

void  timer0() interrupt 1
{                 TR0 = 0;
              TF0 = 0;           
           TL0 = (65636-50000)/256;                //設置定時初值
        TH0 = (65636-50000)%256;                //設置定時初值
   if(n >= 3)                       //3位數碼管顯示
   {
     n = 0;
     shift = 0xfe;                  //送位碼初值
     P2 = 0xff;                     //關閉顯示
   }
   else
   {
     display[0] = counter%10;       //個位數據
     display[1] = (counter%100)/10; //十位數據
     display[2] = counter/100;      //百位數據
     
     if(display[2] == 0)
     {
       display[2] = 0x0a;           //百位為0,不顯示
       }
           if(display[1] == 0)
       {display[1]  =0x0a;           //十位為0,不顯示
          }
     P0 = LEDData[display[n++]];    //送段碼
     P2 = shift;                    //送位碼
     shift = (shift<<1)|0x01;       //調整位碼
   }  
          TR0 = 1;
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久妞妞 | av网站在线播放 | 久久综合久色欧美综合狠狠 | 国产精品中文字幕在线观看 | 欧美精品在线一区 | 久久久久久国产精品免费免费 | 久草日韩| 99热热热热 | 91精品国产综合久久婷婷香蕉 | 国内在线视频 | 亚洲激情在线 | 久久久精 | 在线观看免费av网 | 国产精品久久福利 | 亚洲区一区二 | 欧美亚洲国产日韩 | 久久福利网站 | 精品一区二区久久久久久久网站 | 四虎影院一区二区 | 亚洲精品日韩视频 | 亚洲福利在线观看 | 国产一区中文 | 91视频久久| 91玖玖 | 久久亚洲欧美日韩精品专区 | 亚洲国产精品久久久久 | 免费在线观看成人 | 久草免费在线 | 91在线色视频| 成人久久18免费网站麻豆 | 日韩激情免费 | 亚洲97| 在线观看精品 | 亚洲黄色在线免费观看 | 久久久久久久久久久高潮一区二区 | 国产精品美女一区二区三区 | 91久久精品国产91久久性色tv | 老司机成人在线 | 欧美亚洲视频 | av在线亚洲天堂 | 黄色免费在线观看 |