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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4805|回復: 6
收起左側

52單片機程序改成51的

[復制鏈接]
ID:116352 發表于 2016-4-26 16:25 | 顯示全部樓層 |閱讀模式
各位大神 本人新手菜鳥一枚  網上找了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:116780 發表于 2016-4-26 18:38 | 顯示全部樓層
謝謝樓主
回復

使用道具 舉報

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

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:116352 發表于 2016-4-26 21:28 | 顯示全部樓層
ahshmj 發表于 2016-4-26 20:41
52和51的區別主要的有內存不同,8052多了一個T2定時器,片內程序存儲器ROM為8K,片內RAM為256字節,你的這段 ...

首先謝謝  但是我改了  一一對應的改過來 他就不工作的  數碼管一閃一閃的
  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)

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

這是一個用52讀取旋轉編碼器的程序

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本人做爰大片免费观看一老师 | 精品免费av| 国产在线精品一区二区 | 亚洲精品一区二区三区 | 精品视频一区二区三区四区 | 亚洲欧美激情视频 | 日韩免费一区二区 | 91精品国产综合久久国产大片 | 亚洲精品黄色 | 国产精品美女久久久久久免费 | 成人h动漫精品一区二区器材 | 羞羞视频网站在线观看 | 在线一区视频 | 免费在线一区二区 | 精久久久| 国产欧美精品在线观看 | ww 255hh 在线观看 | 日日夜精品视频 | 国产视频精品在线观看 | 三级特黄特色视频 | 天天爽夜夜骑 | 欧美视频成人 | 在线中文一区 | 一区二区国产精品 | 黑人巨大精品欧美一区二区免费 | 日韩在线视频免费观看 | 久www| 一区精品视频在线观看 | 久在线视频播放免费视频 | 亚洲va欧美va天堂v国产综合 | 黄色精品| 伊人狠狠操 | 中文字幕欧美一区 | 福利在线看 | 羞羞的视频在线观看 | 成人精品鲁一区一区二区 | 久久另类| 羞羞视频在线观看网站 | 伦理二区 | 色综合久久久久 | 国产欧美精品一区二区三区 |