找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1884|回复: 0
打印 上一主题 下一主题
收起左侧

ADC转换后于输入数字量比较运算程序

[复制链接]
跳转到指定楼层
楼主
ID:13354 发表于 2018-4-16 15:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

        #include<reg52.h>
        #define uchar unsigned char
        #define uint unsigned int
        sbit key1=P1^0;
        sbit key2=P1^1;
        void delay(uint z);        
        
        uchar keyscan()                      // 键盘扫描程序
        {
                  uchar temp,num;
                  num=17;
              P1=0xfe;                     //   p1.0口置0
                  temp=P1;
                  temp=temp&0xf0;
                 while(temp!=0xf0)
                  {
                      delay(20);
                      temp=P1;        
                          temp=temp&0xf0;     
                          if(temp!=0xf0)
                      {
                      //        delay(10);                      //延迟去抖
                            P1=P1&0xf0;     
                                while(P1!=0xf0);
                              switch(temp)
                                  {
                                          case 0xe0:num=7;break;         //0xf0和0xe0的交处,即p1.0与p1.4的交处
                                          case 0xd0:num=8;break;         // p1.0与p1.5的交处,
        
                                          case 0xb0:num=9;break;
                                          case 0x70:num=15;break;   
                                         default:break;
                                  }
                          }
               else break;
              }
        
                  P1=0xfd;
                  temp=P1;
                  temp=temp&0xf0;
                  while(temp!=0xf0)
                  {
                      delay(20);
                      temp=P1;
                          temp=temp&0xf0;
                          if(temp!=0xf0)
                      {
                              //delay(10);
                                        P1=P1&0xf0;
                                while(P1!=0xf0);
                                  switch(temp)
                                  {
                                          case 0xe0:num=4;break;
                                          case 0xd0:num=5;break;
                                          case 0xb0:num=6;break;
                                          case 0x70:num=14;break;
                                          default:break;
                                  }
                      }
               else break;
                  }
        
              P1=0xfb;
                  temp=P1;
                  temp=temp&0xf0;
                  while(temp!=0xf0)
                  {
              delay(20);
              temp=P1;
                  temp=temp&0xf0;
                  if(temp!=0xf0)
              {
              //delay(10);
                          P1=P1&0xf0;
                                while(P1!=0xf0);
                  switch(temp)
                  {
                  case 0xe0:num=1;break;
                  case 0xd0:num=2;break;
                  case 0xb0:num=3;break;
                  case 0x70:num=13;break;
                  default:break;
                  }
              }
              else break;
                  }
        
              P1=0xf7;
                  temp=P1;
                  temp=temp&0xf0;
                  while(temp!=0xf0)
                  {
              delay(20);
              temp=P1;
                  temp=temp&0xf0;
                  if(temp!=0xf0)
              {
              //delay(10);
                          P1=P1&0xf0;
                        while(P1!=0xf0);
                  switch(temp)
                  {
                  case 0xe0:num=10;break;
                  case 0xd0:num=0;break;
                  case 0xb0:num=11;break;
                  case 0x70:num=12;break;
                  default:break;
                  }
              }
              else break;
                  }
                  return num;
        }
        
        //主程序
         #include<reg52.h>
        #include<absacc.h>
        #include<intrins.h>
        #include<math.h>
        #include"keyscan.h"
        #define uchar unsigned char
        #define uint unsigned int
        #define  dac0832  XBYTE[0X7FFF]    //P2.7作片选,启动DA转换
        #define  int0     XBYTE[0X7FF8]     //结束AD转换,锁存通道0,读出AD值
        uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
                            0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};  //数组table[]存放代码
        uchar temp1,weishu,flag,dot;
        uchar volt[4]={0,0,0,0};
        void delay(uint z)
        {
         uint x,y;
         for(x=z;x>0;x--)
          for(y=110;y>0;y--);
        }
        
        void display(uchar z)              //LED显示函数
        {
         uchar j;
         P2=0xFE;                      //P2.0口置0 ,选择第一个数码管
         for(j=0;j<z;j++)                 // 循环控制
         {
           P0=table[volt[j]];             // 将P0口数据送 LED显示
           delay(6);
           if(j<z-1) P2=_crol_(P2,1);       //判断,依次选择P2.1,P2.2口
         }
        }
        void main()
        {
         uchar keynum,i;
         float voltage,xiaoshu,sum;
         i=0;
         voltage=0;
         temp1=0;
         flag=0;
         weishu=1;      //定义数字量值temp1,进位标志flag,数码管位数weishu等变量
         while(1)
         {  
          dac0832=temp1;                   // 初始值设定为0
          keynum=keyscan();                 //调用键盘扫描函数
          if(keynum==15)                    //如果键值15,代表复位,将p0置0
          {
          P0=0;                             //p0口置0,复位
          while(1)            
          {
           keynum=keyscan();                  //调用键盘扫描函数
           if(keynum>=0&&keynum<=9)          //判断键值
           {
            i++;
            for(weishu=0;weishu<i;weishu++)
        volt[i-weishu-1]=volt[i-weishu-2];
          volt[0]=keynum;                   // 将数值在第一个数码管中显示
              if(flag==0)
        voltage=voltage*10+keynum;
                   else {xiaoshu=pow(10,flag);
        xiaoshu=keynum/xiaoshu;
        sum=sum+xiaoshu;
        flag++;}        
           }                              //  数字处理显示程序
         
           else if(keynum==10)                  //判断按键,如果是点键,10代表点键
           {
             flag++;
                 dot=i;
                 volt[0]=volt[0]+10;                //在第二个数码管 输出显示小数点
        
           }
           else if(keynum==11)               //判断按键,如果是确认键
           {
           weishu=i;
           if(flag==0)
           temp1=23*voltage;
           else
           {
            i=(int)(sum/0.05);
                temp1=23*voltage+i;
           }
           i=0;
           voltage=0;
           sum=0;
           flag=0;
           break;
           }
               if(int0>dac0832)
         {temp1=temp1-1; }
         if(int0<dac0832)
         { temp1=temp1+1;}                 // ADC转换后于输入数字量比较运算程序
         
           display(i);                       //调用显示函数
           
          }  
         else if(keynum==12)                //判断按键,如果是加键
         {
                 temp1=temp1+2;                   // 电压数字量加02H
                 if(weishu==1){volt[1]=volt[0]+10;
        volt[0]=0;
        weishu=2;}                           // 如果是一位数的话,将这个数放到第二个数码管,同时将小数点输出,第一位变为0,位数加一
                 if(weishu==2){volt[0]++;}                 //将第一位LED加1   
                 if(volt[0]==10){volt[1]=volt[1]+1;volt[0]=0;}   //如果第一个数码管是点的话,将第一个数码管加一,小数点去掉
                 if(volt[1]==20){volt[2]=1;volt[1]=10;volt[0]=-1;weishu=3;}
                 if(weishu==3)         
                 {
                 if(dot==1)
                 {
                 volt[1]++;
                 if(volt[1]==10)   
                 {
                 volt[2]++;volt[1]=0;temp1=temp1+2;
                 }
                 }
                 else
                 {
                 volt[0]++;
                 if(volt[0]==10){volt[1]++;volt[0]=0;}
                 }
                 }
         }                              //三位时的处理程序
         else if(keynum==13)              //判断按键,如果减键
         {
             temp1=temp1-2;            // 电压数字量减02H
         if(weishu==1)
        {volt[1]=volt[0]+9;volt[0]=10;weishu=2;}
                 if(weishu==2){volt[0]--;}
                 if(volt[0]<0||volt[0]>9){volt[1]=volt[1]-1;volt[0]=9;}
                 if(weishu==3)
                 {
             if(dot==1)
                 {
                 volt[1]--;
                 if(volt[1]<0||volt[1]>9)
                 {
                 volt[2]--;volt[1]=9;
                 }
                 }
                 else
                 {
                 volt[0]--;
                 if(volt[0]<0||volt[0]>9)
                 {
                 volt[1]--;volt[0]=9;
                 if(volt[1]<10||volt[1]>19) {volt[1]=19;volt[0]=9;weishu=2;}
                 }
                 }
                 }
         }   
        if(int0>dac0832)
         {temp1=temp1-1;
         }
         if(int0<dac0832)
         { temp1=temp1+1;
        }                       // ADC转换后于输入数字量比较运算程序
         display(weishu);        // 调用显示程序,显示位数的值
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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