仿真原理圖如下(Multisim仿真工程文件可到本帖附件中下載)
0@OK[)5(G}TX7Z(N2Q({R{P.png (109.99 KB, 下載次數: 47)
下載附件
2022-5-6 21:28 上傳
截圖不太清楚,盡力了,,,不得不說,用multisim仿真51單片機效果實在是一言難盡!
出現了一些問題,主要是multisim的鍋,51單片機在計算的時候引腳電平會亂閃,這也就導致了這個時候數碼管會顯示亂碼。
需要等一段時間,仿真運行才能穩定下來,可以通過示波器觀看仿真運行速度以及仿真跑到哪了。
它果然只能仿真點小電路。。
51hei.gif (118.63 KB, 下載次數: 33)
下載附件
2022-5-7 02:59 上傳
單片機源程序如下:
- #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)
2022-5-7 03:01 上傳
點擊文件名下載附件
multiisim 正弦波/方波360度移向 51數碼管顯示 下載積分: 黑幣 -5
|