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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2068|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: a级毛片基地 | 成人在线视频免费看 | 亚洲人成一区二区三区性色 | 亚洲成人精品在线 | 亚洲日韩中文字幕一区 | 五月天国产视频 | 欧美日韩不卡合集视频 | 久久久久亚洲精品国产 | 亚洲精品日韩精品 | 久久精品99 | 日韩黄 | 色偷偷噜噜噜亚洲男人 | 日韩中文一区二区三区 | 亚洲一区亚洲二区 | 色欧美片视频在线观看 | 欧美小视频在线观看 | 亚洲国产精品一区二区三区 | 日韩精品一区二区三区视频播放 | 日韩二三区 | 武道仙尊动漫在线观看 | 久久精品视频一区二区三区 | 欧美精品一区二区三区在线播放 | 九色视频网站 | 久久久久久久久久久久久9999 | 亚洲成人免费av | 久久精品一级 | 亚洲在线一区二区 | 日韩成人免费视频 | 国产小网站 | 99精品视频在线观看免费播放 | 欧美日韩一区在线 | 美日韩一区二区 | 国产精品日韩 | 91精品久久久久久久久中文字幕 | 性欧美精品一区二区三区在线播放 | 久久99国产精一区二区三区 | 欧美日韩亚洲一区二区 | 欧美不卡视频 | 丝袜美腿一区二区三区 | 91国内产香蕉 | 久久亚洲天堂 |