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

QQ登錄

只需一步,快速開始

帖子
查看: 4855|回復(fù): 6
收起左側(cè)

52單片機(jī)程序改成51的

[復(fù)制鏈接]
ID:116352 發(fā)表于 2016-4-26 16:25 | 顯示全部樓層 |閱讀模式
各位大神 本人新手菜鳥一枚  網(wǎng)上找了52的程序不會(huì)改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個(gè)字節(jié)
unsigned char  counter = 0;     //編碼器脈沖計(jì)數(shù)
unsigned char  n,shift;
/**********************************************************
ms延時(shí)子函數(shù)
**********************************************************/
void delayms(unsigned int ms)
{
  unsigned char k;
  while (ms--)
  {
    for (k = 0; k < 114; k++)
      ;
  }
}
/**********************************************************
掃描編碼器子函數(shù)
在編碼器引腳A為低電平期間:
編碼器引腳B從0到1為正轉(zhuǎn),編碼器引腳B從1到0為反轉(zhuǎn)。
**********************************************************/
void scan_encoder(void)
{
   static  bit  Curr_encoder_b;  //定義一個(gè)變量來儲(chǔ)存當(dāng)前B信號(hào)
   static  bit  Last_encoder_b;  //定義一個(gè)變量來儲(chǔ)存上次B腳信號(hào)
   static  bit  updata= 0;
   if( PINA && PINB)           //編碼器無轉(zhuǎn)動(dòng)退出
   {
     updata = 0;
     return;
   }
   Last_encoder_b = PINB;       //記錄B信號(hào)
   while(!PINA)                //等待A由低變高
   {
     Curr_encoder_b = PINB;     //記錄等待期間的B信號(hào)(指當(dāng)前B信號(hào))
     updata = 1; }
   if(updata)
   {
   updata = 0 ;
     if( (Last_encoder_b == 0)&&(Curr_encoder_b== 1) ) //B從0到1為正轉(zhuǎn)
     {
   if(counter == 255)
       return;
       counter++;          //正轉(zhuǎn)計(jì)數(shù)加
     }
     else if( (Last_encoder_b == 1)&&(Curr_encoder_b == 0) ) //B從1到0為反轉(zhuǎn)
     {
       if(counter == 0)
       return;
       counter--;         //反轉(zhuǎn)計(jì)數(shù)減
     }
   }
}
/**********************************************************
主函數(shù)
**********************************************************/
void  main(void)
{
   P0 = 0xff;
   P1 = 0xff;
   P2 = 0xff;
   T2CON = 0x00;               //設(shè)置T2CON寄存器         
   TH2 = 0xfc;                 //1ms定時(shí)
   TL2 = 0x66;
   ET2 = 1;                    //啟用Timer2中斷
   EA = 1;                     //總中斷允許
   TR2 = 1;                    //啟動(dòng)定時(shí)器2
   counter = 0;                //計(jì)數(shù)單元清零
   while(1)
   {
   scan_encoder();
  if(! PIND)                //當(dāng)按下旋鈕時(shí)
     {
       counter = 0;            //計(jì)數(shù)單元清零(歸位)
       delayms(10);
     }
   }
}
/*********************************************************
Timer2中斷函數(shù)
**********************************************************/
void  timer2() interrupt 5
{
   TR2 = 0;
   TF2 = 0;                         //手工清中斷標(biāo)志  
   TH2 = 0xfc;                      //1ms定時(shí)常數(shù)
   TL2 = 0x66;
   if(n >= 3)                       //3位數(shù)碼管顯示
   {
     n = 0;
     shift = 0xfe;                  //送位碼初值
     P2 = 0xff;                     //關(guān)閉顯示
   }
   else
   {
     display[0] = counter%10;       //個(gè)位數(shù)據(jù)
     display[1] = (counter%100)/10; //十位數(shù)據(jù)
     display[2] = counter/100;      //百位數(shù)據(jù)

     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;       //調(diào)整位碼
   }

   TR2 = 1;
}
回復(fù)

使用道具 舉報(bào)

ID:116780 發(fā)表于 2016-4-26 18:38 | 顯示全部樓層
謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:113802 發(fā)表于 2016-4-26 19:34 | 顯示全部樓層
這什么程序我看不懂

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:113802 發(fā)表于 2016-4-26 19:34 | 顯示全部樓層
什么程序我都看不懂,可以為我解釋一下么

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:7485 發(fā)表于 2016-4-26 20:41 | 顯示全部樓層
52和51的區(qū)別主要的有內(nèi)存不同,8052多了一個(gè)T2定時(shí)器,片內(nèi)程序存儲(chǔ)器ROM為8K,片內(nèi)RAM為256字節(jié),你的這段程序?qū)ζ瑑?nèi)RAM和ROM問題都不大,主要是用到了T2,(T2和T1、T0相比較有些功能比較好用,比如16位自動(dòng)重裝載,消除了賦初值的誤差。但是你所給的程序里面沒有使用這一功能)。你可以將T2改成T0或T1即可。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:116352 發(fā)表于 2016-4-26 21:28 | 顯示全部樓層
ahshmj 發(fā)表于 2016-4-26 20:41
52和51的區(qū)別主要的有內(nèi)存不同,8052多了一個(gè)T2定時(shí)器,片內(nèi)程序存儲(chǔ)器ROM為8K,片內(nèi)RAM為256字節(jié),你的這段 ...

首先謝謝  但是我改了  一一對(duì)應(yīng)的改過來 他就不工作的  數(shù)碼管一閃一閃的
  P0 = 0xff;
   P1 = 0xff;
   P2 = 0xff;
  
           TMOD &= 0xf1;        //設(shè)置定時(shí)器模式
        TMOD |= 0x01;        //設(shè)置定時(shí)器模式
        TL0 = (65636-50000)/256;                //設(shè)置定時(shí)初值
        TH0 = (65636-50000)%256;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        ET0 = 1;
        TR0 = 1;                //定時(shí)器0開始計(jì)時(shí);               
        EA = 1;  
                        //啟動(dòng)定時(shí)器2
   counter = 0;                //計(jì)數(shù)單元清零

   while(1)

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:116352 發(fā)表于 2016-4-26 21:29 | 顯示全部樓層
50429334 發(fā)表于 2016-4-26 19:34
這什么程序我看不懂

這是一個(gè)用52讀取旋轉(zhuǎn)編碼器的程序

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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