
// ADC0809模数转换
//ADC0809采样通道3输入的模拟量,转换后结果显示在数码管上
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code LEDData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}
//ADC0809引脚定义
sbit OE=P1^0
sbit EOC=P1^1
sbit ST=P1^2
sbit CLK=P1^3
//延时
void Delayms(uint ms)
{
uchar i
while(ms--)for(i=0i<120i++)
}
//显示转换结果
void Display_Result(uchar d)
{
P2=0xf7
P0=LEDData[d%10]
Delayms(5)
P2=0xfd
P0=LEDData[d%100/10]
Delayms(5)
P2=0xfd
P0=LEDData[d/100]
Delayms(5)
}
// 主程序
void main()
{
TMOD=0x02
TH0=0x14
TL0=0x00
IE=0x82
TR0=1
P1=0x3f//选择ADC0809通道3(0111)
//高4位设通道地址为0111
while(1)
{
ST=0ST=1ST=0//启动转换
while(EOC==0) //等待转换结果
OE=1 //允许输出
Display_Result(P3) //显示A/D转换结果
OE=0 //关闭输出
}
}
//T0定时器中断给ADC0809提供时钟信号
void Timer0_INT() interrupt 1
{
CLK=!CLK//ADC0809时钟信号
}
89C52采集0809八位AD并显示出来的。现在估计没有人用了....#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define LCDCOM XBYTE[0x8ffc] //LCD写命令寄存器地址
#define LCDDATA XBYTE[0x8ffd] //LCD写数据寄存器地址
#define LCDSTATUS XBYTE[0x8ffe] //LCD读状态寄存器地址
#define IN2 XBYTE[0x7ffa] //IN2通道地址
sbit ad_busy=P3^2
sbit bflag=ACC^7
//函数的声明部分
void delay1(uint x)
void lcd_busy()
void lcd_cmd(uchar lcd_cmd)
void lcd_data(uchar lcd_data)
void lcd_moveto(uchar position)
void init(void)
void ad0809(void)
uchar string[10]={"dianya is:"}
uchar temp[6]={0x00,0x0a,0x00,0x00,0x00,0x0b}
uchar code dis_buf[13]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x56,0x20}//为0到9的ASCLL码
void delay1(uint x) //延时1ms程序
{
uchar j
while(x--)
{
for(j=0j<125j++)
{}
}
}
void lcd_busy()//检测lcd忙程序
{
do
{
ACC=LCDSTATUS
}
while(bflag==1) //当他忙的时候就不停的检测,直到空闲为止
}
void lcd_cmd(uchar lcd_cmd) //写命令函数
{
LCDCOM=lcd_cmd
lcd_busy()
}
void lcd_data(uchar lcd_data)//写数据函数
{
LCDDATA=lcd_data
lcd_busy()
}
void lcd_moveto(uchar position)//确定显示位置
{
uchar temp //为显示位置对应的地址
if (position<16)
temp=(position+0x80-1)//为在第一行
else
temp=((position-16)+0xc0) //为第二行
lcd_cmd(temp)
}
void init(void) //lcd初始化
{
lcd_cmd(0x30) //置功能:1行,5*7字符
lcd_busy()
lcd_cmd(0x30) //置功能:1行,5*7字符
lcd_busy()
lcd_cmd(0x30)//置功能:1行,5*7字符
lcd_busy()
lcd_cmd(0x38)//置功能:2行,5*7字符
lcd_busy()
lcd_cmd(0x06)//置输入模式:地址增量,显示屏不移动
lcd_busy()
lcd_cmd(0x0c)//置显示开,不显示光标,光标不闪烁
lcd_busy()
lcd_cmd(0x01)//清显示
lcd_busy()
}
void ad0809(void)
{
uchar i
uint a=0
IN2=0
i=i
i=i
while(ad_busy==0)
a=IN2
a=a*200/255
a=a*25
temp[0]=a/1000
temp[2]=a%1000/100
temp[3]=a%100/10
temp[4]=a%10
}
void main(void)
{
uchar i,j
P2=0xff
P1=0xff
P0=0xff
delay1(20)
init()
while(1)
{
ad0809()
lcd_moveto(1)
for(j=0j<10j++)
{
lcd_data(string[j])
}
lcd_moveto(16)
for(i=0i<6i++)
{
lcd_data(dis_buf[temp[i]])
}
}
}
#include <reg52.h>#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS=P3^0
sbit CLK=P3^1 //时钟
sbit DIO=P3^2 //ADC0832输出引脚
sbit din=P0^7
uchar code tab1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E} //共阳数码表
uchar code tab[4]={0xfe,0xfd,0xfb,0xf7} //数码管位选表
void delay(uint k)
{
uint i,j
for(i=0i<ki++)
for(j=0j<121j++)
}
uint A_D() // A/D转换函数
{
unsigned char i,dat
CS=0 //片选
CLK=0 //为第1个脉冲作准备
CLK=1//第1个脉冲
DIO=1// DI置1,规定的起始信号
_nop_()_nop_()
CLK=0 //第1个脉冲的下降沿
CLK=1 //第2个脉冲
DIO=1 // DI置1, 通道选择信号:1
_nop_()_nop_()
CLK=0 //第2个脉冲下降沿
CLK=0 //第3个脉冲
DIO=1 // DI置0,通道选择信号:0, 选通道0
_nop_()_nop_()
// CLK=0 //第3个脉冲下降沿,转换开始
// _nop_()_nop_()//第3个脉冲后,
// CLK=1
for(i=0i<8i++) //高位在前
{
CLK=1 //第4个脉冲
if(DIO)
dat=(dat<<1)|0x80//从高位至低位读取 "|"的优先级高于">>"
else
dat=(dat<<1)|0x00
CLK=0
}
for(i=0i<8i++) //高位在前
{
CLK=1 //第4个脉冲
if(DIO)
dat=(dat>>1)|0x80//从高位至低位读取 "|"的优先级高于">>"
else
dat=(dat>>1)|0x00
CLK=0
}
CS=1
CLK=1
return dat
}
void display(uint k)
{
P2=tab[1]
P0=tab1[k/100]
din=0
delay(3)
P2=0xff
P2=tab[2]
P0=tab1[k/10%10]
delay(3)
P2=0xff
P2=tab[3]
P0=tab1[k%10]
delay(3)
P2=0xff
}
void main(void) //主函数
{
uint temp
while(1)
{
temp=A_D()*5.0/256*100// 根据转换结果求出电压值
display(temp)
}
}
ADC0832程序 板子做出来 能用
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)