久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7277|回復(fù): 1
收起左側(cè)

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

[復(fù)制鏈接]
ID:317943 發(fā)表于 2018-6-4 12:43 | 顯示全部樓層 |閱讀模式
  • 點(diǎn)名,復(fù)習(xí)
  • ADC0832的引腳及其功能,以及與單片機(jī)的硬件連接
引言:
數(shù)字電壓表的基本工作原理是利用A/D轉(zhuǎn)換電路將待測的模擬信號轉(zhuǎn)換成數(shù)字信號,通過相應(yīng)換算后將測試結(jié)果以數(shù)字形式顯示出來的一種電壓表。較之于一般的模擬電壓表,數(shù)字電壓表具有精度高、測量準(zhǔn)確、讀數(shù)直觀、使用方便等優(yōu)點(diǎn)。數(shù)字電壓表的核心部件是A/D轉(zhuǎn)換器,由于各種不同的A/D轉(zhuǎn)換原理構(gòu)成了各種不同類型的DVM。一般說來,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é)合起來的復(fù)合式A/D轉(zhuǎn)換器。本設(shè)計(jì)以AT89C51單片機(jī)為核心,以逐次比較型A/D轉(zhuǎn)換器ADC0808、液晶顯示器LCD1602為主體,構(gòu)造了一款簡易的數(shù)字電壓表,能夠測量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)過中間變量。主要由比較器、環(huán)形分配器、控制門、寄存器與D/A轉(zhuǎn)換器組成。
6.2.1 ADC0808簡介
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)啟動轉(zhuǎn)換控制為脈沖式(正脈沖),上升沿使所有內(nèi)部寄存器清零,下降沿使A/D轉(zhuǎn)換開始。
(8)使用時(shí)不需進(jìn)行零點(diǎn)和滿刻度調(diào)節(jié)。
2、ADC0808引腳功能
                         圖6-2-1 ADC0808引腳圖
(1)IN0~I(xiàn)N7——8路模擬輸入,通過3根地址譯碼線ADDA、ADDB、ADDC來選通一路。
(2)D7~D0——A/D轉(zhuǎn)換后的數(shù)據(jù)輸出端,為三態(tài)可控輸出,故可直接和微處理器數(shù)據(jù)線連接。8位排列順序是D7為最高位,D0為最低位。
(3)ADDA、ADDB、ADDC——模擬通道選擇地址信號,ADDA為低位,ADDC為高位。地址信號與選中通道對應(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  地址信號與選中通道的關(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——地址鎖存允許信號,高電平有效。當(dāng)此信號有效時(shí),A、B、C三位地址信號被鎖存,譯碼選通對應(yīng)模擬通道。在使用時(shí),該信號常和START信號連在一起,以便同時(shí)鎖存通道地址和啟動A/D轉(zhuǎn)換。
(6)START——A/D轉(zhuǎn)換啟動信號,正脈沖有效。加于該端的脈沖的上升沿使逐次逼近寄存器清零,下降沿開始A/D轉(zhuǎn)換。如正在進(jìn)行轉(zhuǎn)換時(shí)又接到新的啟動脈沖,則原來的轉(zhuǎn)換進(jìn)程被中止,重新從頭開始轉(zhuǎn)換。
(7)EOC——轉(zhuǎn)換結(jié)束信號,高電平有效。該信號在A/D轉(zhuǎn)換過程中為低電平,其余時(shí)間為高電平。該信號可作為被CPU查詢的狀態(tài)信號,也可作為對CPU的中斷請求信號。在需要對某個(gè)模擬量不斷采樣、轉(zhuǎn)換的情況下,EOC也可作為啟動信號反饋接到START端,但在剛加電時(shí)需由外電路第一次啟動。
(8)OE——輸出允許信號,高電平有效。當(dāng)微處理器送出該信號時(shí),ADC0808/0809的輸出三態(tài)門被打開,使轉(zhuǎn)換結(jié)果通過數(shù)據(jù)總線被讀走。在中斷工作方式下,該信號往往是CPU發(fā)出的中斷請求響應(yīng)信號。
3、ADC0808內(nèi)部結(jié)構(gòu)圖
逐次逼近型A/D轉(zhuǎn)換器ADC0808由八路模擬開關(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í)序與使用說明

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

ADC 0808/0809的工作時(shí)序如圖11.21所示。當(dāng)通道選擇地址有效時(shí),ALE信號一出現(xiàn),地址便馬上被鎖存,這時(shí)轉(zhuǎn)換啟動信號緊隨ALE之后(或與ALE同時(shí))出現(xiàn)。START的上升沿將逐次逼近寄存器SAR復(fù)位,在該上升沿之后的2μs加8個(gè)時(shí)鐘周期內(nèi)(不定),EOC信號將變低電平,以指示轉(zhuǎn)換操作正在進(jìn)行中,直到轉(zhuǎn)換完成后EOC再變高電平。微處理器收到變?yōu)楦唠娖降腅OC信號后,便立即送出OE信號,打開三態(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è)高電平后啟動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)換過程中芯片所需的時(shí)鐘信號由單片機(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ū)動程序,而后是系統(tǒng)聯(lián)機(jī)調(diào)試,最后編寫上層主程序。
1、  主程序設(shè)計(jì)
主程序主要負(fù)責(zé)初始化工作:設(shè)置定時(shí)器、寄存器的初值,啟動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ì)程序的方法。通過和前面一個(gè)項(xiàng)目的對比可知,對于模數(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ū)動程序
  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ù)長度為8位,雙行顯示,5×7點(diǎn)陣字體
  49.    Write_LCD_Command(0x0C);delay50us(10); // 顯示開,關(guān)光標(biāo)
  50.    Write_LCD_Command(0x06);delay50us(10); //字符進(jìn)入模式:屏幕不動,字符后移
  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 使能信號

  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]); //顯示測得的數(shù)據(jù)
               
   }
}
void Timer0_INT() interrupt 1
{
   CLOCK=!CLOCK;
}


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

評分

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

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:465292 發(fā)表于 2019-5-16 18:41 | 顯示全部樓層
求代碼
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久亚洲精品 | 久久综合伊人 | av天天看 | 97国产精品视频人人做人人爱 | 欧美另类视频在线 | 精品欧美乱码久久久久久1区2区 | 另类二区 | 国产 日韩 欧美 在线 | 精品视频一区二区三区在线观看 | 国产激情免费视频 | 日韩精品成人av | 欧产日产国产精品v | 超碰高清| 欧美日韩在线免费 | 国产精品美女久久久久aⅴ国产馆 | 日韩福利一区 | 国产精品二区三区在线观看 | 国产成人精品一区二区三 | 夜夜爽99久久国产综合精品女不卡 | 日本一道本视频 | 成人性生交大片 | www.一级片| 精品国产乱码久久久久久中文 | 日韩精品一区二 | 美日韩视频 | 男女羞羞免费网站 | 日韩三级电影在线看 | 91精品久久久久久久久久小网站 | 一区中文字幕 | 中日韩毛片 | 国产伦一区二区三区视频 | 久久久久国产 | 国产精品久久久久无码av | 成人毛片一区二区三区 | 日韩欧美一区二区三区四区 | 精品国产精品一区二区夜夜嗨 | 日韩在线中文 | www国产成人免费观看视频,深夜成人网 | 中文字幕在线观看视频网站 | 日本电影韩国电影免费观看 | 精品视频一区二区 |