欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
51單片機(jī)學(xué)習(xí):利用ADC0804模數(shù)轉(zhuǎn)換器采集電壓
[打印本頁(yè)]
作者:
51黑電子迷
時(shí)間:
2017-2-9 22:17
標(biāo)題:
51單片機(jī)學(xué)習(xí):利用ADC0804模數(shù)轉(zhuǎn)換器采集電壓
電位器調(diào)節(jié)待檢測(cè)電壓值,在數(shù)碼管上顯示出來(lái),
代碼大多從書(shū)上搬過(guò)來(lái)的,書(shū)上例5.3.1要求前3個(gè)數(shù)碼管顯示AD轉(zhuǎn)換后的8位數(shù)字量(即0~255)
我這里讓前4個(gè)數(shù)碼管顯示具體電壓值,比如1.352
#include <reg52.h>
#include "MY51.H"
void initSMG() //數(shù)碼管初始化信息
{
//上電時(shí),都為高電平
P0=0xff;
wela=open;
P0=0xff;
wela=lock;
P0=0;
dula=open;
P0=0;
dula=lock;
}
void ADC0804_csToLow() //cs置低電平
{
wela=open; //打開(kāi)鎖存器
P0=0x7f; //鎖存器最高位送0,也就是CSAD置0
wela=lock;
}
void ADC0804_startConvert() //P3.6口是wr,由高到底,再拉高后,ad開(kāi)始轉(zhuǎn)換
{
adwr=high; //雖然原本就是高的,但我們要養(yǎng)成好習(xí)慣,該是什么就是什么
_nop_();
adwr=low; //wr置低后,過(guò)小會(huì)后AD內(nèi)部開(kāi)始執(zhí)行轉(zhuǎn)換,轉(zhuǎn)換完成后INTR自動(dòng)置低觸發(fā)中斷
_nop_();
adwr=high;
//由于我們用的不是150pF電容,而是104pF,所以轉(zhuǎn)換比較慢,在調(diào)用本函數(shù)后最好延時(shí)10毫秒以上
}
uint8 ADC0804_readResult() //讀轉(zhuǎn)換結(jié)果
{
uint8 result=0;
//延時(shí)一會(huì)兒,轉(zhuǎn)換就完成了,由于我們將INTR和CS都拉低了,直接操作RD后就可以讀了
P1=0xff; //防止由于轉(zhuǎn)換未完成原因引起的誤讀
adrd=high;
_nop_();
adrd=low; //rd置低電平后數(shù)據(jù)總線P1口得到數(shù)據(jù),并由led顯示現(xiàn)象
_nop_();
result=P1;
adrd=high;
//讀完以后,如果ad芯片不用了,就把cs拉高,注銷(xiāo)片選
return result;
}
void show(uint8 value) //基準(zhǔn)電壓是2.5V 為了計(jì)算方便擴(kuò)大到2500
{
uint16 temp=value*(2500/255.0); //擴(kuò)大到4位整數(shù),小數(shù)點(diǎn)另外附加顯示
uint8 oneWela,twoWela,threeWela,fourWela; //oneWela是最左邊的數(shù)碼管
oneWela=temp/1000;
twoWela=temp%1000/100;
threeWela=temp%100/10;
fourWela=temp%10;
displaySMG(oneWela,twoWela,threeWela,fourWela,dark,dark,dotTable[1]); //最左邊的數(shù)碼管顯示小數(shù)點(diǎn)
}
void main()
{
uchar i=0;
uchar adTemp=0;
initSMG(); //數(shù)碼管數(shù)據(jù)初始化
ADC0804_csToLow(); //cs置低
while(1)
{
ADC0804_startConvert(); //開(kāi)始將電壓數(shù)據(jù)轉(zhuǎn)換成數(shù)字信號(hào)
for(i=5;i>0;i--) //主要是延時(shí)一段時(shí)間,讓ad完成轉(zhuǎn)換
{
delayms(1);
show(adTemp); //延時(shí)的時(shí)候,數(shù)碼管繼續(xù)動(dòng)態(tài)顯示
}
adTemp=ADC0804_readResult(); //讀取數(shù)據(jù)
show(adTemp);
}
}
復(fù)制代碼
#ifndef _MY51_H_
#define _MY51_H_
#include <math.h>
#include <intrins.h>
typedef int int16 ;
typedef int INT16 ;
typedef unsigned int uint16 ;
typedef unsigned int UINT16 ;
typedef unsigned short uint ;
typedef unsigned short UINT ;
typedef unsigned short word ;
typedef unsigned short WORD ;
typedef unsigned long uint32 ;
typedef unsigned long UINT32 ;
typedef unsigned long DWORD ;
typedef unsigned long dword ;
typedef signed long int32 ;
typedef signed long INT32 ;
typedef float float32 ;
typedef double double64 ;
typedef signed char int8 ;
typedef signed char INT8 ;
typedef unsigned char byte ;
typedef unsigned char BYTE ; //WINDOWS的windef.h里面是這么定義的
typedef unsigned char uchar ;
typedef unsigned char UCHAR ;
typedef unsigned char UINT8 ;
typedef unsigned char uint8 ;
typedef unsigned char BOOL ; //windows中定義BOOL為int
typedef unsigned char bool ; //bool是c++的內(nèi)置類(lèi)型
#define TRUE 1
#define true 1
#define FALSE 0
#define false 0
#define open 1 //open和close用于 標(biāo)志打開(kāi)和關(guān)閉狀態(tài)
#define OPEN 1
#define close 0
#define CLOSE 0
#define lock 0
#define start 1
#define START 1
#define stop 0
#define STOP 0
#define keyDown 0
#define keyUp 1
#define gnd 0 //接地
#define GND 0 //接地
#define high 1 //高電平
#define low 0 //低電平
#define yes 1
#define YES 1
#define no 0
#define NO 0
sbit dula =P2^6; //段選鎖存器控制 控制筆段
sbit wela =P2^7; //位選鎖存器控制 控制位置
#define led P1 //燈總線控制
sbit led0=P1^0; //8個(gè)led燈,陰極送低電平點(diǎn)亮
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit keyS2=P3^4; //4個(gè)獨(dú)立按鍵
sbit keyS3=P3^5;
sbit keyS4=P3^6;
sbit keyS5=P3^7;
sbit csda=P3^2; //DAC0832模數(shù)轉(zhuǎn)換cs口
sbit adwr=P3^6; //ADC0804這個(gè)同DAC0832
sbit dawr=P3^6;
sbit adrd=P3^7; //ADC0804
sbit beep=P2^3; //蜂鳴器
void displaySMG(uint8 one,uint8 two,uint8 three,uint8 four,uint8 five,uint8 six,uint8 dot);
void delayms(uint16 ms);
void T0_Work();
void delayms(uint16 ms) //軟延時(shí)函數(shù)
{
uint16 i,j;
for(i=ms;i>0;i--)
{
for(j=113;j>0;j--)
{}
}
}
///////////////////////////////////////////////////////////////////////////
#define dark 0x11 //在段中,0x11是第17號(hào)元素,為0是低電平,數(shù)碼管不亮
#define dotDark 0xff //小數(shù)點(diǎn)全暗時(shí)
uint8 code table[]= { //0~F外加小數(shù)點(diǎn)和空輸出的數(shù)碼管編碼
0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3
0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7
0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B
0x39 , 0x5e , 0x79 , 0x71 , // C D E F
0x80 , 0x00 ,0x40 // . 空 負(fù)號(hào) 空時(shí)是第0x11號(hào)也就是第17號(hào)元素
};
uint8 dotTable[]={ //小數(shù)點(diǎn)位置
0xff , //全暗
0xfe , 0xfd , 0xfb , //1 2 3
0xf7 , 0xef , 0xdf //4 5 6
};
/////////////////////////////////////////////////////////////////////////////
uint8 TH0Cout=0 ; //初值
uint8 TL0Cout=0 ;
uint16 T0IntCout=0; //中斷計(jì)數(shù)
uint16 T0IntCountAll=0; //(N-1)/65536+1; //總中斷次數(shù)
bool bT0Delay=false; //使用延時(shí)函數(shù)標(biāo)志,初始未用
bool bT0Over=false; //中斷處理函數(shù)執(zhí)行結(jié)果之一
void startT0(uint32 ms) //開(kāi)啟定時(shí)器
{
float32 t=ms/1000.0; //定時(shí)時(shí)間
double64 fox =11.0592*(pow(10,6)); //晶振頻率
uint32 N=(t*fox)/12 ; //定時(shí)器總計(jì)數(shù)值
TH0Cout =(65536-N%65536)/256; //裝入計(jì)時(shí)值零頭計(jì)數(shù)初值
TL0Cout =(65536-N%65536)%256;
T0IntCountAll=(N-1)/65536+1; //總中斷次數(shù)
TMOD=TMOD | 0x01; //設(shè)置定時(shí)器0的工作方式為1
EA =open; //打開(kāi)總中斷
ET0=open; //打開(kāi)定時(shí)器中斷
TH0=TH0Cout; //定時(shí)器裝入初值
TL0=TL0Cout;
TR0=start; //啟動(dòng)定時(shí)器
}
void delayT0(uint32 ms) //硬延時(shí)函數(shù),自己亂寫(xiě)的不好用,求指點(diǎn)
{
startT0(ms); //啟動(dòng)定時(shí)器
bT0Delay=true; //告訴T0定時(shí)器,起用延時(shí)模式
while(bT0Over==false); //時(shí)間沒(méi)到的話繼續(xù)檢測(cè)
bT0Over=false; //時(shí)間到了,讓標(biāo)志復(fù)位
}
void T0_times() interrupt 1 //T0定時(shí)器中斷函數(shù)
{
T0IntCout++;
if(T0IntCout==T0IntCountAll) //達(dá)到總中斷次數(shù)值
{
T0IntCout=0; //中斷次數(shù)清零,重新計(jì)時(shí)
bT0Over=true; //時(shí)間真的到了
if(bT0Delay) //本次中斷是用來(lái)延時(shí)的嗎
{
TR0=stop; //如果是由延時(shí)函數(shù)開(kāi)啟T0的話,關(guān)閉T0
return;
}
TH0=TH0Cout; //循環(huán)定時(shí)的話要重裝初值,每次定時(shí)1秒,重裝一次
TL0=TL0Cout;
T0_Work(); //工作函數(shù)
}
}
////////////////////////////////////////////////////////////////////////////////
void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)
{
//控制6位數(shù)碼管顯示函數(shù),不顯示的位用參數(shù)dark,保留ADC0804的片選信號(hào)
uint8 csadState=0x80&P0; //提取最高位,即ADC0804的片選信號(hào)
uint8 tempP0=((csadState==0)?0x7f:0xff); //數(shù)碼管位選初始信號(hào),陰極全置高電平
P0=tempP0; //0x7f表示數(shù)碼管不亮,同時(shí)ADC0804片選有效
wela=1; //注:wela和dula上電默認(rèn)為1
P0=tempP0;
wela=0;
P0=0; //由于數(shù)碼管是共陰極的,陽(yáng)極送低電平,燈不亮,防止燈誤亮
dula=1;
P0=0;
dula=0; //段選數(shù)據(jù)清空并鎖定
//////////////////////////oneWela
{ //消除疊影,數(shù)碼管陰極置高電平,并鎖存
P0=tempP0;
wela=1;
P0=tempP0;
wela=0;
}
P0=0; //低電平送到數(shù)碼管陽(yáng)極,避免數(shù)碼管誤亮
dula=1;
P0=table[oneWela]|((0x01&dot)?0x00:0x80); //送段數(shù)據(jù),疊加小數(shù)點(diǎn)的顯示
dula=0;
P0=tempP0; //送位數(shù)據(jù)前關(guān)閉所有顯示,并保持csad信號(hào)
wela=1;
P0=tempP0 & 0xfe; //0111 1110最高位是AD片選,低6位是數(shù)碼管位選,低電平有效
wela=0;
delayms(2);
/////////////////////////twoWela
{ //消除疊影
P0=tempP0;
wela=1;
P0=tempP0;
wela=0;
}
P0=0;
dula=1;
P0=table[twoWela]|((0x02&dot)?0x00:0x80);
dula=0;
P0=tempP0;
wela=1;
P0=tempP0 & 0xfd; //0111 1101
wela=0;
delayms(2);
/////////////////////////threeWela
{ //消除疊影
P0=tempP0;
wela=1;
P0=tempP0;
wela=0;
}
P0=0;
dula=1;
P0=table[threeWela]|((0x04&dot)?0x00:0x80);
dula=0;
P0=tempP0;
wela=1;
P0=tempP0 & 0xfb; //0111 1011
wela=0;
delayms(2);
/////////////////////////fourWela
{ //消除疊影
P0=tempP0;
wela=1;
P0=tempP0;
wela=0;
}
P0=0;
dula=1;
P0=table[fourWela]|((0x08&dot)?0x00:0x80);
dula=0;
P0=tempP0;
wela=1;
P0=tempP0 & 0xf7; //0111 0111
wela=0;
delayms(2);
/////////////////////////fiveWela
{ //消除疊影
P0=tempP0;
wela=1;
P0=tempP0;
wela=0;
}
P0=0;
dula=1;
P0=table[fiveWela]|((0x10&dot)?0x00:0x80);
dula=0;
P0=tempP0;
wela=1;
P0=tempP0 & 0xef; //0110 1111
wela=0;
delayms(2);
/////////////////////////sixWela
{ //消除疊影
P0=tempP0;
wela=1;
P0=tempP0;
wela=0;
}
P0=0;
dula=1;
P0=table[sixWela]|((0x20&dot)?0x00:0x80);
dula=0;
P0=tempP0;
wela=1;
P0=tempP0 & 0xdf; //0101 1111
wela=0;
delayms(2);
}
#endif
復(fù)制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1