找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4153|回复: 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;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
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 单片机教程网

快速回复 返回顶部 返回列表