找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1529|回复: 0
收起左侧

Multisim仿真51单片机正弦波/方波360度移向 数码管显示程序

[复制链接]
ID:604918 发表于 2022-5-6 21:30 | 显示全部楼层 |阅读模式
仿真原理图如下(Multisim仿真工程文件可到本帖附件中下载)
0@OK[)5(G}TX7Z(N2Q({R{P.png
截图不太清楚,尽力了,,,不得不说,用multisim仿真51单片机效果实在是一言难尽!
出现了一些问题,主要是multisim的锅,51单片机在计算的时候引脚电平会乱闪,这也就导致了这个时候数码管会显示乱码。
需要等一段时间,仿真运行才能稳定下来,可以通过示波器观看仿真运行速度以及仿真跑到哪了。
它果然只能仿真点小电路。。
51hei.gif

单片机源程序如下:
  1. #include <reg51.h>       //调用51单片机的头文件

  2. #define uint unsigned int
  3. #define ulint unsigned long int
  4. #define uchar unsigned char
  5.         
  6. #define AMing_T  10                //测量周期数宏定义
  7. #define AMing_F  50                //测量信号频率宏定义

  8. //数码管字形表,供显示时查询
  9. unsigned char code AMing_LED[10]=
  10.         {                          //定义表格一定要使用code,这样会做到程序存储区中
  11.     0x00,                  //"0"的字形表,0B00111111
  12.     0x01,                  //"1"的字形表,0B00000110
  13.     0x02,                  //"2"的字形表,0B01011011
  14.     0x03,                  //"3"的字形表,0B01001111
  15.     0x04,                  //"4"的字形表,0B01100110
  16.     0x05,                  //"5"的字形表,0B01101101
  17.     0x06,                  //"6"的字形表,0B01111101
  18.     0x07,                  //"7"的字形表,0B00000111
  19.     0x08,                  //"8"的字形表,0B01111111
  20.     0x09,                  //"9"的字形表,0B01101111
  21.         };

  22. ulint AMing_n=0;                        //计数
  23. uint AMing_k=0;                         //用于标记n的变化.控制数码管刷新频率
  24. char AMing_k_Flag=0;                   //用于标记k的变化

  25. //延时函数
  26. void AMing_Delay(uint z)
  27.         {
  28.          uint x,y;
  29.                          for(x=z;x>0;x--)
  30.                                 for(y=50;y>0;y--);
  31.         }

  32. //定时器0初始化
  33. void AMing_time_init(void)                                                   //定时器初始化函数
  34.         {
  35.         TMOD=0x02;                                                          //选择方式2
  36.         TH0=56;                                                          //重装初值为156    200us
  37.         TL0=56;                                                          //运行值为156
  38.         EA=1;                 //使能总中断                                                         //开总中断
  39.         PT0 = 0;                                 //设为低优先级
  40.         }
  41. //外部中断0中断初始化
  42. void AMing_ConfigExitIint0()
  43.         {
  44.         IT0 = 1;        //选择为下降沿触发方式(为1代表下降沿触发,为0代表低电平触发)
  45.         EX0 = 1;        //使能外部中断0        
  46.         PX0 = 1;                //设为高优先级
  47.         }
  48. //外部中断1中断初始化
  49. void AMing_ConfigExitIint1()
  50.         {
  51.         IT1 = 1;          //选择为下降沿触发方式
  52.         EX1 = 1;                //使能外部中断1        
  53.         PX1 = 1;                //设为高优先级
  54.         }
  55. //数码管显示函数
  56. void AMing_Display(void)
  57.         {           
  58.         uint p2=0;                         //用于记录P2的变化
  59.         uint p0=0;                         //用于记录P0的变化
  60.         uint i=0;
  61.         uint j=0;
  62.         i = (ulint)(360*AMing_F*(float)AMing_n/5000/AMing_k);           //360*AMing_F*t   t是单位周期相位超前时间,单位是s
  63.         p2 = AMing_LED[i%10];
  64.         j = AMing_LED[i/100]<<4;
  65.         p0 = j+AMing_LED[i%100/10];
  66.         P2 = 0x00;
  67.         P0 = 0x00;      
  68.         AMing_Delay(50);               
  69.         P2 = p2;
  70.         P0 = p0;
  71.         }

  72. //主函数
  73. void main(void)            //主函数,单片机开机后就是从这个函数开始运行
  74.         {
  75.         P1 = 0xFF;
  76.         P3 = 0xFF;
  77.         P2 = 0x00;
  78.         P0 = 0x00;
  79.         AMing_ConfigExitIint0();
  80.         AMing_ConfigExitIint1();
  81.         AMing_time_init();
  82.         while(1)               //死循环,单片机初始化后,将一直运行这个死循环
  83.                 {
  84.         //                                        AMing_Delay(1);        //等待multisim               
  85.                         if(AMing_k_Flag)
  86.                                 {
  87.                                 AMing_Display();                  //数码管显示
  88.                                 AMing_k = AMing_k_Flag = 0;                      //重置标志
  89.                                 AMing_n = 0;                      //清零
  90.                                 EA = 1;                     //开总中断
  91.                                 }
  92.                 }
  93.         }
  94. //外部中断0中断服务函数
  95. //由相移前的波整形后下降沿触发
  96. void extInt0ISR() interrupt 0
  97.         {
  98.         AMing_k++;
  99.         ET0=1;                                                                  //开定时器0中断
  100.   TR0=1;                                                                  //开定时器0    //开始计时
  101.         }                     
  102. //外部中断1中断服务函数
  103. //由相移后的波整形后下降沿触发
  104. void extInt1ISR() interrupt 2
  105.         {
  106.         if(AMing_k)
  107.                 {                                      //判断外部中断0是否已触发,以确定基准
  108.                 ET0=0;                                                                  //关定时器0中断
  109.                 TR0=0;                                                                  //关定时器0
  110.                 if(AMing_k >= AMing_T)
  111.                         {                 //
  112.                         AMing_k_Flag = 1;                 //标志位置1
  113.                         EA = 0;                     //关总中断
  114.                         }
  115.                 }
  116.         }
  117. //定时器0中断
  118. void timer() interrupt 1                                          //定时器0中断
  119.         {
  120.         AMing_n++;            //AMing_n(200us)
  121.         }
复制代码

Multisim14仿真文件51hei附件下载: 51单片机的Multisim仿真.7z (875.56 KB, 下载次数: 22)

评分

参与人数 1黑币 +90 收起 理由
admin + 90 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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