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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2300|回復: 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;
}


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

使用道具 舉報

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区久久精品 | 精品无码久久久久久国产 | 亚洲免费在线视频 | 亚洲精品久久久久中文字幕欢迎你 | 成人影院在线 | 在线观看h视频 | 精品欧美一区免费观看α√ | 亚洲精品在线视频 | 国产一区免费 | 欧美成人手机在线 | 日本天堂视频 | 欧美大片久久久 | 999精品网| 国产区精品在线观看 | aaaaaa大片免费看最大的 | 成人国产精品久久久 | 国产精品久久久久久久三级 | 欧美日韩a | 免费黄色a视频 | 精品无码三级在线观看视频 | 一级欧美 | 草久网 | 精品少妇一区二区三区在线播放 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 澳门永久av免费网站 | 99视频免费在线观看 | 精品免费国产 | 久久久久国产精品一区二区 | 天天插日日操 | 久久夜视频 | 怡红院怡春院一级毛片 | 日韩视频在线观看中文字幕 | 国产小视频在线观看 | 国产91久久久久久 | 欧美日韩成人影院 | 午夜伦理影院 | 九一视频在线播放 | 精品一区二区三区av | 久久99精品久久久水蜜桃 | 色婷婷久久久亚洲一区二区三区 | 欧美video |