找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+0832做函数信号发生器,仿真出来的波形完全不对,也无法切换波形

[复制链接]
跳转到指定楼层
楼主
想使用89C51和0832做一个函数信号发生器,要求有正弦波方波以及三角波,但是仿真出来的波形完全不对,也无法切换波形,1602也全是高电平,求大佬看看是哪里有问题


单片机源程序如下:
  1. #include <reg52.h>
  2.                         #include<intrins.h>                        // _nop_() 函数延时1US用
  3.                         #define uchar unsigned char
  4.                         #define uint unsigned int
  5.                         #define DAdata P1
  6.                 //        #define LCDDAdata DAdata                                
  7.                         #define DAdata1 P0
  8.                                                 

  9.                         
  10.                         void delay(uchar i);
  11.                         void WR_Com(uchar temp);
  12.                         void WR_Data(uchar num);
  13.                         void disp_lcd(uchar addr,uchar *temp1);
  14.                         void disp_lcdF(uchar addr1,uchar *temp11);
  15.                         void SquareOUT();
  16.                         void SineOUT();
  17.                         void TriangleOUT();
  18.                         void lcd_Reset();


  19.                         uchar Wavecount,THtemp,TLtemp;
  20.                         uchar Waveform=0;
  21.                         
  22.                         uint WaveCoef,WaveCoef1;
  23.                         uchar i;
  24.                         
  25.                         sbit RS=P3^7;
  26.                         sbit RW=P3^6;
  27.                         sbit E=P3^5;
  28.                         sbit DA=P2^7;
  29.                         sbit KEY=P3^2;

  30. uchar code Sinetab[256]={
  31.                                                         0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,
  32.                                                         0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,
  33.                                                         0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xab,0xad,
  34.                                                         0xaf,0xb1,0xb2,0xb4,0xb6,0xb7,0xb9,0xba,
  35.                                                         0xbc,0xbd,0xbf,0xc0,0xc1,0xc3,0xc4,0xc5,
  36.                                                         0xc6,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,
  37.                                                         0xce,0xcf,0xd0,0xd1,0xd1,0xd2,0xd2,0xd3,
  38.                                                         0xd3,0xd3,0xd2,0xd2,0xd1,0xd1,0xd0,0xcf,
  39.                                                         0xce,0xce,0xcd,0xcc,0xcb,0xca,0xc9,0xc8,
  40.                                                         0xc6,0xc5,0xc4,0xc3,0xc1,0xc0,0xbf,0xbd,
  41.                                                         0xbc,0xba,0xb9,0xb7,0xb6,0xb4,0xb2,0xb1,
  42.                                                         0xaf,0xad,0xab,0xaa,0xa8,0xa6,0xa4,0xa2,
  43.                                                         0xa0,0x9e,0x9c,0x9a,0x98,0x96,0x94,0x92,
  44.                                                         0x90,0x8e,0x8c,0x8a,0x88,0x86,0x84,0x82,
  45.                                                         0x80,0x7d,0x7b,0x79,0x77,0x75,0x73,0x71,
  46.                                                         0x6f,0x6d,0x6b,0x69,0x67,0x65,0x63,0x61,
  47.                                                         0x5f,0x5d,0x5b,0x59,0x57,0x55,0x54,0x52,
  48.                                                         0x50,0x4e,0x4d,0x4b,0x49,0x48,0x46,0x45,
  49.                                                         0x43,0x42,0x40,0x3f,0x3e,0x3c,0x3b,0x3a,
  50.                                                         0x39,0x37,0x36,0x35,0x34,0x33,0x32,0x31,
  51.                                                         0x31,0x30,0x2f,0x2e,0x2e,0x2d,0x2d,0x2c,
  52.                                                         0x2c,0x2b,0x2b,0x2b,0x2b,0x2a,0x2a,0x2a,
  53.                                                         0x2a,0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2b,
  54.                                                         0x2c,0x2c,0x2d,0x2d,0x2e,0x2e,0x2f,0x30,
  55.                                                         0x31,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
  56.                                                         0x39,0x3a,0x3b,0x3c,0x3e,0x3f,0x40,0x42,
  57.                                                         0x43,0x45,0x46,0x48,0x49,0x4b,0x4d,0x4e,
  58.                                                         0x50,0x52,0x54,0x55,0x57,0x59,0x5b,0x5d,
  59.                                                         0x5f,0x61,0x63,0x65,0x67,0x69,0x6b,0x6d,
  60.                                                         0x6f,0x71,0x73,0x75,0x77,0x79,0x7b,0x7d,
  61.                                                 };//正弦

  62. uchar code Triangletab[58]={
  63.                                                                 0x1a,0x21,0x28,0x2f,0x36,0x3d,0x44,0x4b,
  64.                                                                 0x52,0x59,0x60,0x67,0x6e,0x75,0x7c,0x83,
  65.                                                                 0x8a,0x91,0x98,0x9f,0xa6,0xad,0xb4,0xbb,
  66.                                                                 0xc2,0xc9,0xd0,0xd7,0xde,0xe5,
  67.                                                                 0xde,0xd7,0xd0,0xc9,0xc2,0xbb,0xb4,0xad,
  68.                                                                 0xa6,0x9f,0x98,0x91,0x8a,0x83,0x7c,0x75,
  69.                                                                 0x6e,0x67,0x60,0x59,0x52,0x4b,0x44,0x3d,
  70.                                                                 0x36,0x2f,0x28,0x21
  71.                                                         };//三角

  72. uchar code Squaretab[2]={0x56,0xaa};//方波

  73. uchar code disp1[]={"Sine Wave       "
  74.                                         "Triangle Wale   "
  75.                                         "Square Wave     "
  76.                                         };

  77. uchar idata disp2[16]={"Frequency:    Hz"};

  78. uchar code Coef[3]={10,100,200};//步进

  79. uchar idata WaveFre[3]={1,1,1};               

  80. uchar code WaveTH[]={
  81.                                                 0xfc,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  82.                                                 0xfc,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  83.                                                 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
  84.                                        
  85.                                         };

  86. uchar code WaveTL[]={
  87.                                                 0xf2,0x78,0xfb,0x3c,0x63,0x7d,0x8f,0x9d,0xa8,0xb1,
  88.                                                 0x17,0x0b,0xb2,0x05,0x37,0x58,0x70,0x82,0x90,0x9b,
  89.                                                 0x4d,0xa7,0xc4,0xd3,0xdc,0xe2,0xe6,0xea,0xec,0xee
  90.                                         };



  91.                                 
  92.                                 void main()
  93.                                 {               
  94.                                         lcd_Reset();                        //1602初始化

  95.                                         P2=0xff;

  96.                                         WR_Com(0x8c);                //设置频率值显示初始位置
  97.                                         WaveCoef=WaveFre[Waveform]*Coef[Waveform];                //需要输出的频率值
  98.                                         disp2[13]=WaveCoef%10+0x30;
  99.                                         WaveCoef/=10;
  100.                                         disp2[12]=WaveCoef%10+0x30;
  101.                                         WaveCoef/=10;
  102.                                         disp2[11]=WaveCoef%10+0x30;
  103.                                         WaveCoef/=10;
  104.                                         disp2[10]=WaveCoef%10+0x30;
  105.                                         WaveCoef/=10;

  106.                                         disp_lcd(0x80,&disp1[Waveform*16]);
  107.                                         disp_lcd(0xc0,disp2);


  108.                                         i=0;
  109.                                         DAdata=0x00;
  110.                                         DAdata1=0x00;
  111.                                         DA=0;
  112.                                         TMOD=0x01;
  113.                                         IT0=1;
  114.                                         ET0=1;
  115.                                         EX0=1;
  116.         
  117.                                         P2=0xff;

  118.                                         TH0=THtemp;
  119.                                         TL0=TLtemp;
  120.                                         TR0=1;
  121.                                         EA=1;


  122.                                         while(1);
  123.                                 }
  124.                         
  125. /*************************************************************************************
  126. 函数名:LCD初始化
  127. 功能:设置LCD显示规则,设置显示模式:8位子行5×7点阵
  128.                            显示器开、光标开、光标允许闪烁
  129.                                            文字不动,光标自动右移
  130. 变量:无
  131. 输入:无
  132. 输出:无
  133. ***************************************************************************************/        
  134.                         void lcd_Reset()
  135.                         {
  136.                                 WR_Com(0x01);                //清屏光标复位
  137.         
  138.                                 WR_Com(0x38);                //设置显示模式:8位子行5×7点阵

  139.                                 WR_Com(0x0c);                //显示器开、光标开、光标允许闪烁
  140.         
  141.                                 WR_Com(0x06);                //文字不动,光标自动右移
  142.                         }

  143. /**********************************************************************************
  144. 函数名:LCD写入控制
  145. 功能:将命令写入到LCD
  146. 输入:temp;待输出的命令数据
  147. 输出:无
  148. *************************************************************************************/
  149.                         void WR_Com(uchar temp)
  150.                         {
  151.                                 RS=0;
  152.                                 RW=0;
  153.                                 DAdata=temp;
  154.                                 E=0;
  155.                                 delay(10);
  156.                                 E=1;
  157.                         }

  158. /********************************************************************************
  159. 函数名:LCD完成显示功能
  160. 功能:在LCD的界面上显示出数据
  161. 输入:num;待输出数据
  162. 输出:无
  163. *************************************************************************************/
  164.                         void WR_Data(uchar num)
  165.                         {
  166.                                 RS=1;
  167.                                 RW=0;
  168.                                 DAdata=num;
  169.                                 E=0;
  170.                                 delay(10);
  171.                                 E=1;
  172.                         }

  173. /***********************************************************************************************
  174. 函数名:LCD连续显示
  175. 功能:在LCD上连续显示16位数据
  176. 输入:addr、*temp1
  177. 输出:无
  178. **********************************************************************************************/
  179.                         void disp_lcd(uchar addr,uchar *temp1)
  180.                         {
  181.                         uchar i;
  182.                         WR_Com(addr);
  183.                         delay(10);
  184.                         for(i=0;i<16;i++)
  185.                            {
  186.                             WR_Data(temp1[i]);
  187.                             delay(10);
  188.                            }
  189.                         }

  190. /****************************************************************************
  191. 函数名:LCD更新频率
  192. 功能:
  193. 输入:addr、*temp1
  194. 输出:无
  195. ****************************************************************************/        
  196.                         void disp_lcdF(uchar addr1,uchar *temp11)
  197.                         {
  198.                         uchar i;
  199.                         WR_Com(addr1);
  200.                         delay(10);
  201.                         for(i=0;i<3;i++)
  202.                            {
  203.                             WR_Data(temp11[i]);
  204.                             delay(10);
  205.                            }
  206.                         }

  207. /***********************************************************************************************
  208. 函数名:延时1ms
  209. 输入:i
  210. 输出:无
  211. **********************************************************************************************/
  212.                         void delay(uchar i)
  213.                         {
  214.                         uchar j;
  215.                         while(--i)
  216.                            for(j=0;j<72;j++);
  217.                         }

  218. /****************************************************************************
  219. 函数名:中断
  220. 功能:
  221. 输入:
  222. 输出:无
  223. ****************************************************************************/        
  224.                         void key_int() interrupt 0
  225.                         {                                                
  226.                                 uchar keytemp,keytemp1;

  227.                                 EA=0;
  228.                                 TR0=0;
  229.                                 keytemp1=0;
  230.                                 delay(10);
  231.                                 P2=0xff;

  232.                                 keytemp=~P2&0x1e;
  233.                                 keytemp>>=1;               
  234.                                 while(!KEY);

  235.                                 if(keytemp!=keytemp1)
  236.                                 {
  237.                                         keytemp1=keytemp;         

  238.                                     switch(keytemp)
  239.                                         {
  240.                                                 case 1:
  241.                                          {if(++Waveform==3) Waveform=0; break;}//选择输出信号的种类,0为正弦波,1为三角波,2为方波
  242.                                         case 2:
  243.                                          {if(++WaveFre[Waveform]==49) WaveFre[Waveform]=1;break;}//倍加
  244.                                         case 4:
  245.                                          {if(--WaveFre[Waveform]==0) WaveFre[Waveform]=10;break;}//倍减
  246.                                         }
  247.                                     THtemp=WaveTH[Waveform*16+(WaveFre[Waveform]-1)];
  248.                                     TLtemp=WaveTL[Waveform*16+(WaveFre[Waveform]-1)];
  249.                                         WaveCoef1=WaveFre[Waveform]*Coef[Waveform];//计算需要输出信号的频率
  250.                                     WaveCoef=WaveFre[Waveform]*Coef[Waveform];
  251.                                     disp2[13]=WaveCoef%10+0x30;//取个位
  252.                                     WaveCoef/=10;
  253.                                     disp2[12]=WaveCoef%10+0x30;//取十位
  254.                                     WaveCoef/=10;
  255.                                     disp2[11]=WaveCoef%10+0x30;//取百位
  256.                                     WaveCoef/=10;
  257.                                 //        disp2[10]=WaveCoef+0x30;//取千位
  258.                                     disp2[10]=WaveCoef%10+0x30;//取千位
  259.                                  // WaveCoef/=10;
  260.                                     disp_lcd(0x80,&disp1[Waveform*16]);
  261.                                     disp_lcdF(0xca,&disp2[10]);
  262.                                     P2=0xff;
  263.                                 }
  264.                                 TH0=THtemp; //16位定时器/计数器的高低位,TL0是低八位,TH0=是高八位
  265.                                 TL0=TLtemp;
  266.                                 Wavecount=0;
  267.                                 TR0=1;//EA总中断开关,如果EA不打开,任何中断都无法执行ET0,在EA打开的前提下,打开T0定时器中断TR0,开始启用T0计数器/定时器
  268.                                 EA=1;
  269.                 }

  270. /****************************************************************************
  271. 函数名:中断
  272. 功能:判别按键按了几下,1为正弦波,2为三角波,3为方波
  273. 输入:
  274. 输出:无
  275. ****************************************************************************/        
  276.                 void timer() interrupt 1
  277.                 {
  278.                         TH0=THtemp;
  279.                         TL0=TLtemp;

  280.                         if(Waveform==0)
  281.                           SineOUT();
  282.                         else if(Waveform==1)
  283.                            TriangleOUT();
  284.                         else if(Waveform==2)
  285.                           SquareOUT();
  286.                 }

  287. /****************************************************************************
  288. 函数名:输出正弦波
  289. ****************************************************************************/                                
  290.                         void SineOUT()
  291.                         {
  292.                                 DAdata1=Sinetab[Wavecount++];
  293.                                 if(Wavecount>239)
  294.                                 Wavecount=0;
  295.                                 DA=0;
  296.                                  _nop_();
  297.                                  _nop_();
  298.                                  _nop_();
  299.                                  _nop_();
  300.                                 DA=1;
  301.                         }


  302. /****************************************************************************
  303. 函数名:输出三角波
  304. ****************************************************************************/                        
  305.                         void TriangleOUT()
  306.                         {
  307.                                 DAdata1=Triangletab[Wavecount++];
  308.                                 if(Wavecount>57)
  309.                                    Wavecount=0;
  310.                                 DA=0;
  311.                                  _nop_();
  312.                                  _nop_();
  313.                                  _nop_();
  314.                                  _nop_();
  315.                                 DA=1;
  316.                         }

  317. /****************************************************************************
  318. 函数名:输出方波
  319. ****************************************************************************/                        
  320.                         void SquareOUT()
  321.                         {
  322.                                 DAdata1=Squaretab[Wavecount++];
  323.                                 if(Wavecount>1)
  324.                                 Wavecount=0;
  325.                                 DA=0;
  326.                                 _nop_();
  327.                                  _nop_();
  328.                                  _nop_();
  329.                                  _nop_();
  330.                                 DA=1;
  331.                         }



复制代码


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

使用道具 举报

沙发
ID:648281 发表于 2020-5-14 08:39 | 只看该作者
你好!
首先把你的仿真图先整理一下吧,看着太乱难免有错给你发一个我做的,参考一下吧











回复

使用道具 举报

板凳
ID:659295 发表于 2020-5-14 13:53 | 只看该作者
51hei**1140 发表于 2020-5-14 08:39
你好!
首先把你的仿真图先整理一下吧,看着太乱难免有错给你发一个我做的,参考一下吧

我重新画了一下,然后荧光屏可以正常切换,但是波形无法切换切有点失真,能帮忙修改下吗
回复

使用道具 举报

地板
ID:659295 发表于 2020-5-14 13:56 | 只看该作者
改完的仿真图

仿真图514-1.png (53.16 KB, 下载次数: 32)

仿真图514-1.png

仿真图514-2.png (15.82 KB, 下载次数: 32)

仿真图514-2.png
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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