单片机AD程序,如何采样,要求自己写的,不要网络版本

单片机AD程序,如何采样,要求自己写的,不要网络版本,第1张

#include "stc2052.h"

#include "main.h"

void ADC_init(void)

void del(INT8U x)

void uart_init(void)

void PutHex(INT8U *cp,INT8U len)

void ADC_SPI_Routine(void)

void Putstr(char *cs)

/*用悄历的是5406,12M晶体,波特率不能太大,用2400,

实验过程是 在P1.6脚 接2.5v电压,开AD 读到最终值是80H,7FH 左右*/

void main()

{

EA=0

P1M0=0x40

P1M1=0x00//表示第P1.6作为AD输入

EA=1

uart_init()

ADC_init()

while(1){

del(100)

uart_s_buf[0] = ADC_DATA

uart_s_buf[1]=0x23

PutHex(uart_s_buf,2)

del(1000)

}

}

void ADC_init(void)

{

ADC_CONTR |= 0x06

ADC_CONTR |= 0x80//开启ADC电源

del(1)

ADC_CONTR |= 0x08//启动AD

AUXR |= 0x10

EADC_SPI = 1

}

void del(INT8U yj)

{

INT8U yj2=5000

while(yj!=0)

{

while(yj2!=0)

{

yj2--

}

yj2=1000

yj--

}

}

void uart_init(void)

{

SCON = 0x50

//SCON: mode 1,8-bit UART, enable rcvr

AUXR = 0x80 // 作在1T模式

// PCON = 0x80 // 加速

TMOD = 0x20 //* TMOD: timer 1,mode 2,8-bit reload TL0 NO USED

TH1 = SYS_TDATA /* 2400 Bds at 11.1184MHz */

TL1 = SYS_TDATA /* 2400 Bds at 11.1184MHz */

// ES = 1 /* Enable serial interrupt*/

TR1 = 1

/* Timer 1 run */

}

void PutHex(INT8U *cp,INT8U len)

{

ES=0

TI= 0

while(len--)

{

SBUF=*cp

cp++

while(TI==0) //等待发送结束,死循环,如果TI==0,则死循环,如果TI==1,则执行下条。 同while(TI==0){}

TI=0

}

ES=0

}

void Putstr(char *cs)

{

TI=0

while(*cs) /* 例如 :指向数组的指针,例如

int b[10]

int *a = b

a就是b[0]的地址*a就是b[0]的内容

a+1就是b[1]的地址依此类推

又如char *a = "hank"

那么通过a就能得到整个字符串"hank"

*a是h

*(a+1)是a 所以发送完k后 就是(*cs==0)0了,那启余搜就跳毁没出循环 */

{

SBUF=*cs

cs++

while(TI==0)

TI=0

}

}

void ADC_SPI_Routine(void) interrupt 5

{

EADC_SPI = 0

ADC_CONTR |= 0x08 //ADC_START启动

ADC_CONTR &= 0xef //ADC_FLAG清零

EADC_SPI = 1

}

简单点,建立32位变伍稿灶量A,每采样一次就加到A,采样完8次再除以8就好了,

u16 ADC_ZKB(u8 Channel)

{

u32 value1=0

u16 value

u8 i

for(i=0i<8i++)

{

ADC_CSR = Channel &0x0F // 选择AD转换通道

ADC_CR1 |= 0x01 // 启动AD转换

while(!(ADC_CSR &0x80))// 等待AD转换完成

value = ADC_DRL

value |=((ADC_DRH<<8)&0X0300)

value1+=value

ADC_CSR = 0x00

}

return (value1/8)

}

大概这意思,怎敬雹么定义32位数,这个自己去查,因为AD采样时间比较久,估计这样FOR可能不合适,腔扮自己可以改改。

AD0809的采集程序

//---A/D转换---

//-----头文件引用------

#include <Reg51.h>

#include <absacc.h>

#include <intrins.h>

typedef unsigned char BYTE/*自定义字节类型*/

#define Set_Bit(BIT) (BIT = 1) /*定义置1函数*/

#define Clear_Bit(BIT) (BIT = 0) /*定义清0函数*/

/************************************************************************************/

void Write_Hd7279(BYTE,BYTE)/*定义HD7279写函数*/

BYTE Read_Hd7279(BYTE)/*定义HD7279读函数*/

void Send_Byte(BYTE)/*定义HD7279发送字节函数*/

BYTE Receive_Byte(void)/清冲*定义HD7279接收字节函数*/

void Short_Delay(void)/*定义短延时函数*/

void Long_Delay(void)/*定义长延时函数*/

void Mcu_Init(void)/*定义MCU初始化函数*/

void Delay_200_mS(void)/*定义200ms延时函数*/

sbit Hd7279_Clk=P1^6/*定义HD7279时钟硬件连接*/

sbit Hd7279_Data=P1^5/*定义HD7279数据硬件连接携则*/

sbit cs=P1^7

void Short_Delay(void) /*短延时函数*/

{

BYTE i

for(i=0i<0x08i++)

}

/************************************************************************************/辩正棚

void Long_Delay(void) /*长延时函数*/

{

BYTE i

for(i=0i<0x30i++)

}

/************************************************************************************/

void Write_Hd7279(BYTE Command,BYTE Data) /*HD7279写函数*/

{

Send_Byte(Command)

Send_Byte(Data)

}

/************************************************************************************/

void Send_Byte(BYTE Data_Out) /*HD7279发送字节函数*/

{

BYTE i

cs=0

Long_Delay()

for(i=0i<8i++)

{

if(Data_Out&0x80) Set_Bit(Hd7279_Data)

else Clear_Bit(Hd7279_Data)

Set_Bit(Hd7279_Clk)

Short_Delay()

Clear_Bit(Hd7279_Clk)

Short_Delay()

Data_Out=Data_Out<<1

}

Clear_Bit(Hd7279_Data)

}

//-----宏声明-----

#define A_DPORT XBYTE[0xFef3]//0809通道0地址

#define uchar unsigned char

//-----变量定义-----

bit bdata bz=0//定义标志

uchar val

//-----初始化-----

void first(void)

{

P1=0xff

P2=0xff

P3=0xff

P0=0xff

Send_Byte(0xa4)

IT1=1

EX1=1

EA=1//INT0 允许

}

//-----中断-----

void int_0(void) interrupt 2

{

val=A_DPORT//读 A_D 数据

bz=1//置读数标志

}

//-----主程序-----

main()

{

first()//初始化

while(1)

{

A_DPORT=val//启动 A_D

while(bz==0)//等待 A_D 转换结束

// val=~A_DPORT

//P1=val//数据输出

Write_Hd7279(0xc8,val&0x0f)

Write_Hd7279(0xc9,val>>4)

Write_Hd7279(0x92,0x00)

Write_Hd7279(0x93,0x00)

Write_Hd7279(0x94,0x00)

Write_Hd7279(0x95,0x00)

Write_Hd7279(0xce,0x0d)

Write_Hd7279(0xcf,0x0a)

bz=0//清读数标志

}

}

这就是C的程序

http://hi.baidu.com/dzkfw/blog/item/4a188216fd986b12c83d6d05.html

不平凡的单片机学习资料,很好的单片机教程,超好用,一个不占内存的教程,有案例。

1、最新版单片机编程宝典下载地址,学习单片机编程必备手册

2、单片机c语言运用例子

3、十天学会单片机c语言和单片机制作,最好的单片机资料


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

原文地址: http://outofmemory.cn/yw/12332463.html

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

发表评论

登录后才能评论

评论列表(0条)

保存