仿真原理图如下(Multisim仿真工程文件可到本帖附件中下载)
截图不太清楚,尽力了,,,不得不说,用multisim仿真51单片机效果实在是一言难尽!
出现了一些问题,主要是multisim的锅,51单片机在计算的时候引脚电平会乱闪,这也就导致了这个时候数码管会显示乱码。
需要等一段时间,仿真运行才能稳定下来,可以通过示波器观看仿真运行速度以及仿真跑到哪了。
它果然只能仿真点小电路。。
单片机源程序如下:
- #include <reg51.h> //调用51单片机的头文件
- #define uint unsigned int
- #define ulint unsigned long int
- #define uchar unsigned char
-
- #define AMing_T 10 //测量周期数宏定义
- #define AMing_F 50 //测量信号频率宏定义
- //数码管字形表,供显示时查询
- unsigned char code AMing_LED[10]=
- { //定义表格一定要使用code,这样会做到程序存储区中
- 0x00, //"0"的字形表,0B00111111
- 0x01, //"1"的字形表,0B00000110
- 0x02, //"2"的字形表,0B01011011
- 0x03, //"3"的字形表,0B01001111
- 0x04, //"4"的字形表,0B01100110
- 0x05, //"5"的字形表,0B01101101
- 0x06, //"6"的字形表,0B01111101
- 0x07, //"7"的字形表,0B00000111
- 0x08, //"8"的字形表,0B01111111
- 0x09, //"9"的字形表,0B01101111
- };
- ulint AMing_n=0; //计数
- uint AMing_k=0; //用于标记n的变化.控制数码管刷新频率
- char AMing_k_Flag=0; //用于标记k的变化
- //延时函数
- void AMing_Delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=50;y>0;y--);
- }
- //定时器0初始化
- void AMing_time_init(void) //定时器初始化函数
- {
- TMOD=0x02; //选择方式2
- TH0=56; //重装初值为156 200us
- TL0=56; //运行值为156
- EA=1; //使能总中断 //开总中断
- PT0 = 0; //设为低优先级
- }
- //外部中断0中断初始化
- void AMing_ConfigExitIint0()
- {
- IT0 = 1; //选择为下降沿触发方式(为1代表下降沿触发,为0代表低电平触发)
- EX0 = 1; //使能外部中断0
- PX0 = 1; //设为高优先级
- }
- //外部中断1中断初始化
- void AMing_ConfigExitIint1()
- {
- IT1 = 1; //选择为下降沿触发方式
- EX1 = 1; //使能外部中断1
- PX1 = 1; //设为高优先级
- }
- //数码管显示函数
- void AMing_Display(void)
- {
- uint p2=0; //用于记录P2的变化
- uint p0=0; //用于记录P0的变化
- uint i=0;
- uint j=0;
- i = (ulint)(360*AMing_F*(float)AMing_n/5000/AMing_k); //360*AMing_F*t t是单位周期相位超前时间,单位是s
- p2 = AMing_LED[i%10];
- j = AMing_LED[i/100]<<4;
- p0 = j+AMing_LED[i%100/10];
- P2 = 0x00;
- P0 = 0x00;
- AMing_Delay(50);
- P2 = p2;
- P0 = p0;
- }
- //主函数
- void main(void) //主函数,单片机开机后就是从这个函数开始运行
- {
- P1 = 0xFF;
- P3 = 0xFF;
- P2 = 0x00;
- P0 = 0x00;
- AMing_ConfigExitIint0();
- AMing_ConfigExitIint1();
- AMing_time_init();
- while(1) //死循环,单片机初始化后,将一直运行这个死循环
- {
- // AMing_Delay(1); //等待multisim
- if(AMing_k_Flag)
- {
- AMing_Display(); //数码管显示
- AMing_k = AMing_k_Flag = 0; //重置标志
- AMing_n = 0; //清零
- EA = 1; //开总中断
- }
- }
- }
- //外部中断0中断服务函数
- //由相移前的波整形后下降沿触发
- void extInt0ISR() interrupt 0
- {
- AMing_k++;
- ET0=1; //开定时器0中断
- TR0=1; //开定时器0 //开始计时
- }
- //外部中断1中断服务函数
- //由相移后的波整形后下降沿触发
- void extInt1ISR() interrupt 2
- {
- if(AMing_k)
- { //判断外部中断0是否已触发,以确定基准
- ET0=0; //关定时器0中断
- TR0=0; //关定时器0
- if(AMing_k >= AMing_T)
- { //
- AMing_k_Flag = 1; //标志位置1
- EA = 0; //关总中断
- }
- }
- }
- //定时器0中断
- void timer() interrupt 1 //定时器0中断
- {
- AMing_n++; //AMing_n(200us)
- }
复制代码
Multisim14仿真文件51hei附件下载:
51单片机的Multisim仿真.7z
(875.56 KB, 下载次数: 29)
|