用单片机做模数转换,脉冲信号,数码管显示,咋做?各位帮忙啊!!!

还有很多问题啊,用51单片机,数码管三位七段,共阴,5V直流电,有程序最好,做出来就行,急,谢谢了我想要个整体的接线图啊... 还有很多问题啊,用51单片机,数码管三位七段,共阴,5V直流电,有程序最好,做出来就行,急,谢谢了
我想要个整体的接线图啊
展开
 我来答
aidby2004
2010-03-12 · TA获得超过872个赞
知道小有建树答主
回答量:284
采纳率:0%
帮助的人:122万
展开全部

/********************************************************************

* 文件名  : TLC549.c

* 描述    :  该程序实现了对TLC549的控制。通过TLC549把电压转换为数字信号

    并通过数码管显示出来。实际工作中进行AD采样时,一般都要把

    AD信号处理后再用。在这里,我们采集了30次,去掉最大和最小的5个,

    中间20个取平均值,最大限度的保证了所要采集AD的准确性。

***********************************************************************/

#include<reg52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint  unsigned int 

sbit AD_Out = P3^2;    //TLC549输出端

sbit CS = P1^0;     //TLC549片选信号

sbit AD_In = P1^1;    //TLC549输入端

uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};

uchar code table_d[10] = {0x02, 0x9e, 0x24, 0x0c, 0x98, 0x48, 0x40, 0x1e, 0x00, 0x08};     //带点数码管显示

/********************************************************************

* 名称 : AD_Change(void)

* 功能 : TLC549驱动程序,在“视频及教程”中有讲解。

* 输入 : 无

* 输出 : temp (电压值)

***********************************************************************/

uchar AD_Change(void)

{

 uchar i,temp = 0;

 CS = 0;

 _nop_();

 _nop_();

 _nop_();

 _nop_();

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

 {

  AD_In = 1;

  _nop_();

  _nop_();

  temp = temp << 1;

  if(AD_Out == 1) temp += 1;

  AD_In = 0;

  _nop_();

  _nop_();

 }

 CS = 1;

 return temp; 

}

/********************************************************************

* 名称 : Delay()

* 功能 : 延时,延时时间为 1ms * del

* 输入 : del

* 输出 : 无

***********************************************************************/

void Delay(uint del)

{

 uchar i, j;

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

 for(j=0; j<=148; j++)

 ; 

}

/***********************************************************************

* 名 称: Average()

* 功 能: 中位值平均滤波法,取一共三十个数据,最大和最小的五个数据不要

   对中间的二十个数据求平均值

* 输 入: 三十个待处理的值

* 输 出:得到一个中位的平均值

***********************************************************************/

uint Average(uint buffer[30])

{

 uchar i,j;

 uint temp;

 for(i=1; i<30; i++)    ////先对整个数组的三十个值进行从小到大的排列

  for(j=29; j>=i; --j)

  {

   if(buffer[j-1] > buffer[j])

   {

    temp = buffer[j-1];

    buffer[j-1] = buffer[j];

    buffer[j] = temp;

   }

  }

 ////对数组进行处理,去掉一个最大值和一个最小值,中间的二十个值再来求平均值

 temp = 0;

 for(i=5; i<25; i++)

 {

  temp += buffer[i];

 }   

 temp = (uint)(((float)temp) / 20 + 0.5);

 return(temp);

}

/***********************************************************************

* 名 称: AD_Filter()

* 功 能: 进行AD采集30次,并进行滤波处理

* 输 入: 三十次AD采集值

* 输 出:经过处理后的AD值

***********************************************************************/

uint AD_Filter()

{

 uint Date_Buffer[30] = {0}, temp;   

 uchar i;

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

 {

  Date_Buffer[i] = AD_Change();

  Delay(1); //延时1毫秒采集一次。这里可以根据工作需要调整时间。

 }

 temp = Average(Date_Buffer);  

 return(temp);

}

/********************************************************************

* 名称 : Main()

* 功能 : 主函数

* 输入 : 无

* 输出 : 无

***********************************************************************/

void Main()

{

 

 uint i = 0,temp; 

 uint j;

 P2 = 0x00;

 P1 = 0xff;

 while(1)

 {

  temp = AD_Filter();

  j = temp * 2;

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

  {

   P0 = table_d[j / 100];

   P2 = 0x04;

   Delay(10);

   P0 = table[j/ 10 % 10];

   P2 = 0x02;

   Delay(10);

   P0 = table[j % 10];

   P2 = 0x01;

   Delay(10);

  }

 }

}

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式