2008年F题 简易多功能计数器 - 图文(6)

2018-12-29 19:24

case 0X7B:key=11;break; case 0XE7:key=12;break; case 0XD7:key=13;break; case 0XB7:key=14;break; case 0X77:key=15;break; } //end switch }//end for return key;

}//end keyboard()

/*======================================================= 头文件名:SPI.h

功能:AVR与FPGA SPI通信的驱动程序

=======================================================*/ //---------FPGA的SPI接口定义----------------// #define CS 0 #define SCLK 1 #define MOSI 2 #define LOAD 3 #define MISO 4 #define LAT 5 #define RST 6

#define DDR_SPI DDRD #define PORT_SPI PORTD #define PIN_SPI PIND

#define CSH PORT_SPI|=BIT(CS) #define CSL PORT_SPI&=~BIT(CS) #define SCLKH PORT_SPI|=BIT(SCLK) #define SCLKL PORT_SPI&=~BIT(SCLK) #define MOSIH PORT_SPI|=BIT(MOSI) #define MOSIL PORT_SPI&=~BIT(MOSI) #define MISOH PORT_SPI|=BIT(MISO) #define MISOL PORT_SPI&=~BIT(MISO) #define LOADH PORT_SPI|=BIT(LOAD) #define LOADL PORT_SPI&=~BIT(LOAD) #define LOADH PORT_SPI|=BIT(LOAD) #define LOADL PORT_SPI&=~BIT(LOAD) #define LATH PORT_SPI|=BIT(LAT) #define LATL PORT_SPI&=~BIT(LAT) #define RSTH PORT_SPI|=BIT(RST) #define RSTL PORT_SPI&=~BIT(RST)

//---------微妙级别的延时函数-------------//

delayus(uchar t) { uchar i;

for(i=0;i

asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\} }

//---------从FPGA中读出数据------------// uchar spi_read(uchar addr) { uchar i,output;

DDR_SPI=0XFF;//IO的初始化 DDR_SPI&=~BIT(MISO);

CSH; LOADH; SCLKL; MOSIL;

LATL; CSL;

for(i=0;i<8;i++) //写入地址 {

if(addr&0X80) MOSIH; else MOSIL; SCLKH; SCLKL;

addr=addr<<1; } CSH;

LOADL;//产生load的下降沿,往reg[15:8]中装入数据 LOADH;

CSL;

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

{

output=output<<1;//要先移位一下,否则只要for7次 if(PIN_SPI&BIT(MISO)) output|=1; SCLKH; SCLKL; } CSH; LATH;

return output; }

/*======================================================= 头文件名:read_data.h

功能:从FPGA中读取数据,并处理。

此程序中包含对低频信号测周期并取倒数的算法

=======================================================*/

uchar period[24]; uchar sig_dig[24]; uchar real[24]; uchar dummy[24]; uchar freq[24];

uchar pnt;

//-------判断周期数组中有效位的起始位置------// uchar find_pos()

{ uchar flag=1,i=0,pos; while(flag) {

if(period[i]!='0') {

pos=i; flag=0; } else {

pos==255; i++; flag=1; } }

return pos;

}

//-------------------------- -------------------// //取6位被测信号周期的数字(高6位)

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

double catch_six_dig(uchar pos) {

double temp=0; uchar i;

for(i=0;i<6;i++) {

temp=temp*10+(period[pos+i]-'0'); }

return temp; }

//---------------------------------------------// //求有效位的倒数,并乘以10000,然后将每一个有 效位转换成字符数组保存在sig_dig[]数值中。

//---------------------------------------------// void float_disp() {

double float1,float2,float3,float_MSD,float_LSD; uint uint_MSD,uint_LSD,temp; uchar i;

uint sig_fig_L,sig_fig_H;

float2=catch_six_dig(find_pos());

//float3=(float1*10000/float2); float3=(1000000000/float2); float_MSD=float3; uint_MSD=float_MSD;

float_LSD=(float_MSD-uint_MSD)*1000; uint_LSD=float_LSD;

pnt=0;

if(float3!=1) {

temp=uint_MSD/1000;

sig_dig[pnt++]=temp+'0';

uint_MSD=uint_MSD00; temp=uint_MSD/100;

sig_dig[pnt++]=temp+'0';

uint_MSD=uint_MSD0; temp=uint_MSD/10;

sig_dig[pnt++]=temp+'0';

sig_dig[pnt++]=uint_MSD+'0';

//temp=uint_LSD/1000;

// sig_dig[pnt++]=temp+'0';

uint_LSD=uint_LSD00; temp=uint_LSD/100;

sig_dig[pnt++]=temp+'0';

uint_LSD=uint_LSD0; temp=uint_LSD/10;

sig_dig[pnt++]=temp+'0';

sig_dig[pnt++]=uint_LSD+'0'; } }

//------------------------------------------------// //通过输入有效位数值和小数点所在位数用字符串显示小数 //------------------------------------------------// void put_dot(uchar sig_dig[],uchar location) {

uchar i,j;

char pos=location-3;

float_disp();

if(pos>=1 && pos<=5) { j=0;

for(i=0;i<7;i++) {

if(j==pos) {

real[j++]='.'; }

real[j++]=sig_dig[i]; } }

else if(pos==0) {

real[0]='0';


2008年F题 简易多功能计数器 - 图文(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:七年级数学

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: