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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機簡易的函數信號發生器+LCD1602顯示代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:940138 發表于 2021-6-26 10:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include "reg51.h"
  2. #include "LCD1602.h"
  3. #include "i2c.h"

  4. sbit S1 =P2^1;
  5. sbit S4 =P2^2;
  6. /**********************************
  7.   參數聲明
  8. **********************************/
  9. uint F=0;                       //頻率
  10. uint S=0,Pwm=0,Tra=0,AA=0;      //正弦波 方波 三角波 鋸齒波信號                 
  11. uchar zkb=30,bx=1;              //頻率加/減 PWM占空比 波形選擇
  12. uchar t1=0,flagPwm=0,flag1=0;   //標志位
  13. uchar  T=0;                     //周期

  14. uchar code num[]={ 0x7F,0x82,0x85,0x88,0x8B,0x8F,0x92,0x95,0x98,0x9B,0x9E,0xA1,0xA4,0xA7,0xAA,0xAD
  15.                                                                         ,0xB0,0xB3,0xB6,0xB8,0xBB,0xBE,0xC1,0xC3,0xC6,0xC8,0xCB,0xCD,0xD0,0xD2,0xD5,0xD7
  16.                                                                         ,0xD9,0xDB,0xDD,0xE0,0xE2,0xE4,0xE5,0xE7,0xE9,0xEB,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4
  17.                                                                         ,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFB,0xFC,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE
  18.                                                                         ,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFC,0xFB,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6
  19.                                                                         ,0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEB,0xE9,0xE7,0xE5,0xE4,0xE2,0xE0,0xDD,0xDB
  20.                                                                         ,0xD9,0xD7,0xD5,0xD2,0xD0,0xCD,0xCB,0xC8,0xC6,0xC3,0xC1,0xBE,0xBB,0xB8,0xB6,0xB3
  21.                                                                         ,0xB0,0xAD,0xAA,0xA7,0xA4,0xA1,0x9E,0x9B,0x98,0x95,0x92,0x8F,0x8B,0x88,0x85,0x82
  22.                                                                         ,0x7F,0x7C,0x79,0x76,0x73,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x54,0x51
  23.                                                                         ,0x4E,0x4B,0x48,0x46,0x43,0x40,0x3D,0x3B,0x38,0x36,0x33,0x31,0x2E,0x2C,0x29,0x27
  24.                                                                         ,0x25,0x23,0x21,0x1E,0x1C,0x1A,0x19,0x17,0x15,0x13,0x12,0x10,0x0F,0x0D,0x0C,0x0A
  25.                                                                         ,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00
  26.                                                                         ,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08
  27.                                                                         ,0x09,0x0A,0x0C,0x0D,0x0F,0x10,0x12,0x13,0x15,0x17,0x19,0x1A,0x1C,0x1E,0x21,0x23
  28.                                                                         ,0x25,0x27,0x29,0x2C,0x2E,0x31,0x33,0x36,0x38,0x3B,0x3D,0x40,0x43,0x46,0x48,0x4B
  29.                                                                         ,0x4E,0x51,0x54,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x73,0x76,0x79,0x7C
  30.                   };

  31. /*********************************
  32.   函數聲明
  33. **********************************/
  34. void Fun_Sin();
  35. void Fun_Triangle();
  36. void Fun_Pwm();
  37. void Fun_AA();
  38. void TimerInit();
  39. void KEY();
  40. void Delay10ms();

  41. /*******************************************
  42.             主函數
  43. *******************************************/
  44. void main()        //主程序
  45. {
  46.   S1 = 1;
  47.   S4 = 1;
  48.         LcdInit();       //屏幕初始化
  49.   TimerInit();     //定時器初始化
  50.                
  51.         while(1)
  52.         {
  53.                 KEY();                                           //按鍵檢測                                               
  54.                 switch(bx)
  55.                 {
  56.                   case 1:Fun_Sin();      break;         //正弦波
  57.                   case 2:Fun_Triangle(); break;   //三角波
  58.                         case 3:Fun_Pwm();      break;         //方波
  59.                   case 4:Fun_AA();       break;   //鋸齒波
  60.                 }        

  61.                 if(flag1==1)
  62.                 {
  63.                         T=1*t1;
  64.       F=((1*100000)/T);
  65.                        
  66.                         LcdWriteCom(0x89);
  67.                         LcdWriteData(T%1000/100+'0');
  68.                         LcdWriteData(T%100/10+'0');
  69.                         LcdWriteData(T%10+'0');
  70.                        
  71.                         LcdWriteCom(0x82+0x40);
  72.                         LcdWriteData(F%10000/1000+'0');       
  73.                         LcdWriteData(F%1000/100+'0');                        //個位
  74.                         LcdWriteData('.');
  75.                         LcdWriteData(F%100/10+'0');          //小數后一位
  76.                         LcdWriteData(F%10+'0');          //小數后兩位
  77.                 }
  78.                  flag1=0;
  79.         }                       
  80. }

  81. /**********************************
  82.            延遲10ms函數
  83. **********************************/
  84. void Delay10ms()   
  85. {
  86.          uchar a,b,c;
  87.     for(c=1;c>0;c--)
  88.         for(b=38;b>0;b--)
  89.             for(a=130;a>0;a--);
  90. }        
  91. /**********************************
  92.            按鍵檢測函數
  93. **********************************/
  94. void KEY()
  95. {
  96.         if(S1==0)
  97.                 {
  98.                         Delay10ms();
  99.                         if(S1==0)
  100.                         {
  101.                                 bx=bx+1;
  102.                                 flag1=1;        //周期顯示標志位
  103.         case_1:       
  104.                                 switch(bx)
  105.                                 {
  106.                                         case 1:        LcdWriteCom(0x83);
  107.                                                                         LcdWriteData('S');               
  108.                                                                         LcdWriteData('i');
  109.                                                                         LcdWriteData('n');break;
  110.                                         case 2:        LcdWriteCom(0x83);
  111.                                                                         LcdWriteData('T');
  112.                                                                         LcdWriteData('r');
  113.                                                                         LcdWriteData('a');break;
  114.                                         case 3:        LcdWriteCom(0x83);
  115.                                                                         LcdWriteData('P');
  116.                                                                         LcdWriteData('w');
  117.                                                                         LcdWriteData('m');break;
  118.                                         case 4:        LcdWriteCom(0x83);
  119.                                                                         LcdWriteData('A');
  120.                                                                         LcdWriteData('A');
  121.                                                                         LcdWriteData(' ');break;
  122.                                         default:bx=1;
  123.                                   goto case_1;
  124.                                 }
  125.                                
  126.                         }
  127.                         while(!S1);   //檢測按鍵是否松開               
  128.                 }               
  129.                                
  130.                 if(S4==0)
  131.                 {
  132.                         Delay10ms();
  133.                         if(S4==0)
  134.                         {
  135.                                 zkb=zkb+10;                               
  136.                                 if(zkb>90)
  137.                                 {
  138.                                         zkb=10;
  139.                                 }
  140.                                
  141.                                 LcdWriteCom(0x8c+0x40);
  142.                                 LcdWriteData(zkb%100/10+'0');       
  143.                                 LcdWriteData(zkb%10+'0');                               
  144.                         }
  145.                         while(!S4);   //檢測按鍵是否松開
  146.                 }               
  147. }
  148. /**********************************
  149.             正弦波1函數
  150. **********************************/
  151. void Fun_Sin()   
  152. {       
  153.         uchar i;
  154.         t1=0;   //重置計數標志位
  155.         TR0=1;            //開定時
  156.         for(i=0;i<255;i++)
  157.         {
  158.                 S=num[i];       //打點賦值
  159.        
  160.                 I2cStart();
  161.                 I2c_write_char(0x90);
  162.                 I2cAck();
  163.                 I2c_write_char(0x40);  //控制字 允許模擬輸出 不自增單端  0100 0000
  164.                 I2cAck();      
  165.                 I2c_write_char(S);     //放置需要轉換的量
  166.                 I2cAck();
  167.                 I2cStop();               
  168.         }
  169.         TR0=0;              //關定時       
  170. }
  171. /*******************************
  172.           三角波2函數
  173. ********************************/
  174. void Fun_Triangle()   
  175. {       
  176.         uchar i;
  177.         t1=0;   //重置計數標志位  
  178.   TR0=1;        //開定時器
  179.         for(i=0;i<255;i++)
  180.         {
  181.                 Tra =i;
  182.                 I2cStart();
  183.                 I2c_write_char(0x90);
  184.                 I2cAck();
  185.                 I2c_write_char(0x40); //控制字 允許模擬輸出 不自增單端  0100 0000
  186.                 I2cAck();
  187.                 I2c_write_char(Tra);  
  188.                 I2cAck();
  189.                 I2cStop();
  190.         }
  191.         for(i=255;i>0;i--)
  192.         {
  193.                 Tra =i;
  194.                 I2cStart();
  195.                 I2c_write_char(0x90);
  196.                 I2cAck();
  197.                 I2c_write_char(0x40); //控制字 允許模擬輸出 不自增單端  0100 0000
  198.                 I2cAck();
  199.                 I2c_write_char(Tra);
  200.                 I2cAck();
  201.                 I2cStop();
  202.         }       
  203.   TR0=0;         //關定時器
  204. }
  205. /********************************
  206.             方波3函數
  207. ********************************/
  208. void Fun_Pwm()     
  209. {                                
  210.         t1=0;   //重置計數標志位
  211.   TR0=1;        //開定時器       

  212.         for(flagPwm=0;flagPwm<100;flagPwm++)
  213.         {
  214.                 if(flagPwm<zkb) //占空比為%30
  215.                 {
  216.                         Pwm=0;
  217.                 }       
  218.                 else
  219.                 {
  220.                         Pwm=255;       
  221.                 }       

  222.                 I2cStart();           //DA轉換程序
  223.                 I2c_write_char(0x90);
  224.                 I2cAck();
  225.                 I2c_write_char(0x40);//控制字 允許模擬輸出 不自增單端  0100 0000
  226.                 I2cAck();
  227.                 I2c_write_char(Pwm);
  228.                 I2cAck();
  229.                 I2cStop();
  230.   }
  231.   TR0=0;         //關定時器               
  232. }
  233. /***********************************
  234.           鋸齒波4函數
  235. ***********************************/
  236. void Fun_AA()         
  237. {
  238.         uchar i;
  239.         t1=0;   //重置計數標志位
  240.   TR0=1;        //開定時器               
  241.         for(i=255;i>0;i--)
  242.         {
  243.                 AA =i;
  244.                 I2cStart();
  245.                 I2c_write_char(0x90);
  246.                 I2cAck();
  247.                 I2c_write_char(0x40); //控制字 允許模擬輸出 不自增單端  0100 0000
  248.                 I2cAck();
  249.                 I2c_write_char(AA);  
  250.                 I2cAck();
  251.                 I2cStop();
  252.         }
  253.   TR0=0;         //關定時器
  254. }
  255. /*********************************
  256.          定時器初始化函數
  257. **********************************/
  258. void TimerInit()
  259. {
  260.         TMOD|=0x01; //定時器0工作方式1
  261.        
  262.         TH0=0xFC;   //  65536-1000+1
  263.   TL0=0x18;
  264.        
  265.         ET0=1;
  266.         EA=1;       //定時器總開關
  267.         TR0=0;      //中斷開關       
  268. }
  269. /**********************************
  270.            定時器中斷函數
  271. **********************************/
  272. void Timer(void) interrupt 1   //中斷
  273. {
  274. //  TR0=0;   //賦初值,定時器需在關閉狀態
  275.         TH0=0xfc;//  65536-1000+1
  276.         TL0=0x18;//
  277. //        TR0=1;
  278.                
  279.         t1=t1+1; //計數中斷個數 每個中斷         1ms       

  280. }       
復制代碼

全部代碼下載: 函數信號發生器代碼.zip (63.39 KB, 下載次數: 22)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲女人天堂成人av在线 | 欧美中文字幕在线观看 | 国产精品免费在线 | 国产精品久久久久久久久久久免费看 | 中文字幕亚洲一区二区三区 | 羞羞视频在线网站观看 | 国产一级在线观看 | 欧美一二三四成人免费视频 | 欧美一区二 | 精品少妇一区二区三区在线播放 | 欧美美乳 | 亚洲精品美女视频 | 精品国产乱码久久久久久a丨 | 国产伦一区二区三区视频 | 国产欧美日韩一区 | 爱操av| 亚洲高清一区二区三区 | 国内精品视频免费观看 | 国产精品片aa在线观看 | 黄色网页在线观看 | 在线观看免费av片 | 国产午夜精品一区二区三区嫩草 | 精品久久久久久久 | 精品欧美一区二区在线观看欧美熟 | 国产精品日本一区二区不卡视频 | 欧美成视频 | 欧美色人 | 午夜精品一区二区三区在线 | a黄毛片| 欧美日韩亚洲三区 | 久久久久久影院 | 亚洲欧美日韩一区二区 | 国产福利在线 | 成人综合在线视频 | 欧美一区二区三区在线观看 | 91精品国产91综合久久蜜臀 | 欧美在线观看一区二区 | 国产亚洲一区二区三区在线观看 | 精品一二三区 | 久久久久久国产精品三区 | 99视频免费看 |