单片机学习小组
直播中

孙世珍

7年用户 204经验值
私信 关注

基于C语言的89C51与TLC2543AD转换器的驱动程序设计文件下载

电子信息技术综合实训报告

竞赛题名称:基于C语言的89C51与TLC2543AD转换器的驱动程序的设计

队员名称:

评阅人签名:

  • 设计思路描述:
设计思路:

硬件部分基于80C51单片机和TLC2543组成多路数据采集系统,采用89C51作为控制部件,控制数据的采集、显示、传输,它是整个系统的核心。由TLC2543作为此数据采集系统的A/D转换芯片,进行模数转换得到模拟信号测量值,它使用开关电容逐次逼近技术完成A/D转换过程由于是串行输入结构,能够节省51系列单片机的I/O资源。硬件设计的主要任务是TLC2543和单片机的接口电路设计,输入信号的调理电路设计。

软件部分主要涉及A/D转换程序的编写,1602LCD驱动的编写,从TLC2543所接收数据的处理等。

原理框图:见图1。

  

图1 模数转换系统框图

  • 硬件电路图:
proteusEDA工具软件所绘制原理图,见图2。

  
图2 模数转换系统原理图

  • 算法数学描述:
算法1:

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

{

  ad_result=AD_Conver(0);

  sum+=ad_result;

}

ad=sum*5.0/4096/6;

说明:对TLC2543的返回值ad_result进行求和,然后取平均数。

算法2:

num[0]=ad_result/10000+'0';

num[2]=ad_result%10000/1000+'0';

num[3]=ad_result%1000/100+'0';

num[4]=ad_result%100/10+'0';

num[5]=ad_result%10+'0';

说明:分别求出LCD显示数值各位的数值。

  • 软件流程图:
1602LCD程序流程图,见图3。

  

图3 1602LCD程序流程图

主程序流程图,见图4。

  

图4 主程序流程图

  • 测试方法描述:(含模块与系统测试方法)
由探针对模拟信号输入端口进行电压测量,数值为2.71192V,见图5。

  

图5

对模拟信号采样并处理,得模拟信号输入端口电压测量值为2.7111V,见图6。

  

图6

  • 测试数据:
滑动滑动变阻器改变模拟输入端口电压,共测得数据5组数据,见表1。

探针测量值(V)


2.7119


2.4265


2.1410


1.8556


1.5703


LCD示值(V)


2.7111


2.4255


2.1398


1.8554


1.5698


表1

  • 数据分析与结论:
测试数据分析:

  
=0.0008

  
=0.0001

  
=0.0012  (舍去)

  
=0.0002

  
=0.0005

误差平均值:+++  
0.0008

结论:由以上计算结果可知,该系统误差较小,能满足日常所需的测量精度要求,同时反映出TLC2543模数转换芯片具有误差小,分辨率较高,因此在仪器仪表中有较为广泛的应用。


附件一:程序源代码

  • #include
  • #include
  • #define uchar unsigned char
  • #define uint unsigned int
  • ***it RS=P3^5;
  • ***it RW=P3^6;
  • ***it E=P3^4;
  • ***it BF=P0^7;             //1602忙碌标志位
  • void delay1ms()
  • {uchar i,j;
  •   for(i=0;i<10;i++)
  •    for(j=0;j<33;j++)
  • ; }
  • void delay(uchar n)                //延时n毫秒
  • {uchar i;
  • for(i=0;idelay1ms();}
  • unsigned char BusyTest(void)   //result=1为忙碌;result=0为不忙碌
  • {bit result;
  • RS=0;
  • RW=1;                                 //高电平进行读操作
  • E=1;                       //E=1,才允许读写
  • _nop_();
  • _nop_();
  • _nop_();
  • _nop_();
  • result=BF;
  • E=0;
  • return result;}
  • void WriteInstruction (uchar dictate)              //写指令
  • { while(BusyTest()==1);
  •   RS=0;                      //RS和R/W同时为低电平时,可以写入指令
  •   RW=0;
  •   E=0;
  •   _nop_();
  •   _nop_();
  •   P0=dictate;
  •   _nop_();
  •   _nop_();
  •   _nop_();
  •   _nop_();
  •   E=1;
  •   _nop_();
  •   _nop_();
  •   _nop_();
  •   _nop_();
  •   E=0;}
  • void WriteAddress(uchar x)                   //写地址
  • {WriteInstruction(x|0x80);   //显示位置的确定方法规定为"80H+地址码x"
  • }
  • void WriteData(uchar y)
  • { while(BusyTest()==1);
  •   RS=1;                    //RS为高电平,RW为低电平时,写入数据
  •    RW=0;
  •    E=0;
  •    P0=y;
  •    _nop_();
  •    _nop_();
  •    _nop_();
  •    _nop_();
  •    E=1;
  •    _nop_();
  •    _nop_();
  •    _nop_();
  •    _nop_();
  •    E=0;}
  • void LcdInitiate(void)                //初始化
  • {delay(15);
  • WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
  • delay(5);
  • WriteInstruction(0x38);
  • delay(5);
  • WriteInstruction(0x38);
  • delay(5);
  • WriteInstruction(0x0f);  //显示模式设置:显示开,有光标,光标闪烁
  • delay(5);
  • WriteInstruction(0x06);  //显示模式设置:光标右移,字符不移
  • delay(5);
  • WriteInstruction(0x01);  //清屏幕指令,将以前的显示内容清除
  • delay(5);}
  • ***it CLOCK=P1^3;
  • ***it DATA_IN=P1^1;
  • ***it DATA_OUT=P1^0;
  • ***it CS=P1^2;
  • void delay1()
  • {int i=5;
  • while(i--);}
  • uint AD_Conver(uchar channel)                            //选择输入通道
  • {uchar i;
  • int ad_value=0;
  • CLOCK=0;
  • CS=1;
  • delay1();
  • CS=0;
  • channel<<=4;                                                                                    //左移4位
  • for(i=0;i<12;i++)
  • { if(DATA_OUT)ad_value|=1;
  •   DATA_IN=(bit)(channel&0x80);
  •   CLOCK=1;
  •   delay1();
  •   CLOCK=0;
  •   channel<<=1;
  •   ad_value<<=1;}
  • CLOCK=1;
  • ad_value>>=1;
  • return ad_value;                                                                      //返回转换数据
  • }
  • void main()
  • { int ad_result;
  • uint i;
  • float ad;
  • uint num[]={'0','.','0','0','0','0','V',' ',' ',' ',' ',' '};
  • uint csu[]={' ',' ',' ',' ',' ','C',' ','S',' ','U',' ',' ',' ',' ',' '};
  • ad_result=AD_Conver(0);
  • delay(100);
  • while(1)
  • {uint sum;
  •   sum=0;
  •   for(i=0;i<6;i++)
  •   {
  •    ad_result=AD_Conver(0);
  •    sum+=ad_result;}
  •   ad=sum*5.0/4096/6;                                                        //4096为2的12次方,6为求平均数
  •   ad_result=(int)(ad*10000);                               //转换为整形变量
  •   num[0]=ad_result/10000+'0';
  •   num[2]=ad_result%10000/1000+'0';
  •   num[3]=ad_result%1000/100+'0';
  •   num[4]=ad_result%100/10+'0';
  •   num[5]=ad_result%10+'0';
  •   LcdInitiate();
  •   WriteAddress(0x80);                                                        //第一行第一列显示
  •   for(i=0;i<15;i++)
  •   {WriteData(num);
  •    delay(850);}
  •   WriteAddress(0xc0);                                                        //第二行第一列显示
  •   for(i=0;i<15;i++)
  •   {WriteData(csu);
  •    delay(850);}
  •   delay(10000);}
  • }





附件二:TLC2543时序图

  



完整版本的论文请下载附件:

        基于C语言的89C51与TLC2543AD转换器的驱动程序设计.docx
  2016-6-1 09:54 上传
点击文件名下载附件



79.75 KB, 下载次数: 12

更多回帖

发帖
×
20
完善资料,
赚取积分