单片机AD采集的C程序
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=0;i0x08;i++);
}
/************************************************************************************/
void Long_Delay(void) /*长延时函数*/
{
BYTE i;
for(i=0;i0x30;i++);
}
/************************************************************************************/
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=0;i8;i++)
{
if(Data_Out0x80) Set_Bit(Hd7279_Data);
else Clear_Bit(Hd7279_Data);
Set_Bit(Hd7279_Clk);
Short_Delay();
Clear_Bit(Hd7279_Clk);
Short_Delay();
Data_Out=Data_Out1;
}
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,val0x0f);
Write_Hd7279(0xc9,val4);
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的程序
不平凡的单片机学习资料,很好的单片机教程,超好用,一个不占内存的教程,有案例。
1、最新版单片机编程宝典下载地址,学习单片机编程必备手册
2、单片机c语言运用例子
3、十天学会单片机c语言和单片机制作,最好的单片机资料
C语言实现ADC采样问题
我的理解是这样的:
我不知道ADC_TEMP 是否已经被初始化为零了。如果是,思路就是这样 0000 0000 0000 0000 0000 0000 这是ADC_temp,AD_DATA 应该就是采样的 每一位 的数 比如采样你说的 101101,其实应该把前面的0补齐,也就是0000 0000 0000 0000 0010 1101 。然后经过for循环,从第一位开始取,当遇到1的时候,执行ADC_temp|= 1; 我们知道或运算的规则,1和什么都是1。所以就从第一位0开始取,直到取完最后一位,每取一位左移一位,再和输出的AD_DATA 或运算。前提是,这个AD_DATA是高位输出。
编了一个AVR的AD采样程序,但始终不能正确采样
每次采样完成后 ADIF 需要软件清0,不然第一次采样完成后它就一直是置1的;这样会造成后面每次没有采样完成,你就去读ADC寄存器的值,肯定会不对.
ADIF软件清零的操作为:ADCSRA |= BIT(ADIF);
单片机中的AD采样大概是如何用语句实现的? 如能贴一段实现的C语言语句最好了。
看你用什么芯片了-
但是一般步骤都如下:
1,选择AD通道,也就是选择某一入口(一般有8个入口的,任选一个都可以)
2,设置转换方式,一般有触发转换或者软件转换-(比如C8051F系列带有定时器2定时转换-另一种也可以选择软件转换,就是向BUSY寄存器写1来触发转换等)-
3,选择转换得到的数据是几位,一般都是12位(00 0000 0000)除去后8位是数据,前2位系统自动补0-
4,可选中断-
5,开始转换-(比如用定时器2的话,就直接启动TR2=1就行了-)
6,查询转换结束标志,(或者进入中断)任何单片机AD转换完都有转换结束标志的-
7,读取转换得到的数值,一般都会有两个寄存器分别存有高位和低位的-
8,保存好数值!结束-
–
51的目前我在用,关系到机密,就不发代码给你了!
发一个以前我实验时候写的ARM7给你吧!
/*——————————————————————-
ADC初始化
————————————————————
1:ADCR
//SEL=1000:选择引脚P0.30,通道AD0.3
//CLKDIV=13(55Mhz/4.5Mhz)
//BURST(位16=0)软件启动,
//CLKS(19-17:000)10位转换,
//START(26-24=001):立即启动,
//EDGE=0:下降启动;
————————————————————————–*/
void ADC_Inite()
{
//AD0CR=(127)|(0x0124)|(121)|(0x019)|(0x0C8)|(0x08);
AD0CR=(0x0124)|(121)|(0x019)|(0x0C8)|(0x08);
}
/*——————————————————————-
ADC启动
——————————————————————*/
#define ADC_Start() AD0GSR|=(0x0124)
/*——————————————————————-
ADC等待
——————————————————————*/
int ADC_GetValue()
{
//while(((0x01(AD0GDR1))0x01)==0)
int ax,cx;
cx=0x0000F000;
do{
ax =AD0GDR;
cx–;
}while(((ax0x80000000)==0)cx);
return (ax6)0x3FF;
}
medfilt1(x2,31)函数用C语言怎么实现啊,x2是AD采样的值??
#includevoidmain(){doublei,j;doublea,b,c=0;printf(“请输入积分上下限:”);scanf(“%lf%lf”,a,b);for(i=a;i=b;i+=10e-8){j=i*i+1;j*=10e-8;c+=j;}printf(“ans=%.4f\n”,c);}对了没考虑自变量取负值的情况,这个程序只适合算上下限都大于零的情况。