找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1643|回复: 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 单片机教程网

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