找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8061|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于C語(yǔ)言的89C51與TLC2543AD轉(zhuǎn)換器的驅(qū)動(dòng)程序的設(shè)計(jì) 實(shí)訓(xùn)報(bào)告

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
電子信息技術(shù)綜合實(shí)訓(xùn)報(bào)告
競(jìng)賽題名稱:基于C語(yǔ)言的89C51與TLC2543AD轉(zhuǎn)換器的驅(qū)動(dòng)程序的設(shè)計(jì)
隊(duì)員名稱:
評(píng)閱人簽名:
  • 設(shè)計(jì)思路描述:

設(shè)計(jì)思路:

硬件部分基于80C51單片機(jī)和TLC2543組成多路數(shù)據(jù)采集系統(tǒng),采用89C51作為控制部件,控制數(shù)據(jù)的采集、顯示、傳輸,它是整個(gè)系統(tǒng)的核心。由TLC2543作為此數(shù)據(jù)采集系統(tǒng)的A/D轉(zhuǎn)換芯片,進(jìn)行模數(shù)轉(zhuǎn)換得到模擬信號(hào)測(cè)量值,它使用開(kāi)關(guān)電容逐次逼近技術(shù)完成A/D轉(zhuǎn)換過(guò)程由于是串行輸入結(jié)構(gòu),能夠節(jié)省51系列單片機(jī)的I/O資源。硬件設(shè)計(jì)的主要任務(wù)是TLC2543和單片機(jī)的接口電路設(shè)計(jì),輸入信號(hào)的調(diào)理電路設(shè)計(jì)。

軟件部分主要涉及A/D轉(zhuǎn)換程序的編寫,1602LCD驅(qū)動(dòng)的編寫,從TLC2543所接收數(shù)據(jù)的處理等。

原理框圖:見(jiàn)圖1。

圖1 模數(shù)轉(zhuǎn)換系統(tǒng)框圖

  • 硬件電路圖:

由ProteusEDA工具軟件所繪制原理圖,見(jiàn)圖2。

圖2 模數(shù)轉(zhuǎn)換系統(tǒng)原理圖

  • 算法數(shù)學(xué)描述:

算法1:

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

{

  ad_result=AD_Conver(0);

  sum+=ad_result;

}

ad=sum*5.0/4096/6;

說(shuō)明:對(duì)TLC2543的返回值ad_result進(jìn)行求和,然后取平均數(shù)。

算法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';

說(shuō)明:分別求出LCD顯示數(shù)值各位的數(shù)值。

  • 軟件流程圖:

1602LCD程序流程圖,見(jiàn)圖3。

圖3 1602LCD程序流程圖

主程序流程圖,見(jiàn)圖4。

圖4 主程序流程圖

  • 測(cè)試方法描述:(含模塊與系統(tǒng)測(cè)試方法)

由探針對(duì)模擬信號(hào)輸入端口進(jìn)行電壓測(cè)量,數(shù)值為2.71192V,見(jiàn)圖5。

圖5

對(duì)模擬信號(hào)采樣并處理,得模擬信號(hào)輸入端口電壓測(cè)量值為2.7111V,見(jiàn)圖6。

圖6

  • 測(cè)試數(shù)據(jù):

滑動(dòng)滑動(dòng)變阻器改變模擬輸入端口電壓,共測(cè)得數(shù)據(jù)5組數(shù)據(jù),見(jiàn)表1。

探針測(cè)量值(V)

2.7119

2.4265

2.1410

1.8556

1.5703

LCD示值(V)

2.7111

2.4255

2.1398

1.8554

1.5698

表1

  • 數(shù)據(jù)分析與結(jié)論:

測(cè)試數(shù)據(jù)分析:

=0.0008

=0.0001

=0.0012  (舍去)

=0.0002

=0.0005

誤差平均值:+++

0.0008

結(jié)論:由以上計(jì)算結(jié)果可知,該系統(tǒng)誤差較小,能滿足日常所需的測(cè)量精度要求,同時(shí)反映出TLC2543模數(shù)轉(zhuǎn)換芯片具有誤差小,分辨率較高,因此在儀器儀表中有較為廣泛的應(yīng)用。

附件一:程序源代碼

  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忙碌標(biāo)志位
  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)                //延時(shí)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;                                 //高電平進(jìn)行讀操作
  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同時(shí)為低電平時(shí),可以寫入指令
  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);   //顯示位置的確定方法規(guī)定為"80H+地址碼x"
  50. }
  51. void WriteData(uchar y)
  52. { while(BusyTest()==1);
  53.   RS=1;                    //RS為高電平,RW為低電平時(shí),寫入數(shù)據(jù)
  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); //顯示模式設(shè)置:16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口
  70. delay(5);  
  71. WriteInstruction(0x38);
  72. delay(5);
  73. WriteInstruction(0x38);
  74. delay(5);
  75. WriteInstruction(0x0f);  //顯示模式設(shè)置:顯示開(kāi),有光標(biāo),光標(biāo)閃爍
  76. delay(5);
  77. WriteInstruction(0x06);  //顯示模式設(shè)置:光標(biāo)右移,字符不移
  78. delay(5);
  79. WriteInstruction(0x01);  //清屏幕指令,將以前的顯示內(nèi)容清除
  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;                                                                      //返回轉(zhuǎn)換數(shù)據(jù)
  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為求平均數(shù)
  124.   ad_result=(int)(ad*10000);                               //轉(zhuǎn)換為整形變量
  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. }
復(fù)制代碼


附件二:TLC2543時(shí)序圖



完整版本的論文請(qǐng)下載附件:

基于C語(yǔ)言的89C51與TLC2543AD轉(zhuǎn)換器的驅(qū)動(dòng)程序設(shè)計(jì).docx

79.75 KB, 下載次數(shù): 44, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表