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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2447|回復: 0
收起左側

單片機怎么調節AD9850產生10MHZ方波信號?(目前程序顯示成矩形波)

[復制鏈接]
ID:531083 發表于 2019-5-10 16:54 | 顯示全部樓層 |閱讀模式
程序運行正確,電路可以顯示正常的正弦波,方波的占空比設置不對,顯示成了矩形波的樣子,頻率也只在50KHZ-3MHZ之間有波形,高了低了都會失真
希望哪位大神可以幫忙看著是哪里出了問題,虛心請教

單片機源程序如下:
  1. #include"reg51.h"
  2. #include <intrins.h>                                 //編譯預處理命令
  3. #define LCD_GO_HOME               0x02         //AC=0,光標、畫面回HOME位
  4. //輸入方式設置
  5. #define LCD_AC_AUTO_INCREMENT     0x06         //數據讀、寫操作后,AC自動增一
  6. #define LCD_AC_AUTO_DECREASE      0x04         //數據讀、寫操作后,AC自動減一
  7. #define LCD_MOVE_ENABLE           0x05         //數據讀、寫操作,畫面平移
  8. #define LCD_MOVE_DISENABLE        0x04         //數據讀、寫操作,畫面不動
  9. //設置顯示、光標及閃爍開、關
  10. #define LCD_DISPLAY_ON            0x0C         //顯示開
  11. #define LCD_DISPLAY_OFF           0x08         //顯示關
  12. #define LCD_CURSOR_ON             0x0A         //光標顯示
  13. #define LCD_CURSOR_OFF            0x08         //光標不顯示
  14. #define LCD_CURSOR_BLINK_ON       0x09         //光標閃爍
  15. #define LCD_CURSOR_BLINK_OFF      0x08         //光標不閃爍
  16. //光標、畫面移動,不影響DDRAM
  17. #define LCD_LEFT_MOVE             0x18         //LCD顯示左移一位
  18. #define LCD_RIGHT_MOVE            0x1C         //LCD顯示右移一位
  19. #define LCD_CURSOR_LEFT_MOVE      0x10         //光標左移一位
  20. #define LCD_CURSOR_RIGHT_MOVE     0x14         //光標右移一位
  21. //工作方式設置
  22. #define LCD_DISPLAY_DOUBLE_LINE   0x38         //兩行顯示
  23. #define LCD_DISPLAY_SINGLE_LINE   0x30         //單行顯示
  24. void LCD_cls(void);
  25. void LCD_write_data(unsigned char);
  26. void LCD_initial(void);
  27. void LCD_set_position(unsigned char);
  28. void LCD_prints(unsigned char *);
  29. void LCD_printc(unsigned char);
  30. #define LCD_DATA P0      //LCD的數據口
  31. sbit LCD_BUSY=LCD_DATA^7;  //LCD忙信號位
  32. sbit LCD_RS=P2^5;          //LCD寄存器選擇
  33. sbit LCD_RW=P2^6;          //LCD讀寫控制
  34. sbit LCD_EN=P2^7;          //LCD使能信號*/
  35. extern void          _nop_     (void);
  36. unsigned char s;                  //無符號
  37. char code tab[4][4]={                {'1','2','3','A'},
  38.                                           {'4','5','6','B'},
  39.                                           {'7','8','9','C'},
  40.                                           {'*','0','#','D'}};       //0到F的16個鍵植
  41. ////////////////////////////////////////////////////////////////////
  42. //---------------------------------------------------//
  43. //                   程序                            //
  44. //---------------------------------------------------//




  45. sbit ad9850_w_clk    =P1^2;  //P2.2口接ad9850的w_clk腳/PIN7
  46. sbit ad9850_fq_up    =P1^1;  //P2.1口接ad9850的fq_up腳/PIN8
  47. sbit ad9850_rest     =P1^0;  //P2.0口接ad9850的rest腳/PIN12
  48. sbit ad9850_bit_data =P1^3;  //P1.7口接ad9850的D7腳/PIN25

  49. //***************************************************//
  50. //              ad9850復位(串行模式)                 //
  51. //---------------------------------------------------//
  52. void ad9850_reset_serial()
  53. {
  54. ad9850_w_clk=0;
  55. ad9850_fq_up=0;
  56. //rest信號
  57. ad9850_rest=0;
  58. ad9850_rest=1;
  59. ad9850_rest=0;
  60. //w_clk信號
  61. ad9850_w_clk=0;
  62. ad9850_w_clk=1;
  63. ad9850_w_clk=0;
  64. //fq_up信號
  65. ad9850_fq_up=0;
  66. ad9850_fq_up=1;
  67. ad9850_fq_up=0;
  68. }

  69. //***************************************************//
  70. //          向ad9850中寫命令與數據(串行)             //
  71. //---------------------------------------------------//
  72. void ad9850_wr_serial(unsigned char w0,double frequence)
  73. {
  74. unsigned char i,w;
  75. long int y;
  76. double x;
  77. //計算頻率的HEX值
  78. x=4294967295/125;//適合125M晶振
  79. //如果時鐘頻率不為180MHZ,修改該處的頻率值,單位MHz  !!!
  80. frequence=frequence/1000000;
  81. frequence=frequence*x;
  82. y=frequence;
  83. //寫w2數據
  84. w=(y>>8);
  85. for(i=0;i<8;i++)
  86. {
  87. ad9850_bit_data=(w>>i)&0x01;
  88. ad9850_w_clk=1;
  89. ad9850_w_clk=0;
  90. }
  91. //寫w1數據
  92. w=(y>>24);
  93. for(i=0;i<8;i++)
  94. {
  95. ad9850_bit_data=(w>>i)&0x01;
  96. ad9850_w_clk=1;
  97. ad9850_w_clk=0;
  98. }
  99. //寫w0數據
  100. w=w0;   
  101. for(i=0;i<8;i++)
  102. {
  103. ad9850_bit_data=(w>>i)&0x01;
  104. }
  105. }
  106. //////////////////////////////////////////////////////////////////////
  107. void LCD_check_busy(void)   //檢測LCD狀態,看它是不是還在忙呢
  108. {
  109. while(1)
  110.   {
  111.    LCD_EN=0;
  112.    LCD_RS=0;
  113.    LCD_RW=1;
  114.    LCD_DATA=0xff;
  115.    LCD_EN=1;
  116.    if(!LCD_BUSY)break;
  117.   }
  118. LCD_EN=0;
  119. }

  120. void LCD_cls(void)          //LCD清屏
  121. {

  122. LCD_check_busy();
  123. LCD_RS=0;
  124. LCD_RW=0;
  125. LCD_DATA=1;
  126. LCD_EN=1;
  127. LCD_EN=0;

  128. }

  129. void LCD_write_instruction(unsigned char LCD_instruction)   //寫指令到LCD
  130. {
  131.   LCD_check_busy();
  132. LCD_RS=0;
  133. LCD_RW=0;

  134. LCD_DATA=LCD_instruction;
  135. LCD_EN=1;
  136. LCD_EN=0;
  137. }

  138. void LCD_write_data(unsigned char LCD_data)      //輸出一個字節數據到LCD
  139. {
  140.   LCD_check_busy();
  141. LCD_RS=1;
  142. LCD_RW=0;

  143. LCD_DATA=LCD_data;
  144. LCD_EN=1;
  145. LCD_EN=0;
  146. }

  147. void LCD_set_position(unsigned char x)            //LCD光標定位到x處
  148. {
  149. LCD_write_instruction(0x80+x);
  150. }

  151. /*
  152. void LCD_go_home(void)                         //LCD光標歸位
  153. {
  154. LCD_write_instruction(LCD_GO_HOME);
  155. }
  156. */

  157. void LCD_printc(unsigned char lcd_data)          //輸出一個字符到LCD
  158. {
  159. LCD_write_data(lcd_data);
  160. }

  161. void LCD_prints(unsigned char *lcd_string)       //輸出一個字符串到LCD
  162. {
  163. unsigned char i=0;
  164. while(lcd_string[i]!=0x00)
  165.   {
  166.    LCD_write_data(lcd_string[i]);
  167.    i++;
  168.   }
  169. }

  170. void LCD_initial(void)                        //初始化LCD
  171. {
  172. LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
  173. LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
  174. LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE);
  175. LCD_cls();
  176. }
  177. void delay(unsigned char a)
  178.         {
  179.         unsigned char i;
  180.         while(a--)
  181.                 for(i=100;i>0;i--)
  182.                         ;
  183.         }

  184. char kbscan()          //鍵盤掃描
  185.         {
  186.          unsigned char hang,lie,key;
  187.         if(P3!=0x0f)
  188.         delay(5);
  189.         if(P3!=0x0f)
  190.                 {
  191.         
  192.                 switch(P3&0x0f)
  193.                                 {
  194.                                 case 0x0e:hang=3;break;
  195.                                 case 0x0d:hang=2;break;
  196.                                 case 0x0b:hang=1;break;
  197.                                 case 0x07:hang=0;break;
  198.                                 }
  199.                 P3=0xf0;
  200.                 P3=0xf0;
  201.                 switch(P3&0xf0)
  202.                                 {
  203.                                 case 0xe0:lie=0;break;
  204.                                 case 0xd0:lie=1;break;
  205.                                 case 0xb0:lie=2;break;
  206.                                 case 0x70:lie=3;break;
  207.                                 }
  208.                 P3=0x0f;
  209.                 while(P3!=0x0f);
  210.                 key=tab[hang][lie];
  211.                 }
  212.         else
  213.                 key=0;
  214.         return (key);
  215.         }

  216. void main()
  217.         {
  218.         unsigned char temp[10];
  219.         unsigned int shuzi[10];
  220.         long int f=10000;
  221.      s=0;
  222.         LCD_initial();
  223.         LCD_prints("SET Frequence:");
  224.         LCD_set_position(0x4E);
  225.         LCD_printc('H');
  226.         LCD_set_position(0x4f);
  227.         LCD_printc('z');
  228.          //LCD_cls();
  229.         P3=0x0f;
  230.         P0=0xff;
  231. //---------------------------------------------------//

  232. ad9850_reset_serial();
  233. //ad9850_wr_serial(0x00,2500);//串行寫2500Hz程序
  234. //---------------------------------------------------//         
  235.         while(1)
  236.                 {
  237.                   
  238.                ad9850_wr_serial(0x00,f);
  239.                 temp[s]=kbscan();
  240.                 shuzi[s]=temp[s]-48;
  241.                           

  242. if(s==1)
  243. {
  244.   f=shuzi[0];
  245.   }
  246. if(s==2)
  247. {
  248.   f=shuzi[1]+10*shuzi[0];
  249.   }
  250. if(s==3)
  251. {
  252.   f=shuzi[2]+10*shuzi[1]+100*shuzi[0];
  253. //shuzi[3]+10*shuzi[2]+100*shuzi[1]+1000*shuzi[0];
  254.   }
  255. if(s==4)
  256. {
  257. f=shuzi[3]+10*shuzi[2]+100*shuzi[1]+1000*shuzi[0];
  258.   }
  259. if(s==5)
  260. {
  261. f=shuzi[4]+10*shuzi[3]+100*shuzi[2]+1000*shuzi[1]+10000*shuzi[0];
  262.   }
  263. if(s==6)
  264. {
  265. f=shuzi[5]+10*shuzi[4]+100*shuzi[3]+1000*shuzi[2]+10000*shuzi[1]+100000*shuzi[0];
  266.   }
  267. if(s==7)
  268. {
  269. f=shuzi[6]+10*shuzi[5]+100*shuzi[4]+1000*shuzi[3]+10000*shuzi[2]+100000*shuzi[1]+1000000*shuzi[0];
  270.   }
  271. if(s==8)
  272. {
  273. f=shuzi[7]+10*shuzi[6]+100*shuzi[5]+1000*shuzi[4]+10000*shuzi[3]+100000*shuzi[2]+1000000*shuzi[1]+10000000*shuzi[0];
  274.   }
  275. s=0;                           
  276. shuzi[0]=0;shuzi[1]=0;shuzi[2]=0;shuzi[3]=0;shuzi[4]=0;
  277.                                 shuzi[5]=0;shuzi[6]=0;shuzi[7]=0;shuzi[8]=0;shuzi[9]=0;        }
  278.                           else
  279.                           {
  280.                             P0=temp[s];
  281.                             LCD_set_position(0x40+s);
  282.                             LCD_printc(temp[s]);
  283.                             s=s+1;
  284.                           }
  285.                         }
  286.                 }
  287.         }
復制代碼


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品福利网站 | 91精品久久久久久久久 | 欧美日韩亚洲三区 | 中文字幕av网址 | www.亚洲精品 | 黄网站涩免费蜜桃网站 | 911影院 | 男女羞羞的网站 | 国产一区二区观看 | 欧美成人免费在线视频 | www97影院| 久久国产精品视频 | 免费看国产精品视频 | 免费a大片 | 久久久久免费观看 | 久久精品国产免费 | 午夜国产 | 在线视频亚洲 | 精品欧美一区二区三区久久久 | 亚洲国产精品一区二区三区 | 亚洲黄色成人网 | 日韩电影免费在线观看中文字幕 | 日韩欧美在线观看视频 | 无码一区二区三区视频 | 久久综合九九 | 成人精品一区二区三区 | 久久亚洲欧美日韩精品专区 | 日日夜夜操天天干 | 国产精品久久久久久影视 | 九九热在线视频免费观看 | 亚洲欧洲一区二区 | 成人精品一区二区三区中文字幕 | 国产欧美日韩一区二区三区在线 | 欧美日韩一区二区三区四区五区 | 国产精品久久av | 在线观看国产视频 | 久久久久久久久毛片 | 人人干超碰 | 日本不卡一区二区三区 | 一区二区三区视频在线免费观看 | 久草色视频 |