欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

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

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

用lcd1602和adc0808設(shè)計(jì)的數(shù)字電壓表

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:317943 發(fā)表于 2018-6-4 12:43 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  • 點(diǎn)名,復(fù)習(xí)
  • ADC0832的引腳及其功能,以及與單片機(jī)的硬件連接
引言:
數(shù)字電壓表的基本工作原理是利用A/D轉(zhuǎn)換電路將待測(cè)的模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),通過(guò)相應(yīng)換算后將測(cè)試結(jié)果以數(shù)字形式顯示出來(lái)的一種電壓表。較之于一般的模擬電壓表,數(shù)字電壓表具有精度高、測(cè)量準(zhǔn)確、讀數(shù)直觀、使用方便等優(yōu)點(diǎn)。數(shù)字電壓表的核心部件是A/D轉(zhuǎn)換器,由于各種不同的A/D轉(zhuǎn)換原理構(gòu)成了各種不同類型的DVM。一般說(shuō)來(lái),A/D轉(zhuǎn)換的方式可分為兩類:積分式和逐次逼近式。
積分式A/D轉(zhuǎn)換器是先用積分器將輸入的模擬電壓轉(zhuǎn)換成時(shí)間或頻率,再將其數(shù)字化。根據(jù)轉(zhuǎn)化的中間量不同,它又分為U-T(電壓-時(shí)間)式和U-F(電壓-頻率)式兩種。
逐次逼近式A/D轉(zhuǎn)換器分為比較式和斜坡電壓式,根據(jù)不同的工作原理,比較式又分為逐次比較式及零平衡式等。斜坡電壓式又分為線性斜坡式和階梯斜坡式兩種。
在高精度數(shù)字電壓表中,常采用由積分式和比較式相結(jié)合起來(lái)的復(fù)合式A/D轉(zhuǎn)換器。本設(shè)計(jì)以AT89C51單片機(jī)為核心,以逐次比較型A/D轉(zhuǎn)換器ADC0808、液晶顯示器LCD1602為主體,構(gòu)造了一款簡(jiǎn)易的數(shù)字電壓表,能夠測(cè)量1路0~5V直流電壓,最小分辨率0.02V。
  • 新課講授
6.2基于LCD1602和ADC0808設(shè)計(jì)的數(shù)字電壓表
逐次逼近型A/D轉(zhuǎn)換器屬于直接型A/D轉(zhuǎn)換器,它能把輸入的模擬電壓直接轉(zhuǎn)換為輸出的數(shù)字代碼,而不需要經(jīng)過(guò)中間變量。主要由比較器、環(huán)形分配器、控制門、寄存器與D/A轉(zhuǎn)換器組成。
6.2.1 ADC0808簡(jiǎn)介
1、主要技術(shù)指標(biāo)和特性
(1)分辨率: 8位。
(2)總的不可調(diào)誤差: ADC0808為±LSB,ADC 0809為±1LSB。
(3)轉(zhuǎn)換時(shí)間: 取決于芯片時(shí)鐘頻率,如CLK=500kHz時(shí),TCONV=128μs。
(4)單一電源: +5V。
(5)模擬輸入電壓范圍: 單極性0~5V;雙極性±5V,±10V(需外加一定電路)。
(6)具有可控三態(tài)輸出緩存器。
(7)啟動(dòng)轉(zhuǎn)換控制為脈沖式(正脈沖),上升沿使所有內(nèi)部寄存器清零,下降沿使A/D轉(zhuǎn)換開(kāi)始。
(8)使用時(shí)不需進(jìn)行零點(diǎn)和滿刻度調(diào)節(jié)。
2、ADC0808引腳功能
                         圖6-2-1 ADC0808引腳圖
(1)IN0~I(xiàn)N7——8路模擬輸入,通過(guò)3根地址譯碼線ADDA、ADDB、ADDC來(lái)選通一路。
(2)D7~D0——A/D轉(zhuǎn)換后的數(shù)據(jù)輸出端,為三態(tài)可控輸出,故可直接和微處理器數(shù)據(jù)線連接。8位排列順序是D7為最高位,D0為最低位。
(3)ADDA、ADDB、ADDC——模擬通道選擇地址信號(hào),ADDA為低位,ADDC為高位。地址信號(hào)與選中通道對(duì)應(yīng)關(guān)系如表11.3所示。
(4)VR(+)、VR(-)——正、負(fù)參考電壓輸入端,用于提供片內(nèi)DAC電阻網(wǎng)絡(luò)的基準(zhǔn)電壓。在單極性輸入時(shí),VR(+)=5V,VR(-)=0V;雙極性輸入時(shí),VR(+)、VR(-)分別接正、負(fù)極性的參考電壓。
表6-1-1  地址信號(hào)與選中通道的關(guān)系
地    址
選中通道
ADDC
ADDB
ADDA
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
IN0
IN1
IN2
IN3
IN4
IN5
IN6
IN7

(5)ALE——地址鎖存允許信號(hào),高電平有效。當(dāng)此信號(hào)有效時(shí),A、B、C三位地址信號(hào)被鎖存,譯碼選通對(duì)應(yīng)模擬通道。在使用時(shí),該信號(hào)常和START信號(hào)連在一起,以便同時(shí)鎖存通道地址和啟動(dòng)A/D轉(zhuǎn)換。
(6)START——A/D轉(zhuǎn)換啟動(dòng)信號(hào),正脈沖有效。加于該端的脈沖的上升沿使逐次逼近寄存器清零,下降沿開(kāi)始A/D轉(zhuǎn)換。如正在進(jìn)行轉(zhuǎn)換時(shí)又接到新的啟動(dòng)脈沖,則原來(lái)的轉(zhuǎn)換進(jìn)程被中止,重新從頭開(kāi)始轉(zhuǎn)換。
(7)EOC——轉(zhuǎn)換結(jié)束信號(hào),高電平有效。該信號(hào)在A/D轉(zhuǎn)換過(guò)程中為低電平,其余時(shí)間為高電平。該信號(hào)可作為被CPU查詢的狀態(tài)信號(hào),也可作為對(duì)CPU的中斷請(qǐng)求信號(hào)。在需要對(duì)某個(gè)模擬量不斷采樣、轉(zhuǎn)換的情況下,EOC也可作為啟動(dòng)信號(hào)反饋接到START端,但在剛加電時(shí)需由外電路第一次啟動(dòng)。
(8)OE——輸出允許信號(hào),高電平有效。當(dāng)微處理器送出該信號(hào)時(shí),ADC0808/0809的輸出三態(tài)門被打開(kāi),使轉(zhuǎn)換結(jié)果通過(guò)數(shù)據(jù)總線被讀走。在中斷工作方式下,該信號(hào)往往是CPU發(fā)出的中斷請(qǐng)求響應(yīng)信號(hào)。
3、ADC0808內(nèi)部結(jié)構(gòu)圖
逐次逼近型A/D轉(zhuǎn)換器ADC0808由八路模擬開(kāi)關(guān)、地址鎖存與譯碼器、比較器、D/A轉(zhuǎn)換器、寄存器、控制電路和三態(tài)輸出鎖存器等組成。其內(nèi)部結(jié)構(gòu)如圖4所示。

圖6-2-2  ADC0808內(nèi)部結(jié)構(gòu)

4、工作時(shí)序與使用說(shuō)明

                      圖6-2-3  ADC0808工作時(shí)序

ADC 0808/0809的工作時(shí)序如圖11.21所示。當(dāng)通道選擇地址有效時(shí),ALE信號(hào)一出現(xiàn),地址便馬上被鎖存,這時(shí)轉(zhuǎn)換啟動(dòng)信號(hào)緊隨ALE之后(或與ALE同時(shí))出現(xiàn)。START的上升沿將逐次逼近寄存器SAR復(fù)位,在該上升沿之后的2μs加8個(gè)時(shí)鐘周期內(nèi)(不定),EOC信號(hào)將變低電平,以指示轉(zhuǎn)換操作正在進(jìn)行中,直到轉(zhuǎn)換完成后EOC再變高電平。微處理器收到變?yōu)楦唠娖降腅OC信號(hào)后,便立即送出OE信號(hào),打開(kāi)三態(tài)門,讀取轉(zhuǎn)換結(jié)果。
6.2.2 系統(tǒng)硬件設(shè)計(jì)
從以上分析可知。ADC0808有8個(gè)模擬通道,本文的模擬量從0通道輸入,由ADC0808的模擬通道地址表可知,電路中應(yīng)當(dāng)把ADDC、ADDB、ADDA三個(gè)引腳全部接地。
根據(jù)ADC0808的工作時(shí)序圖可知,START引腳在一個(gè)高電平后啟動(dòng)A/D轉(zhuǎn)換,當(dāng)EOC引腳出現(xiàn)一個(gè)低電平時(shí)轉(zhuǎn)換結(jié)束,然后由OE引腳控制,從并行輸出端讀取一個(gè)字節(jié)的轉(zhuǎn)換結(jié)果。轉(zhuǎn)換后的結(jié)果為0x00-0xFF,轉(zhuǎn)換過(guò)程中芯片所需的時(shí)鐘信號(hào)由單片機(jī)定時(shí)器中斷子程序提供。具體硬件結(jié)構(gòu)圖如圖6-2-4所示:
圖6-2-4 系統(tǒng)硬件連接圖
6.2.3 系統(tǒng)軟件設(shè)計(jì)
根據(jù)需要,可將系統(tǒng)軟件按照功能劃分為4個(gè)模塊,分別是主程序模塊、A/D轉(zhuǎn)換模塊、液晶顯示模塊、中斷服務(wù)程序模塊(改變顯示的小數(shù)點(diǎn)位置)。編寫系統(tǒng)軟件時(shí),可首先編寫各模塊的底層驅(qū)動(dòng)程序,而后是系統(tǒng)聯(lián)機(jī)調(diào)試,最后編寫上層主程序。
1、  主程序設(shè)計(jì)
主程序主要負(fù)責(zé)初始化工作:設(shè)置定時(shí)器、寄存器的初值,啟動(dòng)A/D轉(zhuǎn)換,讀取轉(zhuǎn)換結(jié)果,處理量程轉(zhuǎn)換響應(yīng),控制液晶實(shí)時(shí)顯示等,其流程圖如圖6-2-5所示。

圖6-2-5主程序流程圖

2、A/D轉(zhuǎn)換程序

圖6-2-6 A/D轉(zhuǎn)換程序流程圖

A/D轉(zhuǎn)換程序的功能是采集數(shù)據(jù),在整個(gè)系統(tǒng)設(shè)計(jì)中占有很高的地位。當(dāng)系統(tǒng)設(shè)置好后,單片機(jī)掃描轉(zhuǎn)換結(jié)束管腳P1.7的輸入電平狀態(tài),當(dāng)輸入為高電平則轉(zhuǎn)換完成,將轉(zhuǎn)換的數(shù)值轉(zhuǎn)換并顯示輸出。若輸入為低電平,則繼續(xù)掃描。程序流程圖如圖6-2-6所示。
      程序如下:
#include<reg52.h>
#include <intrins.h>
unsigned long dat_adc0808;
uint adc0808_init()      // AD初始化
{
  START=0;
  OE=0;
  START=1;
  START=0;
  while(EOC==0);
   OE=1;
   dat_adc0808=P1;
   OE=0;
  return dat_adc0808;
}
   得到ADC0808的轉(zhuǎn)換結(jié)果后,應(yīng)當(dāng)及時(shí)處理成LCD1602能夠顯示的數(shù)字字符。以下函數(shù)實(shí)現(xiàn)此功能,為ADC0808顯示刷新子程序:
        void Refresh_show()                            //刷新顯示
{
   uint t=dat_adc0808*500.0/255;              //
   display_buffer[1][7] = t/100+'0';              //整數(shù)位
   display_buffer[1][9] = t/10%10+'0';              //兩個(gè)小數(shù)位
   display_buffer[1][10] = t%10+'0';
}
  • 課堂小結(jié)
本節(jié)課我們主要學(xué)習(xí)了如何應(yīng)用ADC0808設(shè)計(jì)一個(gè)數(shù)字電壓表。知道了在硬件上ADC0808芯片和單片機(jī)的連接,在軟件方面,我們著重介紹了如何獲取A/D轉(zhuǎn)換結(jié)果函數(shù)的設(shè)計(jì),這需要我們從ADC0808芯片的技術(shù)資料中獲得設(shè)計(jì)程序的方法。通過(guò)和前面一個(gè)項(xiàng)目的對(duì)比可知,對(duì)于模數(shù)轉(zhuǎn)換芯片的使用,關(guān)鍵的一點(diǎn)就是我們必需明白A/D芯片的轉(zhuǎn)換機(jī)制,ADC0808轉(zhuǎn)換時(shí)和時(shí)鐘引腳的頻率有很大的關(guān)系,頻率設(shè)置不當(dāng),ADC0808就不能轉(zhuǎn)換,這一點(diǎn)同學(xué)們要特別注意。
  • 完整程序代碼
1、LCD1602.c源程序
  1. //液晶控制與顯示驅(qū)動(dòng)程序
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #include <string.h>
  5. #include "LCD1602.h"
  6. #include "ADC0808.h"
  7. //---------------忙檢查-------------------//
  8. uchar LCD_Busy_Check()
  9. {
  10.               uchar LCD_Status;
  11.               RS = 0;
  12.               RW = 1;
  13.               E = 1;
  14.               delay4us();
  15.               LCD_Status = P0;
  16.               E = 0;
  17.               return LCD_Status;
  18. }
  19. //--------------向LCD寫入命令--------------------//
  20. void Write_LCD_Command(uchar cmd)
  21. {
  22.               while((LCD_Busy_Check()& 0x80)==0x80);                 //忙等待
  23.               RS = 0;
  24.               RW = 0;
  25.               E  = 0;
  26.               P0 = cmd;
  27.               delay4us();
  28.               E = 1;
  29.               delay4us();
  30.               E = 0;
  31. }
  32. //-----------向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)函數(shù)-----------------*/
  33. void Write_LCD_Data(uchar dat)
  34. {
  35.               while((LCD_Busy_Check()&0x80)==0x80);
  36.               RS = 1;
  37.               RW = 0;
  38.               E  = 0;
  39.               P0 = dat;
  40.               delay4us();
  41.               E = 1;
  42.               delay4us();
  43.               E = 0;
  44. }
  45. //-----------LCD初始化-----------------*/
  46. void Initialize_LCD1602() //液晶初始化函數(shù)
  47. {
  48.    Write_LCD_Command(0x38);delay50us(10);              //功能設(shè)置,數(shù)據(jù)長(zhǎng)度為8位,雙行顯示,5×7點(diǎn)陣字體
  49.    Write_LCD_Command(0x0C);delay50us(10); // 顯示開(kāi),關(guān)光標(biāo)
  50.    Write_LCD_Command(0x06);delay50us(10); //字符進(jìn)入模式:屏幕不動(dòng),字符后移
  51.    Write_LCD_Command(0x01);              delay50us(10);//清屏
  52. }
  53. //-----------在LCD上顯示字符串-----------------*/
  54. void LCD_Display(uchar *str)
  55. {
  56.   uchar i;
  57.   for(i=0;i<strlen(str);i++)
  58.     {
  59.                 Write_LCD_Data(str[i]);
  60.                 delay50us(100);
  61.               }
  62. }
  63. 2、lCD1602_H頭文件
  64. #ifndef __lCD1602_H__
  65. #define              __LCD1602_H__
  66. #include <reg52.h>

  67. #define dat_port P0
  68. #define uchar unsigned char
  69. #define uint unsigned int
  70. #define delay4us() {_nop_();_nop_();_nop_();_nop_();}
  71. sbit RS=P2^0;//RS=1 數(shù)據(jù) RS=0 命令
  72. sbit RW=P2^1;//RW=1 讀取 RW=0 寫入
  73. sbit E=P2^2;//E 使能信號(hào)

  74. uchar LCD_Busy_Check();//忙檢查
  75. void Write_LCD_Command(uchar cmd);//向LCD寫入命令
  76. void Write_LCD_Data(uchar dat);  //向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)函數(shù)
  77. void Initialize_LCD1602(); //液晶初始化函數(shù)
  78. void LCD_Display(uchar *str);//在LCD上顯示字符串

  79. #endif
  80. 3、ADC0808.C源程序
  81. #include<reg52.h>
  82. #include <intrins.h>
  83. #include "ADC0808.h"

  84. unsigned long dat_adc0808;
  85. uchar display_buffer[ ][16]={
  86.                              {"Current voltage:"},
  87.                                                                                                   {" (CH) =0.00V"}
  88.                                                                                                   };
  89. void delay50us(uint m)
  90. {
  91.    uint n,k;
  92.    for(n=m;n>0;n--)
  93.     for(k=25;k>0;k--);
  94. }

  95. uint adc0808_init()      // AD初始化
  96. {
  97.   START=0;
  98.   OE=0;
  99.   START=1;
  100.   START=0;
  101.    while(EOC==0);
  102.    OE=1;
  103.    dat_adc0808=P1;
  104.    OE=0;
  105.   return dat_adc0808;
  106. }
  107. void Refresh_show()                            //刷新顯示
  108. {
  109.    uint t=dat_adc0808*500.0/255;              //
  110.    display_buffer[1][7] = t/100+'0';              //整數(shù)位
  111.    display_buffer[1][9] = t/10%10+'0';              //兩個(gè)小數(shù)位
  112.    display_buffer[1][10] = t%10+'0';
  113. }
  114. 4、ADC0808.h 頭文件
  115. #ifndef __ADC0808_H__
  116. #define              __ADC0808_H__
  117. #include <reg52.h>

  118. #define data_port P1
  119. #define uchar unsigned char
  120. #define uint unsigned int

  121. sbit START=P2^3;
  122. sbit EOC=P2^4;
  123. sbit OE=P2^5;

  124. void delay50us(uint m);//  延時(shí)
  125. uint adc0808_init();      // AD初始化
  126. void Refresh_show();
  127. #endif
復(fù)制代碼

5、main.c 主程序
#include<reg52.h>
#include <intrins.h>
#include "LCD1602.h"
#include "ADC0808.h"
sbit CLOCK=P2^6;
extern uchar display_buffer[][16];
void main()
{
   TMOD=0x02;
   TH0=0x14;
   TL0=0x00;
   IE=0x82;
   TR0=1;
  Initialize_LCD1602();
  delay50us(10);
  Write_LCD_Command(0x80);//設(shè)置顯示的初始位置
  LCD_Display(display_buffer[0]);//顯示"The voltage is: "
   while(1)
   {
      adc0808_init();
                Refresh_show();              
                Write_LCD_Command(0xC0);//設(shè)置顯示的初始位置
                LCD_Display(display_buffer[1]); //顯示測(cè)得的數(shù)據(jù)
               
   }
}
void Timer0_INT() interrupt 1
{
   CLOCK=!CLOCK;
}


完整的Word格式文檔51黑下載地址(內(nèi)含清晰圖片):
用lcd1602和adc0808設(shè)計(jì)的數(shù)字電壓表.doc (334.5 KB, 下載次數(shù): 80)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:465292 發(fā)表于 2019-5-16 18:41 | 只看該作者
求代碼
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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