将干簧管脉冲信号通过单片机实现到数码管显示:
/
文件名 : TLC549c
描述 : 该程序实现了对TLC549的控制。通过TLC549把电压转换为数字信号并通过数码管显示出来。实际工作中进行AD采样时,一般都要把AD信号处理后再用。在这里,采集了30次,去掉最大和最小的5个,中间20个取平均值,最大限度的保证了所要采集AD的准确性。
/
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit AD_Out = P3^2; //TLC549输出端
sbit CS = P1^0; //TLC549片选信号
sbit AD_In = P1^1; //TLC549输入端
uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
uchar code table_d[10] = {0x02, 0x9e, 0x24, 0x0c, 0x98, 0x48, 0x40, 0x1e, 0x00, 0x08}; //带点数码管显示
/
名称 : AD_Change(void)
功能 : TLC549驱动程序,在“视频及教程”中有讲解。
输入 : 无
输出 : temp (电压值)
/
uchar AD_Change(void)
{
uchar i,temp = 0;
CS = 0;
_nop_();
_nop_();
_nop_();
_nop_();
for(i=0; i<8; i++)
{
AD_In = 1;
_nop_();
_nop_();
temp = temp << 1;
if(AD_Out == 1) temp += 1;
AD_In = 0;
_nop_();
_nop_();
}
CS = 1;
return temp;
}
/
名称 : Delay()
功能 : 延时,延时时间为 1ms del
输入 : del
输出 : 无
/
void Delay(uint del)
{
uchar i, j;
for(i=0; i
for(j=0; j<=148; j++)
;
}
/
名 称: Average()
功 能: 中位值平均滤波法,取一共三十个数据,最大和最小的五个数据不要
对中间的二十个数据求平均值
输 入: 三十个待处理的值
输 出:得到一个中位的平均值
/
uint Average(uint buffer[30])
{
uchar i,j;
uint temp;
for(i=1; i<30; i++) ////先对整个数组的三十个值进行从小到大的排列
for(j=29; j>=i; --j)
{
if(buffer[j-1] > buffer[j])
{
temp = buffer[j-1];
buffer[j-1] = buffer[j];
buffer[j] = temp;
}
}
////对数组进行处理,去掉一个最大值和一个最小值,中间的二十个值再来求平均值
temp = 0;
for(i=5; i<25; i++)
{
temp += buffer[i];
}
temp = (uint)(((float)temp) / 20 + 05);
return(temp);
}
/
名 称: AD_Filter()
功 能: 进行AD采集30次,并进行滤波处理
输 入: 三十次AD采集值
输 出:经过处理后的AD值
/
uint AD_Filter()
{
uint Date_Buffer[30] = {0}, temp;
uchar i;
for(i=0; i<30; i++)
{
Date_Buffer[i] = AD_Change();
Delay(1); //延时1毫秒采集一次。这里可以根据工作需要调整时间。
}
temp = Average(Date_Buffer);
return(temp);
}
/
名称 : Main()
功能 : 主函数
输入 : 无
输出 : 无
/
void Main()
{
uint i = 0,temp;
uint j;
P2 = 0x00;
P1 = 0xff;
while(1)
{
temp = AD_Filter();
j = temp 2;
for(i=0; i<40; i++)
{
P0 = table_d[j / 100];
P2 = 0x04;
Delay(10);
P0 = table[j/ 10 % 10];
P2 = 0x02;
Delay(10);
P0 = table[j % 10];
P2 = 0x01;
Delay(10);
}
}
}
#include<biosh> #define Up 04800 #define DOWN 05000 #define LEFT 04b00 #define RIGHT 04d00 #define SPACE 03920 #define ENTER 01c0d Main() { Struct point { Int x,y; }a; /定义a为结构体point类型/ Int key,key1; ax=40; /设置光标的初始位置/ ay=10; clrscr(); gotoxy(ax,ay); /光标定位在指定位置/ printf(“%c”,6); while(bioskey(1)==0) { Key=bioskey(0); /将所按键盘的控制码赋给key/ Switch(key) { Case UP: /当按键为向上键时实现向上画图/ { ay-=1; /纵坐标减1/ if(ay==0) ay=24; gotoxy(ax,ay); printf(“%c”,6); break; } Case DOWN: /当按键为向下键时实现向下画图/ { ay+=1; /纵坐标加1/ if(ay==24) ay=1; gotoxy(ax,ay); printf(“%c”,6); break; } Case LEFT: /当按键为向左键时实现向左画图/ { ax-=1; /横坐标减1/ if(ax==0) ax=80; gotoxy(ax,ay); printf(“%c”,6); break; } Case RIGHT: /当按键为向右键时实现向右画图/ { ax+=1; /横坐标加1/ if(ax==80) ax=1; gotoxy(ax,ay); printf(“%c”,6); break; } Case ENTER: /当按键为回车键时光标跳到下一列且不画图/ {ay+=1; If(ay==24) ay=1; gotoxy(ax,ay); break; } Case SPACE: /当按键为空格键时执行大括号内的语句/ { While (bioskey(1)==0) { Key1=bioskey(0); /将所按键盘的控制码赋给key/ Switch(key1) { Case UP: /当按键为向上键时向上清除所画图像/ { ay-=1; if(ay==0) ay=24; gotoxy(ax,ay); putch(‘’); break; } Case DOWN: /当按键为向下键时向下清除所画图像/ { ay+=1; if(ay==24) ay=1; gotoxy(ax,ay); putch(‘’); break; } Case LEFT: /当按键为向左键时向左清除所画图像/ { ax-=1; if(ax==0) ax=80; gotoxy(ax,ay); putch(‘’); break; Case RIGHT: /当按键为向右键时向右清除所画图像/ { ax+=1; if(ax==80) ax=1; gotoxy(ax,ay); putch(‘’); break; } Case ENTER: /当按键为回车键时光标跳到下一列且不画图/ {ay+=1; If(ay==24) ay=1; gotoxy(ax,ay); break; } } If(key1==03920) /当按键为空格键时,跳出循环/ Break; } } } If(key==0011b) /当按键为esc时,退出循环/ Break; } }
AD芯片是TLC549,EP2c5t144单线的串行数据传送。
先例化一个sdram controller,再打个testbench,然后再build image,再上板测试。这可能是比较快的方式了。最好要对sdram的读写时序比较熟悉,然后例化的controller才能比较靠谱,如果能搞到sdram的bfm模型,那可能更好。
AD输出的数据直接进FPGA,不管是高速AD的串行输出还是并行差分数据,FPGA的IO都可以支持。进FPGA后数据可以存在FPGA的BRAM里面。
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
以上就是关于如何将干簧管脉冲信号通过单片机实现到数码管显示全部的内容,包括:如何将干簧管脉冲信号通过单片机实现到数码管显示、求一段C语言程序的注释、你的AD数据存在FPGA中去是这么实现的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)