找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3843|回复: 8
收起左侧

原创:基于51单片机摩尔斯电码收发系统仿真,附完整代码和仿真,还有视频演示哟

  [复制链接]
ID:965487 发表于 2021-10-27 22:40 | 显示全部楼层 |阅读模式
  因为上次太仓促,这次来真的,原创:基于89C51单片机摩尔斯电码收发系统仿真,附完整代码和仿真,还有视频演示哟。
  本人编制此程序仅为兴趣和爱好,请大家多多指教和鼓励。

  /*----------------------------------------------------------
* 【实验平台】: 89C52单片机开发板
* 【外部晶振】: 11.0592MHz        
* 【主控芯片】: STC89C52
* 【编译环境】: Keil μVisio4         
* 【程序编写】: wzqwxx 水上人家

名称:摩尔斯电码自动(手动)发送

内容:仅供交流学习,其他用途请注明编者,若有BUG请原谅编者。

  本程序仅实现了短电报自动发送功能,能用两个键输入报文,
能用单手键发送报文,或用PC机等终端输入报文。
  编制程序过程本身就很有趣和充满挑战,要不断思考修改调试
完善,从中学到了不少知识。如果能制作成品,练习发报也十分有
趣,这也是对古老的电讯一种纪念,致敬充满智慧的先辈们。
  播发摩尔斯电码的一般要求是:以一个“点”的长度为一个时间
单位,“划”是三个点的时间长度;点划之间的间隔是一个点的长度;
字符之间的间隔是三个点的长度;单词之间的间隔是七个点的长度。
这样才能被收报人识别。
------------------------------------------------------------*/
仿真说明:
  1、开机后,出现问候语。即进入信息录入界面。这时可按点划键进行输入,这时每输入一点一划,都会出现候选字,如是你想要的,可稍停,即可自动上屏。
若不是要连续输入,直到找到。字母和数字可按摩斯码输入,空格输入点点划划四笔。 注意,点划输入间隔时间不要过长,这个要学习适应。
  2、若输入出错,可按菜单键一下,出现DEL,按点键可删除一字,按划键全部删除。
  3、在录入界面下,连按两下菜单键,出现发送SEND菜单,再按点键可发送。
  4、在录入界面下,连按三下菜单键,出现短语phrase菜单,按点划键上下查找,找到短语后,按菜单键进入发送界面,按点键发送。
  5、在录入界面下,连按四下菜单键,出现PCINPUT,再按点键可进入虚拟终端,点击终端获得焦点后,即可输入字符。按退格键删除一字,按回车发送,
按ESC返回点划双键输入。在终端里,在没有输入任何字符下,输入问号,再输入数字,即短语的序号,可调出短语,按回车发送。
  6、在录入界面下,按单手键可直接纯手动发报。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
MRScode.png
单片机源程序如下:

  1. //   main.文件

  2. #include <REGX52.H>
  3. #include <stdio.H>
  4. #include "1602.h"
  5. #include "MRScode.h"

  6. unsigned char code *HI = "HELLO!";//开机问候语

  7. void Timer0Init(void)                //4毫秒@11.0592MHz
  8. {
  9.         TMOD &= 0xF0;                //设置定时器模式
  10.         TMOD |= 0x01;                //设置定时器模式
  11.         TL0 = 0x9A;                //设置定时初值
  12.         TH0 = 0xF1;                //设置定时初值
  13.         TF0 = 0;                //清除TF0标志
  14.         ET0 = 1;
  15.         EA = 1;
  16.         TR0 = 0;                //定时器0由点键和划键启动计时
  17. }


  18. void UART_init()
  19. {
  20.         TMOD |= 0x20;          //T1工作模式2  8位自动重装
  21.         TH1 = 0xfd;
  22.         TL1 = 0xfd;         //比特率9600   时钟频率11.0592MHZ
  23.         TR1 = 1;                //启动T1定时器
  24.         SM0 = 0;
  25.         SM1 = 1;                 //串口工作方式1 10位异步
  26.         REN = 1;                //串口允许接收
  27.         TI = 1;
  28. }


  29. /*********按键输入键值获取*******/
  30. unsigned char keyget()
  31. {
  32.         unsigned char keyvalue;          //键值
  33.         beep = Hmove;
  34.         if(Di == 0 )           //点键按下
  35.         {
  36.                 delay_ms(25);
  37.                 if(Di == 0 )
  38.                 {
  39.                         while(Di == 0 ); //松手检测
  40.                         keyvalue = 1;        
  41.                 }
  42.         }
  43.            else if(Hu == 0 )  //划键按下
  44.         {
  45.                 delay_ms(25);
  46.                 if(Hu == 0 )
  47.                 {
  48.                         while(Hu == 0 );
  49.                         keyvalue = 2;        
  50.                 }
  51.         }
  52.            else if(GL == 0 )         //功能键按下
  53.         {
  54.                 delay_ms(25);
  55.                 if(GL == 0 )
  56.                 {
  57.                         while(GL == 0 );
  58.                         keyvalue = 3;
  59.                 }
  60.         }
  61.            else
  62.            {
  63.                   keyvalue = 255;
  64.         }
  65.           return(keyvalue);        
  66. }


  67. void main()
  68. {
  69.         char i;
  70.         Timer0Init();//初始化定时器0
  71.         UART_init();
  72.         lcd_init();
  73.         Lcdwritestring(0,5,HI);
  74.         for(i = 0; i < 100; i++)
  75.                 delay_ms(50);
  76.         send_mrs_code_TEXT(HI); //发送字符串
  77.         write_com(0x01);// 清屏

  78.         while(1)
  79.         {
  80.                 if(~F0)           //PSW^5
  81.                         keyin(keyget());  //实体键输入
  82.                 else
  83.                     PCin();         //电脑终端输入
  84.         };
  85. }

复制代码


  1. //  MRScode.c文件

  2. #include <stdio.H>
  3. #include "1602.h"
  4. #include "MRScode.h"
  5. unsigned char count; //计算摩尔码输入显示点划的位置
  6. unsigned char showbuffer[L];  //显示缓冲
  7. unsigned char i = 0;             //显示缓冲数组下标
  8. static unsigned char time;  //按键停顿延时计数 供字符自动上屏
  9. static unsigned char MODE; //功能切换 MODE=0 KEY输入,=1按点键删1字,按划全删
  10.                                                   //=2按点键发送,=3调用短语,=4进入PC输入

  11. //摩尔斯码字库 字母A~Z(下标0~25)计26个, 数字0~9(下标26~35)计10个
  12. //  ? , . ! @ : -(下标36~42)计7个,总共43个字节
  13. unsigned char code MRSZK[] = { 0x61,0X28,0X2a,0x44,0x80,0x22,
  14.         0x46,0x20,0x60,0x27,0x45,0x24,0x63,0x62,0x47,0x26,0x2d,0x42,
  15.         0x40,0x81,0x41,0x21,0x43,0x29,0x2b,0x2c,/*A~Z*/0xbf,0xaf,0xa7,
  16.         0xa3,0xa1,0xa0,0xb0,0xb8,0xbc,0xbe,/*0~9*/0xcc,0xf3,0xd5,0xeb,
  17.         0xda,0xf8,0xe1/*  ?,.!@:- */ };

  18. unsigned char code ASCIIZK[] = "?,.!@:-"; //符号库,可扩展

  19. /***  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
  20.        [\]^_`abcdefghijklmnopqrstuvwxyz{|}~  ASCII可见字符  ***/

  21. //常用短语库
  22. unsigned char code *phrase[] = {"ok","NO", "SOS","hello","thank you","receive",
  23.                                                                 /*好,不,  求救, 你好,    谢谢你,   收到,*/
  24. "retransmission","Goodbye",         "Help me!",    "my location:"        ,  "MAX 10"         } ;
  25. /*重复,          再见,      帮帮我,         我的位置,          最多10条短语*/
  26. /******不限于这些短语,抛转引玉,其它可视EEPROM大小再添加*****/                        


  27. /*********此函数据键值实现摩斯码转ASCII码、并切换菜单实现相关功能*******/

  28. void keyin(unsigned char keyvalue)
  29. {
  30.         static unsigned char MRScode,num;
  31.         unsigned char x,y,z,j;
  32.         bit flag;

  33.         if(keyvalue != 255) //有键按下
  34.         {               
  35.                 Lcdwritestring(1,0,"                "); // 16空格清第二行
  36.                 if(keyvalue == 1) //点键
  37.                 {
  38.                         switch (MODE)  //功能模式切换
  39.                         {
  40.                                 case 0:          //本机正常输入点
  41.                                         TR0 = 1;  
  42.                                         MRScode <<= 1;          //发送端从高位开始的
  43.                                         Lcdwritechar(1,6+num,'.'); //num为点划输入的次数
  44.                                         num++;        
  45.                                         break;

  46.                                 case 1:                //按点键删除一字
  47.                                         MODE = 0;
  48.                                         if(i > 0)  //有字符就删除
  49.                                                 i--;        
  50.                                         goto CCC;

  51.                                 case 2:                //输完按点键发送
  52.                                         MODE = 0;
  53.                                         send_mrs_code_TEXT(showbuffer);
  54.                                         goto DDD;

  55.                                 case 3:                //上翻查找调用短语
  56.                                         write_com(0x01); //清屏
  57.                                         for(j= 0;j<L;j++)
  58.                                                 showbuffer[j] = phrase[x][j];                                
  59.                                         if(++x > 10)
  60.                                                 x = 10;
  61.                                         flag = 1;
  62.                                         goto DDD;

  63.                                 case 4:           //切换到Pc终端输入
  64.                                         MODE = 0;
  65.                                         i = 0;
  66.                                         F0 = 1;
  67.                                         Lcdwritestring(1,0,"PC:");
  68.                                         return;
  69.                                                                         
  70.                                 default:
  71.                                         MODE = 0;
  72.                                         return;                                       
  73.                         }
  74.                 }
  75.                 if(keyvalue == 2) //划键
  76.                 {
  77.                         if(MODE == 1)  //按划键全部删除
  78.                         {
  79.                                 MODE = 0;
  80.                                 i = 0;
  81.                                 goto CCC;
  82.                         }
  83.                         else if(MODE == 3)        //下翻查找短语
  84.                         {        
  85.                                 write_com(0x01);
  86.                                 for(j= 0;j<L;j++)
  87.                                         showbuffer[j] = phrase[x][j];                                
  88.                                 if(x>0)
  89.                                         x--;
  90.                                 flag = 1;
  91.                                 goto DDD;
  92.                         }

  93.                         TR0 = 1;        //本机正常输入划
  94.                         MRScode <<= 1;          //发送端从高位开始的
  95.                         MRScode |= 0x01;
  96.                         Lcdwritechar(1,6+num,'_');
  97.                         num++;
  98.                 }
  99.                 if(keyvalue == 3 )//功能键        
  100.                 {         
  101.                         if( ++MODE > 4 ) //循环显示菜单
  102.                                 MODE = 0;
  103.                         if(flag == 1)         //查找到短语后直接进入发送菜单
  104.                                 MODE = 2;
  105.                         flag = 0;
  106.                
  107.                         switch (MODE)         //屏上显示功能菜单
  108.                         {
  109.                                 case 1:
  110.                                         write_com(0x01);
  111.                                         Lcdwritestring(1,13,"DEL"); //删除
  112.                                         goto DDD;
  113.                                 
  114.                                 case 2:
  115.                                         write_com(0x01);
  116.                                         Lcdwritestring(1,8,"SEND->"); //发送
  117.                                         goto DDD;
  118.                                 
  119.                                 case 3:
  120.                                         write_com(0x01);
  121.                                         Lcdwritestring(1,6,"phrase"); // 调用短语
  122.                                         goto DDD;
  123.                                 
  124.                                 case 4:
  125.                                         write_com(0x01);
  126.                                         Lcdwritestring(1,3,"PC IN"); // 进入PC输入
  127.                                         goto DDD;                                       
  128.                                 
  129.                                 default:
  130.                                         write_com(0x01);
  131.                                         Lcdwritestring(1,0,"KEY IN"); // 本机输入
  132.                                         goto DDD;                                       
  133.                         }        
  134.                 }

  135.                 if(num<5 && num > 0)          //处理字母
  136.                 {
  137.                         if(num == 4 && MRScode == 3) // 输入 ..-- 是空格
  138.                         {
  139.                                   z = '_';         //显示用_代替
  140.                                   goto BBB;
  141.                         }
  142.                                  
  143.                         y = (8-3-num) << 5;  //得到字母前三位识别码值
  144.                          for(j = 0; j <= 25;j++)//字母字库地址0~25;
  145.                         {
  146.                                 if( MRSZK[j] == ( MRScode | y) )
  147.                                 {
  148.                                         z = j+0x41;//转化成ASCII码送显示
  149.                                         break;
  150.                                 }
  151.                         }
  152.                 }                        
  153.                    else if(num>5)   //处理符号
  154.                 {
  155.                          for(j = 36; j <= 42;j++)//符号字库地址36~42;
  156.                         {
  157.                                 if((MRSZK[j]&0x3F) == MRScode )        //清零高两位
  158.                                 {
  159.                                         z = ASCIIZK[j-36];
  160.                                         break;        
  161.                                 }
  162.                         }                        
  163.                 }
  164.                 else //处理数字
  165.                 {
  166.                          for(j = 26; j <= 35;j++)//数字地址26~35;
  167.                         {
  168.                                 if((MRSZK[j]&0x1F) == MRScode )        //清零高三位
  169.                                 {
  170.                                         z = j+0x16;
  171.                                         break;        
  172.                                 }
  173.                         }
  174.                 }
  175.                 Lcdwritechar(1,4,z);//显示候选字符
  176.                 if(num > 5)        //满6个点划自动上屏
  177.                 {
  178.         BBB:        time = 0;        
  179.                         TR0 = 0;
  180.                         MRScode = 0;
  181.                         num = 0;
  182.                         showbuffer[i] = z;//转化成的ASCII码送显示
  183.                         i++;
  184.         CCC:        showbuffer[i] = 0; //字符串结束加0
  185.                         write_com(0x01);
  186.         DDD:        Lcdwritestring(0,0,showbuffer);
  187.                         
  188.                 }
  189.                 if(i > L-2)
  190.                 {
  191.                         Lcdwritestring(1,0,"MEMORY FULL!");        //不能超过显存最大长度
  192.                         showbuffer[i] = 0;//字符串结束加0  
  193.                 }
  194.         }
  195.         else
  196.         {
  197.                 if(        time > 250)          //时间到,自动上屏
  198.                 {
  199.                         goto BBB;
  200.                 }
  201.         }
  202. }


  203. /*********电脑终端输入ASCII码**********/

  204. void PCin()
  205. {
  206.         unsigned char j,k,n,Char;
  207.         for(k = 0;k < L;k++)
  208.                 showbuffer[k] = 0;//清缓冲
  209.         k = 0;

  210.         do{
  211.                 while(!RI);
  212.                 RI = 0;
  213.                 Char = SBUF; //运行后在仿真终端输入半角字符
  214.                 if(Char == 0x1B)   //按ESC键退出PC输入
  215.                 {
  216.                         write_com(0x01);
  217.                         showbuffer[0] = 0;//清缓冲
  218.                         Lcdwritestring(0,0,"KEY:");
  219.                         F0 = 0;        //PSW 用户位
  220.                         MODE = 0;
  221.                         return;        
  222.                 }
  223.                 if(Char == 0x08) //按Backspace键
  224.                 {
  225.                         k--;  //退格删除一个字
  226.                         if(k == 0xff)
  227.                                 k = 0 ;  
  228.                         showbuffer[k] = 0;
  229.                         write_com(0x01);// 清屏
  230.                         Lcdwritestring(0,0,showbuffer);
  231.                         continue;
  232.                 }
  233.                 showbuffer[k] = Char;
  234.                 write_com(0x01);// 清屏
  235.                 Lcdwritestring(0,0,showbuffer);
  236.         
  237.                 /***此段为输入短语数字代码调用短语**/
  238.                 if(showbuffer[0] == '?') //调用短语用问号开头
  239.                 {
  240.                         if(Char >= '0' && Char <= '9')
  241.                         {        //如果是数字
  242.                         
  243.                                 n = n * 10 + (Char-'0');  //转成十进制数
  244.                                 if(n>10)         //暂时短语只有9个
  245.                                 {
  246.                                         n = 10;
  247.                                         write_com(0x01);
  248.                                         Lcdwritestring(1,0,phrase[n]);//调用短语
  249.                                         for(n = 1;n <= k+1; n++)
  250.                                                 showbuffer[n] = 0;
  251.                                         Lcdwritestring(0,0,showbuffer);                                                
  252.                                         n = 0;
  253.                                         k = 0;
  254.                                 }
  255.                                 else
  256.                                         Lcdwritestring(1,0,phrase[n]);//调用短语
  257.                         }
  258.                 }
  259.                 k++;
  260.         }while(Char != 0x0D);//回车发送
  261.         if(showbuffer[0] == '?')
  262.         {
  263.                 for(j= 0;j<L;j++)
  264.                         showbuffer[j] = phrase[n][j];                                
  265.         }
  266.         Lcdwritestring(0,0,showbuffer);
  267.         send_mrs_code_TEXT(showbuffer);
  268. }


  269. /******此函数可调节整体发送速度*****/        

  270. void delay_ms(unsigned char date)
  271. {
  272.         unsigned char i,j;
  273.         for(i = 0;i < date;i++)
  274.                 for(j = 0; j < 138; j++);
  275. }          //一点时长138约92ms  188约124.6ms  90约61.5ms


  276. void S_beep() //1个短滴声
  277. {          char i;        
  278.         for(i=0;i<1;i++)
  279.         {
  280.                 beep = 0;
  281.                 delay_ms(100);        
  282.                 beep = 0;
  283.                 delay_ms(100);        
  284.         }
  285.         beep = 1;
  286.         count++;
  287.         Lcdwritechar(1,9+count,'.');
  288. }

  289. void L_beep() //一个长滴音
  290. {        char i;
  291.         for(i=0;i<3;i++)
  292.         {
  293.                 beep = 0;
  294.                 delay_ms(100);        
  295.                 beep = 0;
  296.                 delay_ms(100);        
  297.         }
  298.         beep = 1;
  299.         count++;
  300.         Lcdwritechar(1,9+count,'_');
  301. }

  302. void J2_beep() // 间隔2个点静音
  303. {        char i;
  304.         for(i=0;i<2;i++)
  305.         {
  306.                 beep = 1;
  307.                 delay_ms(100);        
  308.                 beep = 1;
  309.                 delay_ms(100);        
  310.         }
  311. }

  312. void J1_beep() // 间隔1个点静音
  313. {        char i;
  314.         for(i=0;i<1;i++)
  315.         {
  316.                 beep = 1;
  317.                 delay_ms(100);        
  318.                 beep = 1;
  319.                 delay_ms(100);        
  320.         }
  321. }

  322. void J4_beep() // 间隔4个点静音
  323. {        char i;
  324.         for(i=0;i<4;i++)
  325.         {
  326.                 beep = 1;
  327.                 delay_ms(100);        
  328.                 beep = 1;
  329.                 delay_ms(100);        
  330.         }
  331. }

  332. /***********发送一个摩尔斯码************/
  333. void MRS_code_send(unsigned char MRS_code )
  334. {
  335.         unsigned char i; //数组下标
  336.         bit bt;         //识别长短声音

  337.         if(MRS_code < 0x90)         //小于是字母
  338.         {
  339.                 i = 3 + MRS_code /0x20;         //取前三位
  340.                 MRS_code <<= i-1;

  341.                 for(; i< 8; i++)
  342.                 {
  343.                         bt = (MRS_code <<= 1)&0x80;
  344.                         if(bt)
  345.                                 L_beep(); //一个长滴音
  346.                         else
  347.                                 S_beep(); //1个短滴声                        
  348.                         J1_beep(); // 间隔1个点静音;        
  349.                 }
  350.         }
  351.         else if(MRS_code > 0x90 && MRS_code < 0xc0)  //否则是发送数字
  352.         {
  353.                 MRS_code <<= 2;
  354.                 for(i = 3; i< 8; i++)
  355.                 {
  356.                         bt = (MRS_code <<= 1)&0x80;
  357.                         if(bt)
  358.                                 L_beep(); //一个长滴音
  359.                         else
  360.                                 S_beep(); //1个短滴声                        
  361.                         J1_beep(); // 间隔1个点静音;        
  362.                 }
  363.         }
  364.         else  //否则是发送符号
  365.         {
  366.                 MRS_code <<= 1;
  367.                 for(i = 2; i< 8; i++)
  368.                 {
  369.                         bt = (MRS_code <<= 1)&0x80;
  370.                         if(bt)
  371.                                 L_beep(); //一个长滴音
  372.                         else
  373.                                 S_beep(); //1个短滴声                        
  374.                         J1_beep(); // 间隔1个点静音;        
  375.                 }
  376.         }
  377.         J2_beep(); //字元间隔1+2=3个点静音
  378. }

  379. /******本函数ASCII码转摩尔斯码字符串发送*****/
  380. void send_mrs_code_TEXT(unsigned char *p)
  381. {
  382.         unsigned char i; //i即摩尔斯码字库数组下标
  383.         while(*p)
  384.         {
  385.                 if(*p != 0x20)//是否是空格
  386.                 {
  387.                         if(*p >= 0x41 && *p <= 0x5A )//大写字母A~Z        
  388.                         {
  389.                                 i = *p-0x41;  //i取字母字库 ,0x00地址开始
  390.                         }
  391.                         else if(*p >= 0x61 && *p <= 0x7A) //小写字母a~z
  392.                         {
  393.                                 i = *p-0x61;  //i取字母字库 ,0x00地址开始 ,
  394.                         }                                  //摩斯码字母不区分大小写
  395.                         else if(*p >= 0x30 && *p <= 0x39) //数字0~9
  396.                         {
  397.                                 i = *p-0x16;  //i取数字字库 ,0x1A地址开始                                
  398.                         }
  399.                         else
  400.                         {
  401.                                 switch (*p)
  402.                                 {
  403.                                         case '?': i =36;  //即字库数组下标
  404.                                                 break;
  405.                                         case ',': i =37;
  406.                                                 break;
  407.                                         case '.': i =38;
  408.                                                 break;
  409.                                         case '!': i =39;
  410.                                                 break;
  411.                                         case '@': i =40;
  412.                                                 break;
  413.                                         case ':': i =41;
  414.                                                 break;
  415.                                         case '-': i =42;
  416.                                                 break;
  417.                                         default:goto AAA;//其它字符当空格处理
  418.                                                 break;
  419.                                 }
  420.                         }  
  421.                         count = 0;//清摩尔码显示位置
  422.                         write_com(0x01);// 清屏
  423.                         Lcdwritestring(0,0,p);        //第一行显示待发字符串
  424.                         Lcdwritestring(1,0,"SEND->");        //第二行显示正在发送:
  425.                         Lcdwritechar(1,8,*p);//第二行显示待发字符
  426.                         p++;
  427.                         MRS_code_send(MRSZK[i]); //发送一个摩尔码
  428.                 }
  429.                 else
  430.                 {
  431.         AAA:        p++;
  432.                         J4_beep(); // 是空格,单词间隔3+4=7个点静音                        
  433.                 }
  434.         }
  435. }



  436. void time0_MRS (void) interrupt 1  //STC89C52 4毫秒@11.0592MHz
  437. {
  438.         TL0 = 0x9A;                //设置定时初值        我这是按点平均时长90ms,划时长270ms设置的
  439.         TH0 = 0xF1;                //设置定时初值        在接收人工发送的要设计智能调整适应
  440.         ++time; //按键停顿延时计数 供字符自动上屏
  441. }

  442. ..................................
  443. 其他,限于篇幅,请在附件里查看。
复制代码

51hei.png
Proteus7.5版本的仿真代码下载: 摩斯码104.zip (371.54 KB, 下载次数: 94)

评分

参与人数 2黑币 +102 收起 理由
绝望的萌新 + 12 很给力!
admin + 90 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:262 发表于 2021-11-10 23:55 | 显示全部楼层
15141752135 发表于 2021-11-10 22:31
仿真DsN文件如何打开呢?

dsn文件只能用Proteus7.5打开,这是我打开后的效果
51hei.gif
回复

使用道具 举报

ID:965487 发表于 2021-10-28 07:45 | 显示全部楼层
谢谢admin大额积分奖励,其实我的编程的动力,主要就是来升级头衔的。以后还望多多奖励哟,哈哈。
回复

使用道具 举报

ID:965487 发表于 2021-10-28 08:24 | 显示全部楼层
谢谢admin大额奖励,您的鼓励是我努力编程的动力。我将继续为晋升头衔而努力奋斗!
回复

使用道具 举报

ID:858959 发表于 2021-11-10 16:17 来自手机 | 显示全部楼层
楼主能大概说一下原理吗,想学习一下
回复

使用道具 举报

ID:858959 发表于 2021-11-10 22:31 来自手机 | 显示全部楼层
仿真DsN文件如何打开呢?
回复

使用道具 举报

ID:965487 发表于 2021-11-17 08:24 | 显示全部楼层
15141752135 发表于 2021-11-10 16:17
楼主能大概说一下原理吗,想学习一下

谢谢你的关注,原理其实很简单,但一两句话我也说不清楚,你可以下载源码进行阅读,注释很清楚的。
回复

使用道具 举报

ID:1106833 发表于 2023-12-28 11:02 | 显示全部楼层
压缩包里没有看到仿真文件啊请问在那里找
回复

使用道具 举报

ID:262 发表于 2023-12-28 22:04 | 显示全部楼层
zuiyuzhu 发表于 2023-12-28 11:02
压缩包里没有看到仿真文件啊请问在那里找

MRScode.DSN就是仿真文件,先下载Proteus7.8这个版本,楼主是用这个版本做的仿真,最好用这个版本打开
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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