找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5810|回复: 4
收起左侧

51单片机示波器,四种可跳档简单波形仿真与源码

[复制链接]
ID:354091 发表于 2018-6-19 10:47 | 显示全部楼层 |阅读模式
51单片机示波器,四种可跳档简单波形,研究生单片机作业
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png 0.png

单片机源程序如下:
  1. #include <reg51.H>
  2. #include<absacc.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define dz XBYTE[0x7fff]//dac0832总线地址

  6. //1602LCD相关
  7. sbit RS = P3^0;   //定义端口
  8. sbit EN = P3^1;
  9. //按键定义
  10. sbit key1 = P3^2;
  11. sbit key2 = P3^3;
  12. sbit key3 = P3^4;
  13. sbit key4 = P3^5;
  14. uchar mode = 0;//输出波形的模式
  15. uchar LCDFlag;//LCD更新显示标志
  16. uchar LCDbuf[16];//LCD显示缓存
  17. uchar TIMER_H;//给计数器的值
  18. uchar TIMER_L;
  19. int Fre10X = 200;//当前频率的10的倍数     此时为20.0hz
  20. uchar CurStal = 1;//步进档位1=0.1x 10=1x 100=10x
  21. uchar code WaveInfo[3][15] = {"Sine Wave     ",//显示当前波形类型
  22.                                     "Triangle Wave ",
  23.                                     "Square Wave   "};
  24. uchar i = 0;
  25. //方波
  26. uchar code Squaretab[64] = {0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,
  27. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  28. 255,255,255,255,255,255,255,255
  29. };
  30. //sin波
  31. uchar code Sinetab[256] = {
  32.                     0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,
  33.                                         0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,
  34.                                         0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,
  35.                                         0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,
  36.                                         0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,
  37.                                         0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,
  38.                                         0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,
  39.                                         0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,
  40.                                         0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,
  41.                                         0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,
  42.                                         0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,
  43.                                         0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,
  44.                                         0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,
  45.                                         0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,
  46.                                         0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,
  47.                                         0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
  48.                                         0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,
  49.                                         0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,
  50.                                         0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,
  51.                                         0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,
  52.                                         0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,
  53.                                         0x76,0x79,0x7c,0x80 };
  54. //三角
  55. uchar code Triangletab[64] = {
  56.   0,  8, 16, 24, 32, 40, 48, 56,
  57. 64, 72, 80, 88, 96,104,112,120,
  58. 128,136,144,152,160,168,176,184,
  59. 192,200,208,216,224,232,240,248,

  60. 248,240,232,224,216,208,200,192,
  61. 184,176,168,160,152,144,136,128,
  62. 120,112,104, 96, 88, 80, 72, 64,
  63. 56, 48, 40, 32, 24, 16, 8, 0};
  64. //锯齿
  65. uchar code juchi[64] = {
  66. 0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
  67. 146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255
  68. };       
  69. //uS延时函数
  70. void DelayUs2x(uchar t)
  71. {   
  72.     while(--t);
  73. }
  74. //mS延时函数
  75. void DelayMs(uint t)
  76. {
  77.      
  78.     while(t--)
  79.     {
  80.         DelayUs2x(245);
  81.         DelayUs2x(245);
  82.     }
  83. }
  84. //              写入命令函数
  85. void LCD_Write_Com(uchar com)
  86. {  
  87.     RS = 0;  
  88.     EN = 1;
  89.     P1 = com;   //送入数据
  90.     DelayUs2x(200);
  91.     EN = 0;
  92.     DelayUs2x(500);  //延时等待LCD处理数据
  93. }
  94. //              写入数据函数
  95. void LCD_Write_Data(unsigned char Data)
  96. {
  97.     RS = 1;
  98.     EN = 1;
  99.     P1 = Data;  //送入数据
  100.     DelayUs2x(200);
  101.     EN = 0;   
  102.     DelayUs2x(500);   //延时等待LCD处理数据
  103. }
  104. //                清屏函数
  105. void LCD_Clear(void)
  106. {
  107.     LCD_Write_Com(0x01);
  108.     DelayMs(5);
  109. }
  110. //              写入字符串函数
  111. void LCD_Write_String(uchar x, uchar y, uchar *s)
  112. {     
  113.     if(y == 0)
  114.     {     
  115.         LCD_Write_Com(0x80 + x);     //表示第一行
  116.     }
  117.     else
  118.         {      
  119.         LCD_Write_Com(0xC0 + x);      //表示第二行
  120.         }        
  121.     while(*s)
  122.         {     
  123.         LCD_Write_Data(*s);     
  124.         s++;     
  125.         }
  126. }
  127. /**************************************************
  128.               初始化函数
  129. ***************************************************/
  130. void LCD_Init(void)
  131. {
  132.     LCD_Write_Com(0x38);    //显示模式设置
  133.     DelayMs(5);
  134.     LCD_Write_Com(0x38);
  135.     DelayMs(5);
  136.     LCD_Write_Com(0x38);  
  137.     LCD_Write_Com(0x08);    //显示关闭
  138.     LCD_Write_Com(0x01);    //显示清屏
  139.     LCD_Write_Com(0x06);    //显示光标移动设置
  140.     DelayMs(5);
  141.     LCD_Write_Com(0x0C);    //显示开及光标设置
  142. }
  143. /**************************************************
  144.    在LCD指定位置显示光标
  145. **************************************************/
  146. void LCD_Cursor_Dis(uchar x, uchar y)
  147. {
  148.     if(y == 0)              //LCD第一行
  149.     {
  150.         LCD_Write_Com(0x80 + x);
  151.     }
  152.     else                  //LCD第二行
  153.     {
  154.         LCD_Write_Com(0xC0 + x);
  155.     }
  156.     LCD_Write_Com(0x0F);  //光标显示开
  157.     DelayUs2x(4);         //延时越40us
  158. }
  159. /**************************************************
  160.    关闭光标
  161. **************************************************/
  162. void LCD_Close_Cursor()
  163. {
  164.     LCD_Write_Com(0x0C);  //光标显示关
  165.     DelayUs2x(4);         //延时越40us
  166. }

  167. void keyscanf()         //按键扫描
  168. {
  169.     uint temp;
  170.         if(key1 == 0)//模式选择
  171.         {
  172.                 mode++;
  173.         LCDFlag = 1;
  174.                 if(mode == 4)
  175.                         mode = 0;
  176.                 while(!key1);
  177.         }
  178.         if(key2 == 0)//增加
  179.         {
  180.                 if((Fre10X + CurStal) < 501)
  181.         {
  182.                         Fre10X = Fre10X + CurStal;
  183.             temp = (unsigned long)10000000 / 64 / Fre10X;
  184.             TIMER_H = (65535 - temp) / 256;
  185.             TIMER_L = (65535 - temp) % 256;
  186.         }
  187.         LCDFlag = 1;
  188.                 while(!key2);
  189.         }
  190.         if(key3 == 0)
  191.         {
  192.         if((Fre10X - (int)CurStal) > 1)
  193.         {
  194.                         Fre10X = Fre10X - CurStal;
  195.             temp = (unsigned long)10000000 / 64 / Fre10X;
  196.             TIMER_H = (65535 - temp) / 256;
  197.             TIMER_L = (65535 - temp) % 256;
  198.         }
  199.         LCDFlag = 1;
  200.                 while(!key3);
  201.         }
  202.         if(key4 == 0)
  203.         {
  204.             switch(CurStal)//调整步进档位
  205.         {
  206.                 case 1:        CurStal = 10;
  207.                                 break;
  208.                 case 10: CurStal = 100;
  209.                                 break;
  210.                         case 100: CurStal = 1;
  211.                                 break;
  212.         }
  213.         LCDFlag = 1;
  214.                 while(!key4);
  215.         }
  216. }

  217. void init_time()
  218. {
  219.         EA = 1; //开中断
  220.         ET0 = 1;
  221.         TMOD = 0X01; //初始化
  222.         TR0 = 1; //开定时器
  223. }
  224. void time0() interrupt 1 using 2
  225. {
  226.     TH0 = TIMER_H;
  227.     TL0 = TIMER_L;
  228.         switch(mode)
  229.         {
  230.         case 0://正弦显示
  231.                         dz = Sinetab[i];
  232.                         i = i + 4;
  233.                 break;
  234.         case 1://三角显示
  235.                         dz = Triangletab[i];
  236.                         i = (i + 1) % 64;
  237.                 break;
  238.         case 2://方波显示
  239.                         dz = Squaretab[i];
  240.                         i = (i + 1) % 64;
  241.                 break;
  242.                 case 3://锯齿波显示
  243.                         dz = juchi[i];
  244.                         i = (i + 1) % 64;
  245.                 break;
  246.         }
  247. }
  248. void main()
  249. {
  250.     uint temp;
  251.     init_time();  //定时器初始化调用
  252.     mode = 1;
  253.     temp = (unsigned long)10000000 / 64 / Fre10X;
  254.     TIMER_H = (65535 - temp) / 256;
  255.     TIMER_L = (65535 - temp) % 256;
  256.     LCD_Init();     //初始化液晶
  257.     LCDFlag = 1;     //将液晶需要刷新标志置1
  258.         while(1)
  259.         {
  260.         keyscanf();  //按键一直扫描
  261.         if(LCDFlag)
  262. ……………………

  263. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
简易信号发生器 - 副本.rar (76.88 KB, 下载次数: 133)
回复

使用道具 举报

ID:32289 发表于 2019-1-15 21:24 | 显示全部楼层
感谢楼主分享!
回复

使用道具 举报

ID:303383 发表于 2019-1-15 23:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:416803 发表于 2019-6-25 10:37 | 显示全部楼层
只有一种波形
回复

使用道具 举报

ID:711727 发表于 2020-6-26 20:26 | 显示全部楼层
感谢楼主,完美运行
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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