求教一个单片机ADC0808或者0809的AD转换C语言程序,如果可以和PC机通信就非常感谢了

求教一个单片机ADC0808或者0809的AD转换C语言程序,如果可以和PC机通信就非常感谢了,第1张

//------------------------------------------------------------

// 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程序 板子做出来 能用


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11065632.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存