找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于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模数转换芯片具有误差小,分辨率较高,因此在仪器仪表中有较为广泛的应用。

附件一:程序源代码

  1. #include<reg51.h>   
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit RS=P3^5;   
  6. sbit RW=P3^6;   
  7. sbit E=P3^4;   
  8. sbit BF=P0^7;             //1602忙碌标志位
  9. void delay1ms()
  10. {uchar i,j;
  11.   for(i=0;i<10;i++)
  12.    for(j=0;j<33;j++)
  13. ; }
  14. void delay(uchar n)                //延时n毫秒
  15. {uchar i;
  16. for(i=0;i<n;i++)
  17. delay1ms();}
  18. unsigned char BusyTest(void)   //result=1为忙碌;result=0为不忙碌
  19. {bit result;
  20. RS=0;     
  21. RW=1;                                 //高电平进行读操作
  22. E=1;                       //E=1,才允许读写
  23. _nop_();  
  24. _nop_();
  25. _nop_();
  26. _nop_();   
  27. result=BF;
  28. E=0;
  29. return result;}
  30. void WriteInstruction (uchar dictate)              //写指令
  31. { while(BusyTest()==1);
  32.   RS=0;                      //RS和R/W同时为低电平时,可以写入指令
  33.   RW=0;  
  34.   E=0;                  
  35.   _nop_();
  36.   _nop_();            
  37.   P0=dictate;           
  38.   _nop_();
  39.   _nop_();
  40.   _nop_();
  41.   _nop_();              
  42.   E=1;                  
  43.   _nop_();
  44.   _nop_();
  45.   _nop_();
  46.   _nop_();              
  47.   E=0;}
  48. void WriteAddress(uchar x)                   //写地址
  49. {WriteInstruction(x|0x80);   //显示位置的确定方法规定为"80H+地址码x"
  50. }
  51. void WriteData(uchar y)
  52. { while(BusyTest()==1);
  53.   RS=1;                    //RS为高电平,RW为低电平时,写入数据
  54.    RW=0;
  55.    E=0;           
  56.    P0=y;         
  57.    _nop_();
  58.    _nop_();
  59.    _nop_();
  60.    _nop_();      
  61.    E=1;         
  62.    _nop_();
  63.    _nop_();
  64.    _nop_();
  65.    _nop_();      
  66.    E=0;}
  67. void LcdInitiate(void)                //初始化
  68. {delay(15);            
  69. WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
  70. delay(5);  
  71. WriteInstruction(0x38);
  72. delay(5);
  73. WriteInstruction(0x38);
  74. delay(5);
  75. WriteInstruction(0x0f);  //显示模式设置:显示开,有光标,光标闪烁
  76. delay(5);
  77. WriteInstruction(0x06);  //显示模式设置:光标右移,字符不移
  78. delay(5);
  79. WriteInstruction(0x01);  //清屏幕指令,将以前的显示内容清除
  80. delay(5);}
  81. sbit CLOCK=P1^3;            
  82. sbit DATA_IN=P1^1;
  83. sbit DATA_OUT=P1^0;
  84. sbit CS=P1^2;
  85. void delay1()
  86. {int i=5;
  87. while(i--);}
  88. uint AD_Conver(uchar channel)                            //选择输入通道
  89. {uchar i;
  90. int ad_value=0;
  91. CLOCK=0;
  92. CS=1;
  93. delay1();
  94. CS=0;
  95. channel<<=4;                                                                                    //左移4位
  96. for(i=0;i<12;i++)        
  97. { if(DATA_OUT)ad_value|=1;   
  98.   DATA_IN=(bit)(channel&0x80);                           
  99.   CLOCK=1;                     
  100.   delay1();                     
  101.   CLOCK=0;                    
  102.   channel<<=1;
  103.   ad_value<<=1;}
  104. CLOCK=1;
  105. ad_value>>=1;
  106. return ad_value;                                                                      //返回转换数据
  107. }
  108. void main()
  109. { int ad_result;
  110. uint i;
  111. float ad;
  112. uint num[]={'0','.','0','0','0','0','V',' ',' ',' ',' ',' '};
  113. uint csu[]={' ',' ',' ',' ',' ','C',' ','S',' ','U',' ',' ',' ',' ',' '};
  114. ad_result=AD_Conver(0);
  115. delay(100);
  116. while(1)
  117. {uint sum;
  118.   sum=0;
  119.   for(i=0;i<6;i++)
  120.   {
  121.    ad_result=AD_Conver(0);
  122.    sum+=ad_result;}
  123.   ad=sum*5.0/4096/6;                                                        //4096为2的12次方,6为求平均数
  124.   ad_result=(int)(ad*10000);                               //转换为整形变量
  125.   num[0]=ad_result/10000+'0';
  126.   num[2]=ad_result%10000/1000+'0';
  127.   num[3]=ad_result%1000/100+'0';
  128.   num[4]=ad_result%100/10+'0';
  129.   num[5]=ad_result%10+'0';
  130.   LcdInitiate();         
  131.   WriteAddress(0x80);                                                        //第一行第一列显示
  132.   for(i=0;i<15;i++)
  133.   {WriteData(num[i]);
  134.    delay(850);}
  135.   WriteAddress(0xc0);                                                        //第二行第一列显示
  136.   for(i=0;i<15;i++)
  137.   {WriteData(csu[i]);
  138.    delay(850);}
  139.   delay(10000);}
  140. }
复制代码


附件二:TLC2543时序图



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

基于C语言的89C51与TLC2543AD转换器的驱动程序设计.docx

79.75 KB, 下载次数: 44, 下载积分: 黑币 -5

评分

参与人数 1黑币 +100 收起 理由
admin + 100

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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