我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 2004|回复: 4

8路模拟信号采集器《本人课设》

[复制链接]

该用户从未签到

3

主题

20

回帖

19

积分

一级逆天

积分
19

社区居民

QQ
发表于 2014-12-29 20:33:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  #include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;//声明键盘
sbit LED1=P3^2;
sbit LED2=P3^3;
sbit LED3=P3^4;
sbit LED4=P3^5;    //数码管位选
sbit dp=P1^4;//小数点
static uchar dispdata[4]; //前三位用来存放由转换结果分离出的各位数字,第四位用来存放通道地址
static float Vi[8];//存放8通道采集的数据
unsigned char code num[]=
{
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
}; //数码管0-9编码表
void keyscan();//键盘扫描函数声明
void delayus(uint us)//微秒级延时函数
{
     while(us--);
}
void delayxms(uint xms)//毫秒级延时函数
{
      uint i,j;
    for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
}
/*************************************************************************************************************************
**************************************************************************************************************************
AD部分
**************************************************************************************************************************
**************************************************************************************************************************/
uchar ad_action(uchar chn)//读取通道“chn”的AD转换结果(位0-255之间的一个数),chn为0-7,以P0口的低三位作为地址
{
   uchar read_data;
   XBYTE[0x7ff8+chn]=chn;//向地址指针写地址
   delayus(15);
   read_data=XBYTE[0x7ff8+chn];//读取AD转换的数据,8位二进制数(读取相应通道的AD转换值)
   return read_data;
}
/*****************************************************************************************************************************
**********************************************************************************************************************************
8通道循环采集
***********************************************************************************************************************************
*******************************************************************************************************************************/
void ad0toad7()//将通道 0-7的AD转换结果存入相关数组
{
      uchar i;
      for(i=0;i<8;i++)
      Vi=(ad_action(i)/255.0)*5.0+0.009;//0.009为校准的AD转换误差
}
/**********************************************************************************************************************************
**********************************************************************************************************************************
选择一路通道采集
***********************************************************************************************************************************
************************************************************************************************************************************/
void ad_single(uchar j)
{
  Vi[j]=(ad_action(j)/255.0)*5.0+0.009;//0.009为校准的AD转换误差
}
/***********************************************************************************************************************
*********************************************************************************************************************
分离出每位数码管上的数字,并存入相应的数组
*****************************************************************************************************************
*******************************************************************************************************************/
void decodenum(float adv,uchar chn)//两个形参分别为AD转换的结果(十进制形式 )和相应的通道数,是数码管要显示的数,
//通过该函数的第二个形参来控制地址的显示
{
  uint temp;
  temp=(uint)(adv*100);
  dispdata[0]=temp/100;//第一位数码管
  dispdata[1]=temp/10%10;//第二位数码管
  dispdata[2]=temp%10;//第三位数码管
  dispdata[3]=chn;//第四位数码管
}
/*********************************************************************************
********************************************************************************
数码管显示部分
****************************************************************************************
******************************************************************************************/
void dispone(uchar LED,bit ifpoint,uchar number)//number 0-9,数码管显示函数,数码管为共阴极 ,
//从左到右三个形参分别为数码管位选,数码管小数点,数码管位选
{
  switch(LED)//数码管位选部分
  {
  case 0ED1=0;
          break;
  case 1ED2=0;
          break;
  case 2ED3=0;
          break;
  case 3ED4=0;
          break;
  default3=0xff;//其他情况数码管关闭
}
if(ifpoint)//数码管小数点部分
     dp=1;
else
    dp=0;
    P2=num[number];//数码管位选部分,不含小数点
    delayus(300);
    P3=0xff;//关闭所有数码管
}
void disp()//数码管显示函数
{
  uchar i;
  bit point;
  for(i=0;i<4;i++)//用for循环实现数码管的动态显示
  {
       if((i==1)||(i==3))//让第一个小数点和第二个小数点点亮,如果想让第四个也亮,
    //可改“(i==1)||(i==3)” 为“i==1”
         point=0;
     else
         point=1;
    dispone(i,point,dispdata);
  }
}
/**************************************************************************************
***************************************************************************************
主函数
*************************************************************************************
*************************************************************************************/

void main()
{
  while(1)
  {
       keyscan();
  }
}
void keyscan()//在键盘扫描函数中调用显示函数
{
     uchar flag;
    int num;
    if(key1==0)
        {
            delayxms(5);
            if(key1==0)
            {
                 num++;
                 if(num>7)//num大于7时重新归7
                     num=7;
                while(!key1);//等待按键释放
            }
            ad_single(num);
        }
    if(key2==0)
        {
            delayxms(5);
            if(key2==0)
            {
                 num--;
                 if(num<0)//num小于0时重新归0
                     num=0;
                while(!key2);//等待按键释放
            }
            ad_single(num);
        }  
    if(key3==0)
        {
            delayxms(5);
            if(key3==0)
            {
                flag=0;
                while(!key3);//等待按键释放
            }
        }
     if(key4==0)
        {
            delayxms(5);
            if(key4==0)
            {
                flag=1;
                while(!key4);//等待按键释放
            }
        }
    if(flag==0)
        {
             ad_single(num);
             decodenum(Vi[num],num);
             disp();
        }
    else
    {
         uint cnt=0;
        while(key3)
        {
                switch(cnt++)
        {
            case 0:ad0toad7();
                   break;
             case 1:decodenum(Vi[0],0);
                   break;
            case 70:decodenum(Vi[1],1);
                   break;
               case 140:decodenum(Vi[2],2);
                   break;
            case 210:decodenum(Vi[3],3);
                   break;
            case 280:decodenum(Vi[4],4);
                   break;
            case 350:decodenum(Vi[5],5);
                   break;
               case 420:decodenum(Vi[6],6);
                   break;
            case 490:decodenum(Vi[7],7);
                   break;
             case 560:cnt=0;
                   break;
        }
        disp();
        }
    }
} 电子技术课程设计.rar (1.34 MB, 下载次数: 0)
QQ截图20141229203407.png
回复

使用道具 举报

  • TA的每日心情
    开心
    昨天 09:37
  • 签到天数: 111 天

    [LV.6]常住居民II

    222

    主题

    7034

    回帖

    4万

    积分

    百元学习allegro

    积分
    48089

    终身成就奖特殊贡献奖社区居民忠实会员社区劳模最爱沙发社区明星优秀斑竹奖宣传大使奖

    QQ
    发表于 2014-12-30 06:25:13 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-10-7 21:17
  • 签到天数: 103 天

    [LV.6]常住居民II

    92

    主题

    1万

    回帖

    7万

    积分

    三级逆天

    积分
    73181

    终身成就奖特殊贡献奖原创先锋奖社区居民忠实会员社区劳模最爱沙发社区明星原创达人优秀斑竹奖宣传大使奖

    QQ
    发表于 2014-12-30 08:29:30 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    298

    回帖

    0

    积分

    一级逆天

    积分
    0

    终身成就奖

    QQ
    发表于 2018-5-7 10:57:22 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    298

    回帖

    0

    积分

    一级逆天

    积分
    0

    终身成就奖

    QQ
    发表于 2018-5-7 10:57:31 | 显示全部楼层
    回复

    使用道具 举报

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

    本版积分规则

    每日签到,有金币领取。


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

    平平安安
    TOP
    快速回复 返回顶部 返回列表