久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5993|回復: 2
打印 上一主題 下一主題
收起左側

基于數字相關的時柵信號處理設計LPC2138源程序及proteus仿真

[復制鏈接]
跳轉到指定樓層
樓主
這是我大三時的課程設計,設計要求如下:

1.時柵傳感器模擬器:通過輸入兩路時間和空間的信號。

(1) 設計一路正弦載波信號模擬信號輸出 sina * cos(wt)

(2) 設計一路余弦信號模擬信號輸出     cosa *sin(wt)
    (3) 設計兩路信號的合成模擬信號輸出   sin(wt+a)
2. 設計數據采集模塊。(要求整周期采樣)

3.  ARM硬件接口電路設計:顯示路和鍵盤電路

4. 軟件設計:數字相關算法求解角度、顯示、按鍵、A/D.
5.  proteus仿真和實做。希望對大家有用!

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

LPC2138單片機源程序如下:
  1. #include  "config.h"
  2. //#include  "LPC21xx.h"
  3. #include "math.h"

  4. //#define Fpclk 12000000
  5. //typedef unsigned char  uint8;                   /* defined for unsigned 8-bits integer variable         無符號8位整型變量  */
  6. //typedef signed   char  int8;                    /* defined for signed 8-bits integer variable                有符號8位整型變量  */
  7. //typedef unsigned short uint16;                  /* defined for unsigned 16-bits integer variable         無符號16位整型變量 */
  8. //typedef signed   short int16;                   /* defined for signed 16-bits integer variable                 有符號16位整型變量 */
  9. //typedef unsigned int   uint32;                  /* defined for unsigned 32-bits integer variable         無符號32位整型變量 */
  10. //typedef signed   int   int32;                   /* defined for signed 32-bits integer variable                 有符號32位整型變量 */
  11. //typedef float          fp32;                    /* single precision floating point variable (32bits) 單精度浮點數(32位長度) */
  12. //typedef double         fp64;                    /* double precision floating point variable (64bits) 雙精度浮點數(64位長度) */
  13. #define IO_RS   0x1000000
  14. #define IO_RW   0x2000000
  15. #define IO_EN   0x4000000
  16. #define LED 0X01
  17. #define KEY1 (IO0PIN&(1<<20))
  18. #define KEY2 (IO0PIN&(1<<21))   
  19.       
  20. int32  k=0,ADC_Data,tt1,tt2;
  21. uint32 A=1,FG1=1,FG2=2;
  22. uint32 a,i,h,j,p,q,m,n,u,v;
  23. double c,s,data_1=0,data_2=0,data_3=0,data_4=0;
  24. double x,y,PI=3.141592653589793238462643383279502;
  25. int32 Buffer[256];

  26. double SINCE[19]={
  27. 0.0000,0.0872,0.1736,0.2588,0.3420,0.4226,
  28. 0.5000,0.5736,0.6428,0.7071,0.7660,0.8192,
  29. 0.8660,0.9063,0.9397,0.9659,0.9848,0.9962,
  30. 1.0000,
  31. };

  32. double COSCE[19]={
  33. 1.0000,0.9962,0.9848,0.9659,0.9397,0.9063,
  34. 0.8660,0.8192,0.7660,0.7071,0.6428,0.5736,
  35. 0.5000,0.4226,0.3420,0.2588,0.1736,0.0872,
  36. 0.0000,
  37. };
  38.         
  39. const int16 sindata[]={
  40. 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,
  41. 0x98,0x9b,0x9e,0xa1,0xa4,0xa7,0xaa,0xad,
  42. …………
  43. …………限于本文篇幅 余下代碼請從51黑下載附件…………

  44. 0xfc,0xfd,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,
  45. };

  46. #define RS_1    IO1SET=(IO_RS&0xFFFFFFFF)
  47. #define RS_0    IO1CLR=(IO_RS&0xFFFFFFFF)
  48. #define RW_1    IO1SET=(IO_RW&0xFFFFFFFF)
  49. #define RW_0    IO1CLR=(IO_RW&0xFFFFFFFF)
  50. #define EN_1    IO1SET=(IO_EN&0xFFFFFFFF)
  51. #define EN_0    IO1CLR=(IO_EN&0xFFFFFFFF)


  52. void delayms(unsigned int t)
  53. {
  54.         unsigned char u,v;
  55.         for(u=0;u<100;u++)
  56.          for(v=0;v<81;v++);
  57. }

  58. void LCD_write_com(unsigned char com)              //LCD寫入命令函數
  59. {
  60.         RS_0;
  61.         RW_0;
  62.         EN_1;
  63.         IO1SET=com<<16;
  64.         delayms(5);
  65.         EN_0;
  66.         IO1CLR=0xFF0000;
  67. }

  68. void LCD_write_data(unsigned char data)           //寫入數據函數
  69. {
  70.         RS_1;
  71.   RW_0;
  72.   EN_1;
  73.   IO1SET=data<<16;
  74.         delayms(5);        
  75.   EN_0;
  76.         IO1CLR=0xFF0000;
  77. }

  78. void LCD_clear()                                  //LCD清屏函數
  79. {
  80.         LCD_write_com(0x01);
  81.         delayms(5);
  82. }

  83. void LCD_write_char(unsigned char x,unsigned char y,unsigned char s)    //寫入字符函數
  84. {     
  85. if (y == 0)
  86.          {     
  87.          LCD_write_com(0x80+x);     
  88.          }   
  89. else
  90.          {     
  91.          LCD_write_com(0xC0+x);     
  92.          }        
  93. LCD_write_data(s);  
  94. }

  95. void LCD_write_string(unsigned char x,unsigned char y,unsigned char *s)   //寫入字符串函數
  96. {     
  97. if (y == 0)
  98.          {     
  99.          LCD_write_com(0x80 + x);     //表示第一行
  100.          }
  101. else
  102.          {      
  103.          LCD_write_com(0xC0 + x);      //表示第二行
  104.          }        
  105. while (*s)
  106.          {     
  107.     LCD_write_data( *s);     
  108.     s++;     
  109.          }
  110. }

  111. void LCD_init()      //LCD初始化
  112. {
  113.         LCD_write_com(0x38);          //顯示模式設置
  114.         delayms(5);
  115.         LCD_write_com(0x38);
  116.         delayms(5);
  117.         LCD_write_com(0x38);
  118.         delayms(5);
  119.         LCD_write_com(0x38);        
  120.         LCD_write_com(0x08);               //顯示關閉
  121.         LCD_write_com(0x01);         //清屏
  122.         LCD_write_com(0x06);         //顯示光標移動設置
  123.         delayms(5);
  124.         LCD_write_com(0x0C);         //顯示開及光標設置
  125.   
  126. }
  127. /*
  128. void  UART0Init(uint32 bps)
  129. {  
  130.     uint16 Fdiv;
  131.     PINSEL0 = (PINSEL0 & (~0x0F)) | 0x05;        
  132.     U0LCR = 0x83;                                                        
  133.     Fdiv = (Fpclk / 16) / bps;                        
  134.     U0DLM = Fdiv / 256;                                                        
  135.     U0DLL = Fdiv % 256;                                                
  136.     U0LCR = 0x03;
  137. }
  138. */
  139.    void __irq IRQ_Timer0 (void)
  140. {   
  141. //            for(i=0;i<256;i++)
  142. //            {         
  143. //                                y=COSCE[a];
  144. //                                x=SINCE[a];
  145. //                                s=(y*sindata[i]);
  146. //                                c=(x*cosdata[i]);
  147. //                                
  148. //                                sindata[i]=sin(2.0*acos(-1.0)/256*i);
  149. //                                cosdata[i]=cos(2.0*acos(-1.0)/256*i);
  150. //                                
  151. //                                h=(s*0x1ff+0x1ff);
  152. //                                h=s+c;
  153. //                                DACR=((sindata[i]<<6))|(1<<16);
  154. //                                for(j=0;j<0x20;j++);
  155.         
  156.                         if((IO0PIN&KEY1)==0)
  157.        {
  158.                            if(FG1!=(A-5))
  159.                            {
  160.                                FG1=A;A+=5;i=0;
  161.                                            if(A>360) A=0;
  162.                            }
  163.                          }
  164.                         
  165.       if((IO0PIN&KEY1)!=0){ FG1=1; }
  166.                           a=A*180/PI;
  167.                   if((IO0PIN&KEY2)==0)
  168.        {
  169.                              if(FG2!=(A+5))
  170.                          {FG2=A;A-=5;i=0;
  171.                          if(A>360)A=0;}
  172.                          }
  173.                         if((IO0PIN&KEY2)!=0){ FG2=1; }
  174.                         if(A<=90)   a=A/5;
  175.                         if(A>90&A<=180)  a=36-A/5;
  176.                         if(A>180&A<270)  a=A/5-36;
  177.                         if(A>=270&A<360) a=72-A/5;
  178.                         
  179.                         y=COSCE[a];
  180.                   x=SINCE[a];
  181.                         s=(y*sindata[i]);
  182.                         c=(x*cosdata[i]);
  183.                         
  184. //                        sindata[i]=sin(2.0*acos(-1.0)/256*i);
  185. //                        cosdata[i]=cos(2.0*acos(-1.0)/256*i);
  186.                         
  187. //                        h=(s*0x1ff+0x1ff);
  188.                         h=s+c;
  189.                         DACR=((h<<6))|(1<<16);
  190.                         for(j=0;j<0x20;j++);
  191.       
  192.                
  193.                         AD0CR = (AD0CR&0x00FFFF00)|0x01|(1 << 24);        // 設置AD0.0,并進行第一次轉換
  194.                         while( (AD0DR&0x80000000)==0 );                    // 等待轉換結束
  195.                         ADC_Data = AD0DR;                                                        // 讀取ADC結果
  196.                         ADC_Data = (ADC_Data>>6) & 0x3FF;           // 提取AD轉換值

  197.                         
  198.                         Buffer[i]=ADC_Data;
  199.            
  200.            LCD_write_char(9,0,A/100%10+0X30);
  201.            LCD_write_char(10,0,A/10%10+0X30);
  202.            LCD_write_char(11,0,A%10+0X30);

  203.                 for(u=0;u<256;u++)
  204.                 {
  205.                         data_1 = data_1 +(Buffer[u]-0x7f)*(cosdata[u]-0x7f)/256;//-5170)*PI/128;
  206.                         data_2 = data_2 +(Buffer[u]-0x7f)*(sindata[u]-0x7f)/256;//-5170)*PI/128;        
  207.                 }
  208.                         data_4 = atan(data_1 /data_2)*180/acos(-1.0);
  209.                         tt1=data_4*10;//1;
  210.                         
  211.                         if(A>90&A<180)   tt1=1800-tt1;
  212.                         if(A>180&A<270)  tt1=1800+tt1;  
  213.                         if(A>270&A<360)  tt1=3600-tt1;  
  214.                
  215.                         LCD_write_char(9,1,tt1/1000%10+0X30);        
  216.                         LCD_write_char(10,1,tt1/100%10+0X30);
  217.                         LCD_write_char(11,1,tt1/10%10+0X30);
  218.                         LCD_write_char(12,1,'.');
  219.                         LCD_write_char(13,1,tt1%10+0X30);
  220.            

  221. //        LCD_write_char(6,1,tt2/1000%10+0X30);        
  222. //        LCD_write_char(7,1,tt2/100%10+0X30);
  223. //    LCD_write_char(8,1,tt2/10%10+0X30);
  224. //    LCD_write_char(9,1,'.');
  225. //        LCD_write_char(10,1,tt2%10+0X30);
  226.     i++;
  227.     if(i>=256) i=0;
  228.           T0IR = 0x02;                                /* 清除中斷標志                                                                        */
  229.           VICVectAddr = 0x00;                        /* 通知VIC中斷處理結束                                                        */
  230. //}
  231. }

  232. void  Time0Init(void)
  233. {  
  234.            T0TC   = 0;                              // 定時器T0初始化
  235.            T0PR = 10;              // 設置定時器0分頻為100分頻,得120000Hz
  236.     T0MCR = 0x03<<3;                // 匹配通道MR1匹配中斷并復位TC
  237.           T0MR0 = Fpclk/12000;          // MR0比較值(0.5秒定時值)
  238.           T0MR1 = Fpclk/1200;          // MR1比較值(0.5秒定時值)
  239.     T0EMR = 0x30;                    // 設置定時器0的MR0匹配輸出,輸出方式為翻轉
  240.           T0TCR = 0x03;           // 啟動并復位T0TC
  241.           T0TCR = 0x01;      
  242.     T0IR = 0x02;

  243.    /* 設置定時器0中斷IRQ */
  244.    VICIntSelect = 0x00;                                        // 所有中斷通道設置為IRQ中斷
  245.    VICVectCntl0 = 0x20 | 0x04;                         // 分配定時器0中斷到通道0(最高優先級)
  246.    VICVectAddr0 = (uint32)IRQ_Timer0;         // 設置中斷服務程序地址向量
  247.    VICIntEnable = (1<<4);                    // 使能定時器0中斷
  248. //   IRQEnable();                                                 // 使能IRQ中斷
  249. }

  250. int  main(void)
  251. {            
  252.     PINSEL0|=0x00000000;               
  253.            PINSEL1 |= 0x01400000;
  254.           PINSEL1 = (PINSEL1&(~(0x03<<18))) | (0x02<<18); // P0.25 連接Aout
  255. //    UART0Init(9600);
  256.     IO0DIR|=0X01;                                                
  257.           IO1DIR|=0x07ff0000;
  258.            LCD_init();                                                               
  259.           Time0Init();
  260.     AD0CR = (1 << 0)                    |        
  261.            ((Fpclk / 1000000 - 1) << 8) |         
  262.            (0 << 16)                    |        
  263.            (0 << 17)                    |         
  264.            (1 << 21)                    |                 
  265.            (0 << 22)                    |                 
  266.            (1 << 24)                    |                 
  267.            (0 << 27);                                                        
  268.     delayms(10);                                                               
  269.     ADC_Data = AD0DR;

  270.           LCD_write_string(0,0,"in:");
  271.           LCD_write_string(0,1,"out:");               
  272.         
  273.     while(1)
  274.     {
  275. //                   y=COSCE[a];
  276. //                                x=SINCE[a];
  277. //                                s=(y*sindata[i]);
  278. //                                c=(x*cosdata[i]);
  279.                                 
  280. //                                sindata[i]=sin(2.0*acos(-1.0)/256*i);
  281. //                                cosdata[i]=cos(2.0*acos(-1.0)/256*i);
  282.                                 
  283. ……………………

  284. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
數字信號處理課程設計.zip (343.14 KB, 下載次數: 77)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:858959 發表于 2021-3-27 20:50 來自手機 | 只看該作者
有錯誤,不能直接使用
回復

使用道具 舉報

板凳
ID:858959 發表于 2021-3-27 20:50 來自手機 | 只看該作者
需要修改,不知道是電路問題還是代碼問題
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区免费在线观看 | 日本超碰 | 欧美一区二区在线观看 | 久久视频精品 | 欧美精品啪啪 | 午夜国产羞羞视频免费网站 | 亚洲欧美日韩中文字幕一区二区三区 | 国产精品国产三级国产aⅴ无密码 | 成年人精品视频在线观看 | 国产精品精品视频一区二区三区 | 日韩午夜电影在线观看 | 国产精品夜色一区二区三区 | 久精品视频 | 亚洲天堂av一区 | 日韩一区不卡 | 91在线视频免费观看 | 国产一级片久久久 | 超碰在线人人 | 欧美久久久久久久久中文字幕 | 亚洲一区在线观看视频 | 久久久久久久久91 | 日韩久久网 | 欧美午夜视频 | 色资源站 | 国产精品毛片无码 | 色婷婷国产精品 | 午夜影视大全 | 国产91精品在线 | 亚洲精品九九 | 日韩精品免费视频 | 亚洲毛片网站 | 一区 | 精品久久精品 | 久久丝袜 | 国产成人精品一区二区三区网站观看 | 欧美国产视频 | 久草网站 | 日本三级全黄三级a | 男人av网 | 怡红院成人在线视频 | 欧美成人激情 |