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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的DAC0832波形發生器,是學校的比賽,硬件以實現有圖

[復制鏈接]
跳轉到指定樓層
樓主
本人第一次發技術貼,是學校一個比賽項目,項目要求如下:簡單說就是用51單片機產生頻率可調的方波,正弦波,鋸齒波和三角波。
本人使用DAC0832芯片和LM358N完成數模轉換及信號放大。正弦波形有一點點失真。歡迎大神給后續意見,僅供學習。
keil文件及c語言文件在下面。
電路原理圖如下:


示波器實測波形如下:


單片機源程序如下:
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit LCD_RST=P0^5;
  5. sbit LCD_CE=P0^4;
  6. sbit LCD_DC=P0^3;
  7. sbit SDIN=P0^2;
  8. sbit SCLK=P0^1;
  9. void LCD_write_byte(unsigned char dat, unsigned char command)                ;
  10. void LCD_init(void);
  11. void delay_1us();
  12. void LCD_set_XY(unsigned char X, unsigned char Y);
  13. void LCD_clear();
  14. void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,unsigned char Pix_x,unsigned char Pix_y);               
  15. bit run=1;
  16. sbit cs=P1^2;//DAC0832的輸入寄存器的選擇端
  17. sbit wr=P1^3;//DAC0832輸入寄存器的寫選通信號
  18. sbit s1=P3^4;//按鍵
  19. sbit s2=P3^3;//按鍵
  20. sbit s3=P3^2;//按鍵
  21. uchar s1num=0,ys=30;//ys表示延時函數實參的初始值;s1num表示按鍵切換的代碼
  22. uchar code Sin[256]={
  23. 0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,
  24. …………
  25. …………
  26. …………限于本文篇幅 余下代碼請從51黑下載附件…………
  27. 0x00,0x00,0x7F,0x40,0x50,0x48,0x44,0x43,0x44,0x48,0x50,0x40,0xFF,0x00,0x00,0x00};

  28. void keyscanf();//波形切換函數
  29. void delay1(uchar y);//聲明延時函數

  30. void main()//主函數
  31. {       
  32.         uchar i;
  33.         IT0=1;
  34.         EX0=1;
  35.         IT1=1;
  36.         EX1=1;
  37.         EA=1;

  38.         LCD_init();//LCD初始化          
  39.         cs=0;//打開輸入寄存器選擇端(詳見DAC0832的操作時序)
  40.         while(1)
  41.         {
  42.                 keyscanf();//調用波形切換函數
  43.                 if(s1num==0)//方波(s1沒有按下)
  44.         {       
  45.                 if(run==1)
  46.          {
  47.                  LCD_draw_bmp_pixel(0,0,dang,16,16) ;
  48.                 LCD_draw_bmp_pixel(17,0,qian,16,16) ;
  49.                 LCD_draw_bmp_pixel(33,0,shu,16,16) ;
  50.                 LCD_draw_bmp_pixel(49,0,chu,16,16) ;
  51.                 LCD_draw_bmp_pixel(65,0,fang,16,16) ;
  52.                 LCD_draw_bmp_pixel(0,2,bo,16,16) ;
  53.                 LCD_draw_bmp_pixel(17,2,douhao,16,16) ;
  54.                 LCD_draw_bmp_pixel(33,2,an,16,16) ;
  55.                 LCD_draw_bmp_pixel(49,2,xia,16,16) ;
  56.                 LCD_draw_bmp_pixel(65,2,shu,16,16) ;
  57.                 LCD_draw_bmp_pixel(0,4,chu,16,16) ;
  58.                 LCD_draw_bmp_pixel(17,4,san,16,16) ;
  59.                 LCD_draw_bmp_pixel(33,4,jiao,16,16) ;
  60.                 LCD_draw_bmp_pixel(49,4,bo,16,16) ;
  61.                 run=0;
  62.         }
  63.                 for(i=0;i<255;i++)
  64.                 {
  65.                         P2=0x00;
  66.                         wr=0;//輸入寄存器寫選通信號有效(詳見DAC0832的操作時序)
  67.                         wr=1;//關閉寫選通信號
  68.                 }
  69.                 delay1(ys);//通過延時時間的長短改變信號的頻率
  70.                 for(i=0;i<255;i++)
  71.                 {
  72.                         P2=0xff;
  73.                         wr=0;
  74.                         wr=1;
  75.                 }
  76.                 delay1(ys);//通過延時時間的長短改變信號的頻率
  77.         }
  78.         if(s1num==1)//三角波(s1第一次按下)
  79.         {       
  80.                 if(run==1)
  81.          {
  82.                  LCD_draw_bmp_pixel(0,0,dang,16,16) ;
  83.                 LCD_draw_bmp_pixel(17,0,qian,16,16) ;
  84.                 LCD_draw_bmp_pixel(33,0,shu,16,16) ;
  85.                 LCD_draw_bmp_pixel(49,0,chu,16,16) ;
  86.                 LCD_draw_bmp_pixel(65,0,san,16,16) ;
  87.                 LCD_draw_bmp_pixel(0,2,jiao,16,16) ;
  88.                 LCD_draw_bmp_pixel(17,2,bo,16,16) ;
  89.                 LCD_draw_bmp_pixel(33,2,an,16,16) ;
  90.                 LCD_draw_bmp_pixel(49,2,xia,16,16) ;
  91.                 LCD_draw_bmp_pixel(65,2,shu,16,16) ;
  92.                 LCD_draw_bmp_pixel(0,4,chu,16,16) ;
  93.                 LCD_draw_bmp_pixel(17,4,ju,16,16) ;
  94.                 LCD_draw_bmp_pixel(33,4,chi,16,16) ;
  95.                 LCD_draw_bmp_pixel(49,4,bo,16,16) ;
  96.                 run=0;
  97.                 }
  98.         for(i=0;i<255;i++)
  99.         {
  100.         P2=i;
  101.         wr=0;
  102.         wr=1;
  103.         }
  104.         delay1(ys);//通過延時時間的長短改變信號的頻率
  105.         for(i=255;i>0;i--)
  106.         {
  107.         P2=i;
  108.         wr=0;
  109.         wr=1;
  110.         }
  111.         delay1(ys);//通過延時時間的長短改變信號的頻率
  112.         }
  113.         if(s1num==2)//鋸齒波(s1第二次按下)
  114.         {
  115.                 if(run==1)
  116.          {
  117.                  LCD_draw_bmp_pixel(0,0,dang,16,16) ;
  118.                 LCD_draw_bmp_pixel(17,0,qian,16,16) ;
  119.                 LCD_draw_bmp_pixel(33,0,shu,16,16) ;
  120.                 LCD_draw_bmp_pixel(49,0,chu,16,16) ;
  121.                 LCD_draw_bmp_pixel(65,0,ju,16,16) ;
  122.                 LCD_draw_bmp_pixel(0,2,chi,16,16) ;
  123.                 LCD_draw_bmp_pixel(17,2,bo,16,16) ;
  124.                 LCD_draw_bmp_pixel(33,2,an,16,16) ;
  125.                 LCD_draw_bmp_pixel(49,2,xia,16,16) ;
  126.                 LCD_draw_bmp_pixel(65,2,shu,16,16) ;
  127.                 LCD_draw_bmp_pixel(0,4,chu,16,16) ;
  128.                 LCD_draw_bmp_pixel(17,4,zheng,16,16) ;
  129.                 LCD_draw_bmp_pixel(33,4,xian,16,16) ;
  130.                 LCD_draw_bmp_pixel(49,4,bo,16,16) ;
  131.                 run=0;
  132.         }
  133.         for(i=0;i<255;i++)
  134.         {
  135.         P2=i;
  136.         wr=0;
  137.         wr=1;
  138.         }
  139.         delay1(ys);//通過延時時間的長短改變信號的頻率
  140.         }
  141.         if(s1num==3)//正弦波(s1第三次按下)
  142.         {
  143.                 if(run==1)
  144.          {
  145.                  LCD_draw_bmp_pixel(0,0,dang,16,16) ;
  146.                 LCD_draw_bmp_pixel(17,0,qian,16,16) ;
  147.                 LCD_draw_bmp_pixel(33,0,shu,16,16) ;
  148.                 LCD_draw_bmp_pixel(49,0,chu,16,16) ;
  149.                 LCD_draw_bmp_pixel(65,0,zheng,16,16) ;
  150.                 LCD_draw_bmp_pixel(0,2,xian,16,16) ;
  151.                 LCD_draw_bmp_pixel(17,2,bo,16,16) ;
  152.                 LCD_draw_bmp_pixel(33,2,an,16,16) ;
  153.                 LCD_draw_bmp_pixel(49,2,xia,16,16) ;
  154.                 LCD_draw_bmp_pixel(65,2,shu,16,16) ;
  155.                 LCD_draw_bmp_pixel(0,4,chu,16,16) ;
  156.                 LCD_draw_bmp_pixel(17,4,fang,16,16) ;
  157.                 LCD_draw_bmp_pixel(33,4,bo,16,16) ;
  158.                 run=0;
  159.                 }
  160.         for(i=0;i<255;i++)
  161.         {
  162.         P2=Sin[i];
  163.         wr=0;
  164.         wr=1;
  165.         }
  166.         delay1(ys);//通過延時時間的長短改變信號的頻率
  167.         }
  168.         }
  169. }
  170. void LCD_write_byte(unsigned char dat, unsigned char command)
  171.   {
  172.     unsigned char i;
  173.     LCD_CE = 0;                              //5110片選有效,允許輸入數據
  174.     if (command == 0)                        //寫命令
  175.          LCD_DC = 0;                          
  176.     else  LCD_DC = 1;                    //寫數據
  177.       for(i=0;i<8;i++)                            //傳送8bit數據
  178.             {
  179. if(dat&0x80)
  180.                         SDIN = 1;
  181.                   else
  182.                         SDIN = 0;
  183.                   SCLK = 0;
  184.                   dat = dat << 1;
  185.                   SCLK = 1;
  186. }
  187.      LCD_CE = 1;                                //禁止5110
  188.   }


  189. void delay_1us()
  190. {
  191.         unsigned int y;

  192.        
  193.                 for(y=110;y>0;y--)
  194.                 {}
  195. }

  196. /***********************************************************
  197. 函數名稱:LCD_init
  198. 函數功能:5110初始化
  199. 入口參數:無
  200. 出口參數:無
  201. 備 注:
  202. ***********************************************************/
  203. void LCD_init(void)
  204.   {
  205.    LCD_RST = 0;     // 產生一個讓LCD復位的低電平脈沖
  206.     delay_1us();
  207.    LCD_RST = 1;

  208.    LCD_CE = 0;     // 關閉LCD
  209.     delay_1us();
  210.    LCD_CE = 1;     // 使能LCD
  211.     delay_1us();

  212.     LCD_write_byte(0x21, 0);      // 使用擴展命令設置LCD模式
  213.     LCD_write_byte(0xc8, 0);      // 設置液晶偏置電壓
  214.     LCD_write_byte(0x06, 0);      // 溫度校正
  215.     LCD_write_byte(0x13, 0);      // 1:48
  216.     LCD_write_byte(0x20, 0);      // 使用基本命令,V=0,水平尋址
  217.         LCD_clear();                 // 清屏
  218.     LCD_write_byte(0x0c, 0);      // 設定顯示模式,正常顯示
  219.    
  220.     LCD_CE = 0;      // 關閉LCD
  221.   }

  222. /***********************************************************
  223. 函數名稱:LCD_set_XY
  224. 函數功能:設置LCD坐標函數
  225. 入口參數:X       :0-83
  226.           Y       :0-5
  227. 出口參數:無
  228. 備 注:
  229. ***********************************************************/
  230. void LCD_set_XY(unsigned char X, unsigned char Y)
  231. {
  232.     LCD_write_byte(0x40 | Y, 0);              // column
  233.     LCD_write_byte(0x80 | X, 0);        // row
  234. }

  235. /***********************************************************
  236. 函數名稱:LCD_draw_bmp_pixel
  237. 函數功能:位圖繪制函數
  238. 入口參數:X、Y    :位圖繪制的起始X、Y坐標;
  239.           *map    :位圖點陣數據;
  240.           Pix_x   :位圖像素(長)
  241.           Pix_y   :位圖像素(寬)
  242. 出口參數:無
  243. 備 注:
  244. ***********************************************************/
  245. void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,unsigned char Pix_x,unsigned char Pix_y)
  246. {
  247.     unsigned int i,n;
  248.     unsigned char row;
  249.                                             //計算位圖所占行數
  250.       if (Pix_y%8==0)             //如果為位圖所占行數為整數
  251.            row=Pix_y/8;      
  252.       else
  253.          row=Pix_y/8+1;            //如果為位圖所占行數不是整數
  254.    
  255.       LCD_set_XY(X,Y);
  256.     for (n=0;n<row;n++)            //換行
  257.       {      
  258.         for(i=0;i<Pix_x;i++)
  259.           {      
  260.                  LCD_set_XY(X+i,Y+n);
  261.              LCD_write_byte(map[i+n*Pix_x], 1);
  262.           }                        
  263.       }      
  264. }

  265. void LCD_clear()
  266. {
  267.         unsigned char t,k;
  268.         LCD_set_XY(0,0);
  269.         for(t=0;t<6;t++)
  270.         {
  271.                 for(k=0;k<84;k++)
  272.                 LCD_write_byte(0x00,1);
  273.         }

  274. }
  275. void keyscanf()//波形切換函數
  276. {
  277. if(s1==0)//判斷按鍵按下
  278. {
  279. delay1(20);//延時消除抖動
  280. if(s1==0)//重新判斷
  281. {
  282. while(!s1);//等待按鍵釋放
  283. s1num++;
  284. run=1;
  285. s1num=s1num%4;//波形的切換由此數值來決定
  286. }
  287. }
  288. }
  289. void delay1(uchar y)//延時函數
  290. {
  291. uchar i;
  292. for(i=y;i>0;i--);
  293. }

  294. void aaaa() interrupt 0
  295. {
  296. if(s3==0)//判斷按鍵按下
  297. {
  298. delay1(20);//延時消除抖動
  299. if(s3==0)//重新判斷
  300. {
  301. while(!s3);//等待按鍵釋放
  302.         ys++;
  303. }
  304. }                       

  305. }
  306. void bbbb() interrupt 2
  307. {
  308. if(s2==0)//判斷按鍵按下
  309. {
  310. delay1(20);//延時消除抖動
  311. if(s2==0)//重新判斷
  312. {
  313. while(!s2);//等待按鍵釋放
  314.         …………
  315. …………
  316. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
基于51單片機的波形發生器.rar (28.66 KB, 下載次數: 77)





評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:514789 發表于 2019-4-24 11:35 | 只看該作者
基于STM32可以嗎~
回復

使用道具 舉報

板凳
ID:283491 發表于 2019-11-9 16:45 | 只看該作者

可以的,改代碼吧
回復

使用道具 舉報

地板
ID:421805 發表于 2019-11-13 06:00 來自手機 | 只看該作者
謝謝分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久久网站 | 日韩精品久久久久久 | 成人综合久久 | 午夜国产一级 | 欧美一级黄色网 | 盗摄精品av一区二区三区 | 久久成人国产精品 | 一区二区三区在线观看视频 | 国产精品美女www爽爽爽视频 | 婷婷色在线 | 欧美a√ | 在线观看视频91 | 久久91精品国产 | 中文字幕一区二区三区在线观看 | 国产女人第一次做爰毛片 | 精品国产一区二区三区四区在线 | 成人深夜福利在线观看 | 亚洲欧美综合 | 欧美国产一区二区 | wwwxxx国产| 午夜日韩| 一区二区在线免费播放 | 在线播放国产一区二区三区 | 国产精品18hdxxxⅹ在线 | 日韩精品一区二区三区中文字幕 | 亚洲第1页 | 欧美成人a∨高清免费观看 欧美日韩中 | 亚洲欧美激情国产综合久久久 | 久热精品视频 | 日本福利在线 | 欧美8一10sex性hd | 久久伊人精品 | 国产精品国产成人国产三级 | 午夜精品久久久久久久久久久久久 | 日韩久久中文字幕 | 九色视频网站 | 亚洲伊人精品酒店 | 中文字幕爱爱视频 | 欧美成人精品一区二区三区 | 国产亚洲一区二区三区 | 日本福利视频 |