⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 失真度.c

📁 这是本人参加电子设计竞赛过程中编写的几个单片机程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/*********************************************************/
/**                失真度                 **
*********************************************************/

#include <absacc.h>
#include <reg51.h>
#include<intrins.h>
#include <math.h>

#define uchar unsigned char
#define uint unsigned int

#define LED1 XBYTE [0xA000]   //数码管地址
#define LED2 XBYTE [0xA001]
#define LED3 XBYTE [0xA002]
#define LED4 XBYTE [0xA003]
#define LED5 XBYTE [0xA004]
#define LED6 XBYTE [0xA005]
#define LED7 XBYTE [0xA006]
#define LED8 XBYTE [0xA007]

#define KEY XBYTE [0xA100]  //键盘地址

#define lcdDl XBYTE [0xA201] //左半边液晶数据地址
#define lcdDr XBYTE [0xA301] //右半边液晶数据地址
#define lcdlCommand XBYTE [0xA200]//左半边液晶命令地址
#define lcdrCommand XBYTE [0xA300]//右半边液晶命令地址

#define fpga XBYTE[0xC800]
#define libleng 0x5F   //字模库容量

/*液晶显示使用的常量*/
#define strat_yaddr 0x40
#define strat_xaddr 0xb8
#define strat_dispaddr 0xc0

xdata uchar RAM[32768] _at_ 0x0000;//外部RAM地址
static xdata uchar FPGA_data[64]_at_ 0xD800;

/*扫描键盘使用的变量 */
sbit first_row = P1^4;      //键盘第一行控制
sbit second_row = P1^3;     //键盘第二行控制
sbit clock=P1^1;
sbit ioput=P1^2;
sbit cs1=P1^0;

bit first_getkey = 0,control_readkey = 0;  //读键盘过程中的标志位
bit getkey = 0; //获得有效键值标志位 等于1时代表得到一个有效键值
bit keyon = 0,enable_readkey=0,tuichu=0;  //防止按键冲突标志位,tong[8],chufazi[3][8]
uchar keynum = 0;  //获得的有效按键值寄存器 

/*读写flash使用的变量*/
sbit scl = P1^0; //24C16 scl
sbit sda = P1^1; //24c16 sdl

/*数码管显示使用的变量和常量*/
/*
uchar lednum = 0;  //数码管显示位控制寄存器
uchar led[8] = {0,0,0,0,0,0,0,0};  //数码管显示内容寄存器
uchar code segtab[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff}; //七段码段码表
                      // "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "P" ,"black" 
*/

uchar code shezhi[256];
uchar code celiang[192];
uchar code zhonglei[160];
uchar code pinlv[96];
uchar code fudu[96];
uchar code zhengxian[96];
uchar code sanjiao[96];
uchar code shuruzifu[128];
uchar code shuru2zifu[128];
uchar code diaodianzifu[256];
uchar code diaodianzifu2[128];
uchar code ASCII[libleng][8];
//uchar code shezhishijian[128];
uchar code hehe[14] = "0123456789. E-";
//uchar data_temp[16],diaodianzhi[5];
void leddisp(void); //数码管显示函数
void readkey(void); //读键盘函数

// 功能函数

void showdata(float shu);
void show_data(double print,uchar hang,uchar lie,uchar wei);

void showshu1(float x,uchar h,uchar l);

/**********************************
  液晶驱动函数
***********************************/
void lcdlon_off(uchar D);
void setlstartx(uchar D);
void setlstarty(uchar D);
void setlstartline(uchar D);
void lcdron_off(uchar D);
void setrstartx(uchar D);
void setrstarty(uchar D);
void setrstartline(uchar D);
void lcdlwrite(uchar D);
void lcdrwrite(uchar D);
void initial_lcd(void);
void clear_lcd(void);
//写入液晶函数
void  show_hanzi_string(uchar word_data[],uchar  hang,uchar lie,uchar word_len);
void write_char (uchar datan,uchar  hang,uchar  lie );
void write_str_noclear (uchar worddata[],uchar  hang,uchar  lie ,uchar  len);        //对LCD进行字符串写入 
//void  hanzi_lcd(uchar word_data[32], uchar index );
void jianpan(void);
/**********************************
	24c16驱动函数
**********************************/
/*void  delay(uchar time_nop);
void  Start_I2c(void);
void  Stop_I2c(void);
uchar SendByte(uchar c);
uchar RcvByte(void);
void  Ack_I2c(uchar a);
uchar ISendByte(uchar sla,uchar c);
uchar ISendStr(uchar sla,uchar suba,uchar *s,uchar no);
uchar IRcvByte(uchar sla,uchar *c);
uchar IRcvStr(uchar sla,uchar suba,uchar *s,uchar no);
void  write_24lc16b(uint adrress, uchar *wdata, uchar number);
void  read_24lc16b(uint adrress, uchar *rdata, uchar number);*/
void intT0() interrupt 1 //T0 定时中断处理函数
{
	TH0 = -2720/256;  //定时器中断时间间隔 4ms
 	TL0 = -2720%256;

 	//leddisp();  //每次定时中断显示更新一次
    if(enable_readkey==1)
    {
 	    if(control_readkey == 1)  //每两次定时中断扫描一次键盘
   	    {
    	    readkey();
   	    }
 	    control_readkey = !control_readkey;
        /*if(getkey==1)
        {
            enable_readkey=0;
        }*/
    }
}
void jianpan()
{
         getkey=0;
         enable_readkey=1;
         while(getkey==0);
         enable_readkey=0;
}


/*void showdata(float shu)//
{      long shuu=shu*100;
       write_char(hehe[shuu/100],8,3);//
       write_char(hehe[10],8,4);
	   shuu=shuu%100;
       write_char(hehe[shuu/10],8,5);
	   shuu=shuu%10;
	   write_char(hehe[shuu],8,6);
}
*/
/*void showshu(uchar x,uchar h,uchar l)
{      long shuu=x;
       write_char(hehe[shuu/100],h,l);//
	   shuu=shuu%100;
       write_char(hehe[shuu/10],h,l+1);
	   shuu=shuu%10;
	   write_char(hehe[shuu],h,l+2);
}*/
void show_zhengshu(uint shu,uchar h,uchar l,uchar w)
{
     uint zheng=shu,bb=1;
	 uchar i,x;
	 for(i=0;i<w;i++)
	 {
	         for(x=0;x<w-i-1;x++)
			       bb*=10;
             write_char(hehe[zheng/bb],h,l+i);//
			 zheng=zheng%bb;
			 bb=1;
	 }
}
void gaishu(float xian,uchar h,uchar l)//数字频率计中的,显示恒八位,带小数点//待测试
{
          uint i,x;
	      unsigned long shu1=0;
	      if(xian>=10000000)
	      {shu1=xian*100;x=2;}
		  else if(xian>=1000000)
          {shu1=xian*1000;x=3;}
		  else if(xian>=100000)
		  {shu1=xian*10000;x=4;}
		  else if(xian>=10000)
		  {shu1=xian*100000;x=5;}
		  else if(xian>=1000)
		  {shu1=xian*1000000;x=6;}
		  else if(xian>=100)
		  {shu1=xian*10000000;x=7;}
		  else if(xian>=10)
		  {shu1=xian*100000000;x=8;}
		  else
          {shu1=xian*1000000000;x=9;}
          for(i=0;i<=10;i++)
          {  
	        if(i!=x)
            {if(i>2)
		  	 write_char(hehe[shu1%10],h,10-i+l);
			 shu1=shu1/10;}//{shu[10-i]=hehe[shu1%10];shu1=shu1/10;}
		    else
		       write_char(hehe[10],h,10-i+l);//shu[10-i]=hehe[10];
          }
}       
/*void shezhihanshu()
{
      uint shuru=0,ll=1,fudushu,fuduzhi;
	  clear_lcd();
      show_hanzi_string(zhonglei,1,1,5);
      show_hanzi_string(pinlv,2,1,3);
      show_hanzi_string(fudu,3,1,3);
      do
      {
         jianpan();
      }while(keynum!=1&&keynum!=2&&keynum!=3);
      if(keynum==1)
      {
	      clear_lcd();
          show_hanzi_string(zhengxian,1,1,3);
          show_hanzi_string(sanjiao,3,1,3);
          do
          {
              jianpan();
          }while(keynum!=1&&keynum!=2);
          FPGA_data[4]=keynum-1;
          diaodianzhi[0]=keynum-1;
          write_24lc16b(4, diaodianzhi , 1);
      }
      else if(keynum==2)
      {
	  	 clear_lcd();
          show_hanzi_string(shuruzifu,1,1,4);
          show_zhengshu(20,2,9,2);
		  write_char(hehe[13],2,11);
          show_zhengshu(20000,2,12,5);
          do
          {
          do
          {
              jianpan();
          }while(keynum>10&&keynum!=16);
          if(keynum<10)
              {shuru=shuru*10+keynum;write_char(hehe[keynum],4,ll++);}
          else if(keynum==10)
              {shuru=shuru*10;write_char(hehe[0],4,ll++);}
          else
              tuichu=1;
          }while(tuichu==0);tuichu=0;
/////////////////////////////////////////////////////怎样将频率转换为步进
          FPGA_data[0]=shuru%256;
          FPGA_data[1]=shuru/256; 
          diaodianzhi[0]=shuru%256;
          diaodianzhi[1]=shuru/256;
          write_24lc16b(0, diaodianzhi , 2);  
      }
      else
      {
	  	 clear_lcd();
          show_hanzi_string(shuru2zifu,1,1,4); 
          write_char(hehe[0],1,9);write_char(hehe[13],1,10);write_char(hehe[3],1,11);
		  do
		  {
		      jianpan();
		  }while(keynum>10);
          write_char(hehe[keynum],4,7);
		  fudushu=keynum*100;
          write_char(hehe[10],4,8);
		  do
		  {
		      jianpan();
		  }while(keynum>10);
          write_char(hehe[keynum],4,9);
		  fudushu+=keynum*10;
		  do
		  {
		      jianpan();
		  }while(keynum>10);
          write_char(hehe[keynum],4,10);
   	      fudushu+=keynum;
		  do
		  {
		      jianpan();
		  }while(keynum!=16);
		  //////////////////
          fuduzhi=(fudushu*512)/500+512;
          FPGA_data[2]=fuduzhi%256;
          FPGA_data[3]=fuduzhi/256;
          diaodianzhi[0]=fuduzhi%256;
          diaodianzhi[1]=fuduzhi/256;
          write_24lc16b(2, diaodianzhi , 2); 
	   }
}

void celianghanshu()
{
  	
    uchar jipin,m,x,y,hh=2;
    long xubu,shibu;
	float pingfanghe,shizhen,mozhi;
    clear_lcd();
    for(m=0;m<16;m++)
    {
	     x=FPGA_data[m*4];
         y=FPGA_data[m*4+1];
		 if(y>31)
		     shibu=8192-((y-32)*256+x);
		 else
		     shibu=y*256+x;
         x=FPGA_data[m*4+2];
         y=FPGA_data[m*4+3];
		 if(y>31)
		     xubu=8192-((y-32)*256+x);
		 else
		     xubu=y*256+x;
		 mozhi=sqrt(shibu*shibu+xubu*xubu);
       showshu1(mozhi,hh,1+m*4);
       if(m==3)
           hh++;
         //pingfanghe+=x^2;///////////////////////////什么样的数值表示形式
    }
    //shizhen=sqrt(pingfanghe)/sqrt(jipin*jipin+pingfanghe);
	//show_data(shizhen,4,5,4);
	do
	{
		jianpan();
	}while(keynum!=16);
}

/*void eeprom_24c16(void)
{
	uchar wdata[2] = {0x03,0x04};
    write_24lc16b(0, wdata , 1);
	write_24lc16b(1, wdata + 1, 1);    
}
void reeprom_24c16(void)
{
    uchar i;
    uchar rdata[2] = {0x00,0x00};
    read_24lc16b(0, rdata , 1);
	read_24lc16b(1, rdata + 1, 1);
    for(i=0;i<4;i++)
	{
	    led[2*i] =rdata[0];
	    led[2*i+1] =rdata[1];
	}
}*/         
void main(void)
{
    uchar m,x,y,c;//jipin
	float shizhen,mozhi=0,jimo;//shab[5],he,he1;
    float shibu,xubu;
	TMOD = 0x01;    
 	TH0 = -2720/256;  //定时器中断时间间隔 4ms
 	TL0 = -2720%256;
	TCON = 0x10;
 	ET0 = 1;
    EA = 1;
	initial_lcd();//初始化液晶
    while(1)
    {
       do
       {jianpan();}while(keynum>4);
       clear_lcd();

      if(keynum==1)//while(1)////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    {
     mozhi=0;
     for(m=0;m<=5;m++)
     {
	     x=FPGA_data[m*2];
         y=FPGA_data[m*2+1];
		 if(x>127)
		     {shibu=256-x;
             if(m<8)
			 show_zhengshu(shibu,m+1,1,4);}//write_char(hehe[13],m+1,1);
		 else
		     {shibu=x;
             if(m<8)
			 show_zhengshu(shibu,m+1,1,4);}
		 if(y>127)
		     {xubu=256-y;
             if(m<8)
			 show_zhengshu(xubu,m+1,5,4);}//write_char(hehe[13],m+1,7);
		 else
		     {xubu=y;
             if(m<8)
			 show_zhengshu(xubu,m+1,5,4);}
	    if(m==1)
		     jimo=shibu*shibu+xubu*xubu;
		else if(m>1)
		    mozhi+=shibu*shibu+xubu*xubu; 
	} 
    gaishu(mozhi,4,9);
	    gaishu(jimo+mozhi,5,9);
			    gaishu(jimo,6,9);
	shizhen=sqrt(mozhi/(jimo+mozhi));   
    gaishu(shizhen,3,9); //mozhi=sqrt(shibu*shibu+xubu*xubu);

	do
	{
		jianpan();
	}while(keynum!=16);////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    else if(keynum==2)//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    {/////////////////////////////////不去最大值的失真度
    mozhi=0;
    clear_lcd();
    for(m=1;m<8;m++)
    {
	     x=FPGA_data[m*4];
         y=FPGA_data[m*4+1];
         y=y%32;
		 if(y>15)
		     {shibu=4096-((y-16)*256+x);}
		 else
		     {shibu=y*256+x;}
         x=FPGA_data[m*4+2];
         y=FPGA_data[m*4+3];
         y=y%32;
		 if(y>15)
		     {xubu=4096-((y-16)*256+x);}
		 else
		     {xubu=y*256+x;}
	 
	    if(m==1)
		     jimo=shibu*shibu+xubu*xubu;
		else
		 mozhi+=shibu*shibu+xubu*xubu;
	}   
	shizhen=sqrt(mozhi/(jimo+mozhi));   
    gaishu(shizhen,3,1);
       //showshu1(mozhi,hh,1+m*4);
      // if(m==3)
          // hh++;
         //pingfanghe+=x^2;///////////////////////////什么样的数值表示形式

    //shizhen=sqrt(pingfanghe)/sqrt(jipin*jipin+pingfanghe);
	//show_data(shizhen,4,5,4);
		 //mozhi=sqrt(shibu*shibu+xubu*xubu);
       //showshu1(mozhi,hh,1+m*4);
       //if(m==3)
           //hh++;
         //pingfanghe+=x^2;///////////////////////////什么样的数值表示形式
       	//jianpan(); clear_lcd(); jianpan();
    }
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	else if(keynum==3)//while(1)///////////////////////////////显示八个实虚部
    {
      jimo=0;mozhi=0;
     for(m=0;m<=31;m++)
     {
	     x=FPGA_data[m*2];
         y=FPGA_data[m*2+1];
		 if(x>127)
		     {shibu=256-x;
             if(m<8)
			 show_zhengshu(shibu,m+1,1,4);}//write_char(hehe[13],m+1,1);
		 else
		     {shibu=x;
             if(m<8)
			 show_zhengshu(shibu,m+1,1,4);}
		 if(y>127)
		     {xubu=256-y;
             if(m<8)
			 show_zhengshu(xubu,m+1,5,4);}//write_char(hehe[13],m+1,7);
		 else
		     {xubu=y;
             if(m<8)
			 show_zhengshu(xubu,m+1,5,4);}
	    if(m==1)
		     jimo=shibu*shibu+xubu*xubu;
		else if(m>1)
		    mozhi+=shibu*shibu+xubu*xubu; 
	} 
    gaishu(mozhi,4,9);
	    gaishu(jimo+mozhi,5,9);
			    gaishu(jimo,6,9);
	shizhen=sqrt(mozhi/(jimo+mozhi));   
    gaishu(shizhen,3,9); //mozhi=sqrt(shibu*shibu+xubu*xubu);
       //showshu1(mozhi,hh,1+m*4);
       //if(m==3)
           //hh++;
         //pingfanghe+=x^2;///////////////////////////什么样的数值表示形式
       	//jianpan(); clear_lcd(); jianpan();
    }
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    else
    {
        for(m=0;m<8;m++)
        {
            x=FPGA_data[2*m];
            show_zhengshu(x,m+1,2,4);
            x=FPGA_data[2*m+1];
            show_zhengshu(x,m+1,8,4);
        }
    }
}
}
    
/*void showshu1(float xxx,uchar h,uchar l)
{      long shuu1=xxx;
       shuu1=shuu1%10000;
       write_char(hehe[shuu1/1000],h,l);//
	   shuu1=shuu1%1000;
       write_char(hehe[shuu1/100],h,l+1);
	   //shuu1=shuu1%100;
	   //write_char(hehe[shuu1/10],h,l+2);
	   //shuu1=shuu1%10;
	   //write_char(hehe[shuu1],h,l+3);
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -