sbit OE=P3^1
sbit EOC=P3^2
sbit CLK=P3^3ST:START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。 EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。 OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。 CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ,单片要送出的CLK时序是用 TO定时中断完成的:void t0(void) interrupt 1 using 0
{
CLK=~CLK//定时取反一次,制造脉冲
}
当EOC是高电平时,就是一次AD转换完成,单片机此时读ADC0809的值:if(EOC==1)
OE=1
getdata=P0
OE=0
就是从P0口与ADC0809数据相连读出,读出8位的转换值 后存在getdata中,getdata再送入temp,temp再把采得的AD值转换为实际的电压值:temp=getdata*235//这是要根据实际电路的电阻而定
temp=temp/128
后把实际电压值送入数码管扫描的缓冲数组,在T1中断中进行扫描显示:dispbuf[0]=10
dispbuf[1]=10
dispbuf[2]=10
dispbuf[3]=10
dispbuf[4]=10
dispbuf[5]=0
dispbuf[6]=0
dispbuf[7]=0
P1=dispcode[dispbuf[dispcount]]//数码管的字段码
P2=dispbitcode[dispcount //扫描数码管的每一位 说得差不多了,估计没人会一句句程序的给你分析,何况只有10分。
//实验用程序 测试通过 STC15F2K60S2 @11.0592MHZ#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE
typedef unsigned int WORD
sfr ADC_CONTR = 0xBC
sfr ADC_RES = 0xBD
sfr ADC_LOW2 = 0xBE
sfr P1ASF = 0x9D
BYTE ch = 0//ADC回路数
/*----------------------------
延时
----------------------------*/
void Delay(WORD n){
WORD x
while (n--){
x = 5000
while (x--)
}
}
/*----------------------------
ADC中断
----------------------------*/
void adc_isr() interrupt 5 using 1{
ADC_CONTR &= !0x10
P2=ADC_RES
ADC_CONTR = 0x80 | 0x00 | 0x08 | ch
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC(){
P1ASF = 0xff
ADC_RES = 0
ADC_CONTR = 0x80 | 0x00 | 0x08 | ch
Delay(2)
}
void main(){
InitADC()//初始化ADC
IE = 0xa0
while (1)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)