找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4400|回复: 0
打印 上一主题 下一主题
收起左侧

DAC0832信号发生器实验-Proteus仿真51单片机开发板平台

[复制链接]
跳转到指定楼层
楼主
ID:223055 发表于 2017-8-2 02:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

自己做的一个proteus仿真的51单片机开发板,有完整的试验步骤和仿真工程文件提供
板子上带扩展ROM空间(i^2c 24c02)、adc(数字电压表)、dac(信号发生器)、矩形按键(计算器),四个任务通过独立按键进行切换

下面是基于DAC0832芯片信号发生器(1602液晶显示)部分的的单片机源程序
完整代码和仿真工程文件请下载http://www.51hei.com/bbs/dpj-91558-1.html

  1. #include <reg51.h>
  2. #include<string.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. //--LCD????
  6. sbit RS=P2^6;
  7. sbit RW=P2^5;
  8. sbit EN=P2^7;
  9. //--??
  10. sbit K1=P2^2;
  11. sbit K2=P2^3;
  12. sbit K3=P2^4;
  13. sbit K4=P3^6;
  14. sbit K5=P3^7;
  15. //sbit key=P3^4;


  16. uchar WaveChoice=1;
  17. uchar ys=30;
  18. uchar i1,b1=0;
  19. uchar sqar_num=128;
  20. uint freq;

  21. uchar code Sin[]={"Sine      "};
  22. //uchar code exp[]={"Exp      "};
  23. uchar code Squ[]={"Square    "} ;
  24. uchar code Tri[]={"Triangle  "};
  25. uchar code Saw[]={"Sawtooth  "} ;
  26. uchar code No[]={"No Signal out "};
  27. uchar code Wave[]={"Wave :"};
  28. uchar code Fre[]={"Freq :"};

  29. uchar  code tosin[256]=
  30. {0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,
  31. 0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,
  32. 0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,
  33. 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
  34. 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,
  35. 0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,
  36. 0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,
  37. 0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
  38. 0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,
  39. 0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,
  40. 0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,
  41. 0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,
  42. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,
  43. 0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,
  44. 0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,
  45. 0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e ,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,
  46. 0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 }; //????

  47. //--??MS
  48. void DelayMS(uchar ms)
  49. {
  50.         uchar i;
  51.         while(ms--) for(i=0;i<120;i++);
  52. }
  53. //--??y*9us
  54. void Delay1(uint y)
  55. {
  56.          uint i;
  57.         for(i=y;i>0;i--);
  58. }
  59. //-------------
  60. //???
  61. //-----------------------------
  62. uchar Busy_Check()
  63. {
  64.         uchar LCD_Status;
  65.         RS=0;  //        ?????
  66.         RW=1; //??????
  67.         EN=1;  // ???
  68.         DelayMS(1);
  69. //        LCD_Status=P1;
  70.         LCD_Status=P0;
  71.         EN=0;
  72.         return  LCD_Status;

  73. }
  74. //----------------------------
  75. //?LCD??
  76. //---------------------------------
  77. void Write_LCD_Command(uchar cmd)
  78. {
  79.            while((Busy_Check()&0x80)==0x80);   //???
  80.            RS=0;  //???????
  81.            RW=0;  //?
  82.            EN=0;
  83. //           P1=cmd;
  84.            P0=cmd;
  85.            EN=1;DelayMS(1);EN=0;
  86. }
  87. //--------------------------------------
  88. //????
  89. //---------------------------------------
  90. void Write_LCD_Data(uchar dat)
  91. {
  92.          while((Busy_Check()&0x80)==0x80);   //???        
  93.           RS=1;  RW=0; EN=0;
  94. //           P1=dat;
  95.            P0=dat;
  96.            EN=1;DelayMS(1);EN=0;        
  97. }
  98. //------------------------------------
  99. //LCD???
  100. //-----------------------------------------
  101. void Init_LCD()
  102. {               
  103.         Write_LCD_Command(0x38);
  104.         DelayMS(1);
  105.         Write_LCD_Command(0x01); //??
  106.         DelayMS(1);
  107.         Write_LCD_Command(0x06); //??????:????,????
  108.         DelayMS(1);
  109.         Write_LCD_Command(0x0C); //???????
  110.         DelayMS(1);
  111. }

  112. //--?LCD????
  113. void Write_freq(uint k)
  114. {
  115.         uchar qian,bai,shi,ge;
  116.         qian=k/1000;
  117.         bai=k/100%10;
  118.         shi=k/10%10;
  119.         ge=k%10;
  120.         Write_LCD_Command(0x86+0x40);
  121.         Write_LCD_Data(0x30+qian);
  122.         Write_LCD_Data(0x30+bai);
  123.         Write_LCD_Data(0x30+shi);
  124.         Write_LCD_Data(0x30+ge);
  125.         Write_LCD_Data(0x48);
  126.         Write_LCD_Data(0x5a);
  127. }

  128. //--LCD?????????
  129.   void Xianshi_f()                  
  130. {
  131.   if(WaveChoice==1)
  132.   {
  133.      freq=(10000000/(50000+2860*ys));
  134.          Write_freq(freq);
  135.   }
  136.   if(WaveChoice==2)
  137.   {
  138.      freq=(10000000/(50000+2300*ys));
  139.          Write_freq(freq);
  140.   }
  141.    if(WaveChoice==3)
  142.   {
  143.      freq=(10000000/(14000+2300*ys));
  144.          Write_freq(freq);
  145.   }
  146.     if(WaveChoice==4)
  147.   {
  148.      freq=(10000000/(15000+2300*ys));
  149.          Write_freq(freq);
  150.   }
  151. }
  152. //--LCD??????
  153. void Write_wave(uchar  t )
  154. {
  155.         switch(t)
  156.         {
  157.                 case 0:
  158.                                 //-- ???
  159.                                  Write_LCD_Command(0x86);
  160.                                    DelayMS(5);
  161.                                     for (i1=0;i1<sizeof(No)-1;i1++)
  162.                                         {
  163.                                                 Write_LCD_Data(No[i1]);
  164.                                                 DelayMS(5);
  165.                                         }
  166.                                         break;
  167.                 case 1:
  168.                                 //--???
  169.                                 ys=25;
  170.                                 Write_LCD_Command(0x86);
  171.                                    DelayMS(5);
  172.                                     for (i1=0;i1<sizeof(Sin)-1;i1++)
  173.                                         {
  174.                                                 Write_LCD_Data(Sin[i1]);
  175.                                                 DelayMS(5);
  176.                                         }
  177.                                 break;
  178.                 case 2:
  179.                                 //---???
  180.                                 ys=30;
  181.                                 Write_LCD_Command(0x86);
  182.                                    DelayMS(5);
  183.                                     for (i1=0;i1<sizeof(Squ)-1;i1++)
  184.                                         {
  185.                                                 Write_LCD_Data(Squ[i1]);
  186.                                                 DelayMS(5);
  187.                                          }
  188.                         
  189.                                 break;
  190.                 case 3:
  191.                                 //---???
  192.                                 ys=30;
  193.                                 Write_LCD_Command(0x86);
  194.                                    DelayMS(5);
  195.                                     for (i1=0;i1<sizeof(Tri)-1;i1++)
  196.                                         {
  197.                                                 Write_LCD_Data(Tri[i1]);
  198.                                                 DelayMS(5);
  199.                                         }
  200.                                 break;
  201.                 case 4:
  202.                                 //----???
  203.                                 ys=30;
  204.                                    Write_LCD_Command(0x86);//??????
  205.                                    DelayMS(5);
  206.                                     for (i1=0;i1<sizeof(Saw)-1;i1++)
  207.                                         {
  208.                                                 Write_LCD_Data(Saw[i1]);
  209.                                                 DelayMS(5);
  210.                                          }
  211.                                 break;
  212.         }
  213. }
  214. //---????
  215. void Out_Wave(uchar i)
  216. {         uchar j;        
  217.         switch(i)
  218.         {
  219. //                case 0:        P0=0x00;break;
  220.                 case 0:        P1=0x00;break;
  221.                 case 1:
  222.                                 //---???
  223.                                 for (j=0;j<255;j++)
  224.                                 {
  225. //                                        P0=tosin[j];
  226.                                         P1=tosin[j];
  227.                                         Delay1(ys);
  228.                                 }
  229.                                  break;
  230.                 case 2:
  231.                                 //----???
  232.                                 {
  233.                                         if(b1<sqar_num)
  234.                                                 {
  235. //                                                        P0=0xff;
  236.                                                         P1=0xff;
  237.                                                         Delay1(ys);
  238.                                                 }
  239.                                         else  
  240.                                                 {
  241. //                                                        P0=0x00;
  242.                                                         P1=0x00;
  243.                                                         Delay1(ys);
  244.                                                 }
  245.                                                 b1++;
  246.                                 }  break;
  247.                 case 3:
  248.                                 //----???
  249.                                 {
  250.                                         if(b1<128)
  251.                                                 {
  252. //                                                        P0=a;
  253.                                                         P1=b1;
  254.                                                         Delay1(ys);
  255.                                                 }
  256.                                         else  
  257.                                                 {
  258. //                                                        P0=255-a;
  259.                                                         P1=255-b1;
  260.                                                         Delay1(ys);
  261.                                                 }
  262.                                                 b1++;
  263.                                 }   break;
  264.                 case 4:
  265.                            //----???
  266.                                 {
  267.                                          if(b1<255)
  268.                                         {
  269. //                                                P0=a;
  270.                                                 P1=b1;
  271.                                                 Delay1(ys);
  272.                                         }
  273.                                 
  274.                                 b1++;
  275.                         if(b1==255)
  276.                                 {
  277.                                         b1=0;
  278.                                 }   break;
  279.                 }
  280.         }
  281. }
  282. //----????
  283. void keyscanf()
  284. {        
  285.         if(K2==0)
  286.         {
  287.                 DelayMS(5);
  288.                 if(K2==0)
  289.                 {
  290.                         while(!K2);
  291.                         ys--;
  292.                         if(ys==0)
  293.                         ys=20;
  294.                 }
  295.         }
  296.         if(K3==0)
  297.         {
  298.                 DelayMS(5);
  299.                 if(K3==0)
  300.                 {
  301.                         while(!K3);
  302.                         ys++;
  303.                         if(ys>22)
  304.                         ys=20;
  305.                 }
  306.         }
  307.         if(K4==0)
  308.         {
  309.                 DelayMS(5);
  310.                 if(K4==0)
  311.                 {
  312.                         while(!K4);
  313.                         if(WaveChoice==2)
  314.                         sqar_num=sqar_num+2;
  315.                         if(sqar_num==238)
  316.                                 sqar_num=128;
  317.                 }
  318.         }
  319.         if(K5==0)
  320.         {
  321.                 DelayMS(5);
  322.                 if(K5==0)
  323.                 {
  324.                         while(!K5);
  325.                         if(WaveChoice==2)
  326.                         sqar_num=sqar_num-2;
  327.                         if(sqar_num==18)
  328.                                 sqar_num=128;                        
  329.                 }
  330.         }
  331. }

  332. void xinhao()
  333. {
  334.         Init_LCD();
  335.         IE=0X81;
  336.         IT0=1;
  337.         Write_LCD_Command(0x80);//--??wave:
  338.            DelayMS(5);                 
  339.    for (i1=0;i1<sizeof(Wave)-1;i1++)
  340.                 {
  341.                         Write_LCD_Data(Wave[i1]);
  342.                         DelayMS(5);
  343.                 }
  344.             Write_LCD_Command(0x80+0X40);//----??freq:
  345.      DelayMS(5);
  346.     for (i1=0;i1<sizeof(Fre)-1;i1++)
  347.                 {
  348.                         Write_LCD_Data(Fre[i1]);
  349.                         DelayMS(5);
  350.                 }
  351.            Write_wave(WaveChoice);
  352.         while (1)
  353.         {
  354.                          keyscanf();
  355.                 Out_Wave(WaveChoice);
  356.                 if(!(K1&K2&K3))
  357.                                 Xianshi_f();
  358.         }         
  359. }

  360. //---INT0??
  361. void EX_INT0() interrupt 0
  362. {

  363.                 WaveChoice++;
  364.                 if(WaveChoice==5) WaveChoice=1;
  365.                 Write_wave(WaveChoice);

  366. }
复制代码




评分

参与人数 1黑币 +5 收起 理由
564654654 + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表