3248|2

5

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

各位大侠看看有什么问题 [复制链接]

下面是小虾我写的个代码,主要是测量电流和温度,温度转换函数我还没最后确定就没写出来,P1口是采集端,用P37控制采集端(采集电流/温度),P0和P0口是复用端口,P36控制数码管(显示温度/电流),由于我采集的温度不可能超过200度,所以我的百位是用P30,P31控制的,在用KEIL和PROTEUS仿真时,总是出不来正确的。
  #include "reg51.h"

  #define uint unsigned int

  #define uchar unsigned char

  code uchar showdata[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x0,0x10};//,0x08,0x03,0x46,0x21,0x06,0x0e};

  sbit P37=P3^7;   //选通采集通道,P37为0,选通电流采集通道,为1,选通温度采集通道

  sbit P36=P3^6;     //选通数码管

  sbit P35=P3^5;                //温度报警控制

  sbit P34=P3^4;      //电流报警控制

  sbit P30=P3^0;                //P30,P31为控制温度的百位,一般温度不会超过两百度

  sbit P31=P3^1;

  uchar n0;

  uchar tt=0;

  uchar n1=10;

  void delay(uchar m)

  {

   uint n;

        for (;m>0;m--)
          
             for (n=0;n<650;n++)

                 {};

  }

        void showI(uchar val)

        {
       
          P36=0;                    //选通显示电流数码管

          n0=val;

          if(n0>13)

         {
         
          P34=0;                                         //电流报警                          

          delay(2000);

         }

          if(n0<10)

          {
          
          P0=showdata[n0];

          P2=0xff;

          delay(1000);                              //调整数值,控制数码管的通电时间;      

          P0=0xff;

          P2=0xff;

          P34=1;

      P37=1;                               //选通采集温度通道;

          n0 =0;

          }

      if(n0>9)

          {                 

          #pragma ASM

      PUSH ACC

          PUSH B

          MOV A,n0

          MOV B,n1

          DIV AB

          MOV n0,A

          MOV n1,B

          POP B

          POP ACC

          #pragma ENDASM                           
          
          P0=showdata[n1];

          P2=showdata[n0];
          
          delay(1000);                              //调整数值,控制数码管的通电时间;      

          P0=0xff;

          P2=0xff;

          P34=1;

      P37=1;                               //选通采集温度通道;       

          n0 = 0;

          }

          }

          
         

  void showT(uchar value2)

          {          

          P0=0xff;

              P2=0xff;

              P30=1;

              P31=1;
          
              P36=1;                            //选通数码管

              n0=value2;
  


         if(n0<10)

{

          P0=showdata[n0];

          P2=showdata[n1];

                  delay(1000);         

                  P0=0xff;

                  P2=0xff;
                       
                        P37 = 0;               //选通采集电流

                        P35 = 1;

                        P36 = 0;

                        n0 = 0;

}

          else if(n0-9>0&&n0-100<0)

           {

          #pragma ASM

          PUSH ACC

              PUSH B

              MOV A,n0

              MOV B,n1

              DIV AB

              MOV n0,A

              MOV n1,B

                  MOV A,0xff
       
                  MOV B,0xff

              POP B

              POP ACC

              #pragma ENDASM                                  

              P2 = showdata[n0];

              P0 = showdata[n1];

                  delay(1000);         //数码管通电持续时间

                  P0=0xff;

                  P2=0xff;
                       
                        P37 = 0;               //选通采集电流

                        P35 = 1;

                        P36 = 0;

                        n0 = 0;

                }

                   else         if(n0-100>0)

                {

                  if (n0>120)

                {
                 
                  P35=0;                 //p35点亮温度报警指示灯

                  }

                        P30=0;

                        P31=0;

                        n0=n0-100;

                   #pragma ASM

           PUSH ACC

               PUSH B

               MOV A,n0

               MOV B,n1

               DIV AB

               MOV n0,A

               MOV n1,B

                   MOV A,0xff

                   MOV A,0xff

               POP B

               POP ACC

               #pragma ENDASM                               

                        P2 = showdata[n0];

                        P0 = showdata[n1];


                       
                        delay(1000);       

                        P30 = 1;

                        P31 = 1;

                        P0=0xff;

                        P2=0xff;
                       
                        P37 = 0;               //选通采集电流

                        P35 = 1;

                        P36 = 0;

                        n0 = 0;

                        }                                                               
         
           }         

           void  init()

{

     P0 = 0xff;

         P2 = 0xff;

         P30 = 1;

         P31 = 1;

         P34 = 1;

         P35 = 1;

         P36 = 1;                        //选通温度数码管

         P37 = 1;                   //进行温度采集

}


    void main ()

        {

         void showI(uchar val);

     void showT(uchar val);

         void init();

     uchar i=0;

         uchar eyv;
                
         init();

         showI(54);

         showT(45);

         for(i=0;i<10;i++)   

         {

     eyv=P1=0x17;

         if (P37==0)                //采集的电流;

       {

                 tt=eyv>tt?eyv:tt;

                 showI(tt);

           }

          else

             showT(eyv);

          }


}
此帖出自单片机论坛

最新回复

1、建议你使用真实的电路去做 很多人在protues使用的时候 积累了很多的宝贵经验 但是在实际中不能使用 2、使用KEIL C的时候 取 十位和各位数就是取商或者取余数 比如一个数: i=(K%100)/10  这个就是十位 j=((k%100)%10 这个就是个位  详情 回复 发表于 2009-3-17 16:12
点赞 关注
 

回复
举报

5

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

Re: 各位大侠看看有什么问题

还有就是取得十位和各位的计算方法,那位大侠有没有什么更好的方法。汇编里面有BCD码转换,我感觉也不好使用,我采集的数据是二进制的,不好转换。
汇编部分不好弄,如果作为一个单独函数,要返回两个值,我也想过把两个值揉成一个值,感觉很麻烦。
此帖出自单片机论坛
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

板凳
 

Re: 各位大侠看看有什么问题

1、建议你使用真实的电路去做 很多人在protues使用的时候 积累了很多的宝贵经验 但是在实际中不能使用
2、使用KEIL C的时候 取 十位和各位数就是取商或者取余数
比如一个数:
i=(K%100)/10  这个就是十位
j=((k%100)%10 这个就是个位
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表