是取样拉,根据取样定理,就是用大于被测信号频率两倍的以上的频率对信号进行取样,然后对每个点进行AD转换然后把点平滑的连起来就行了。不过AD转换的话应是慢速的,除非用专用的高速AD器件否则频率不会太高。显示的时候直接把两点相连就行了,不过点要取得密一点!
89C52采集0809八位AD并显示出来的。现在估计没有人用了
#include<reg52h>
#include<absacch>
#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,0,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=0;j<125;j++)
{;}
}
}
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行,57字符
lcd_busy();
lcd_cmd(0x30); //置功能:1行,57字符
lcd_busy();
lcd_cmd(0x30); //置功能:1行,57字符
lcd_busy();
lcd_cmd(0x38); //置功能:2行,57字符
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=a200/255;
a=a25;
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=0;j<10;j++)
{
lcd_data(string[j]);
}
lcd_moveto(16);
for(i=0;i<6;i++)
{
lcd_data(dis_buf[temp[i]]);
}
}
}
temp=getdata235;
temp=temp/128;
应该是修正数值所用的, x = x235/128 = x 18359375;
如果AD的参考电压为 1089V (2V/(235/128))的话,
那乘上的因子可以使得
x 电压值
0 -- 0V
255 -- 2V
dispbuf[0]=10;等内容对应的是显示缓存数据的初始化,相应的值必须结合硬件连接电路图才可以确定是初始化为什么样的显示字形
以上就是关于C语言计算波形周期问题!现用mega128通过ad采集电压值,并将采集的变化曲线在液晶上显示出来!全部的内容,包括:C语言计算波形周期问题!现用mega128通过ad采集电压值,并将采集的变化曲线在液晶上显示出来!、求一Mcs51单片机关于采集A/D转换数据的C程序、帮忙解读一下这个C程序,用单片机做电压表的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)