① MULTISIM怎麼模擬51單片機
1、⑴組建模擬電路
"" componet」對話框的「family」欄中先選取「805x」,="" 然後在「componet」欄下選取「8051」,最後單擊對話框右上角的「ok」按鈕。滑鼠箭頭將帶出一個「8052」模塊,在電子模擬平台上單擊滑鼠,將先彈出MCU向導對話框之一,第一欄是工作區路徑,第二欄是工作區取名,這里輸入「my mcu design1」,最後單擊下方的「Next」按鈕;
⑵再次彈出MCU向導對話框之二,共有4欄選項,第一欄為項目類型,一般選擇「Standard (標准) 」;第二欄選擇編程語言種類,單擊右側下拉箭頭,可以在「Assembly C匯編」和「C」語言之間選擇,這里選取「C」語言;則第三欄自動顯示「Hi-tech C51-Lite compiler」字樣; 第四欄可以輸入項目名稱,本文取名為「project1」,最後單擊下方的「Next」按鈕;
⑶再次彈出MCU向導對話框之三,有2個單選項:「Create emptyproject (創建空項目) 」和「Addsource file (添加源文件) 」, 這里選取「Add sourcefile」;下面欄中可以輸入後綴為「。 C」的源文件名,這里就用「LED001. c」最後單擊下方「Finish」按鈕完成。
⑷完成MCU向導對話框之後,這時能在電子模擬平台上顯示出原來調出單片機模塊U18051,右擊滑鼠退出元件操作。
⑸保存文件,在文件名欄輸入「led11」文件名,默認文件後綴「.ms10」。
⑹在電子模擬軟體Multisim10基本界面平台上,單擊主菜單「View /Design Toolbox」,在基本界面左側將打開「設計工具盒」窗口,單擊「led11」前的「 + 」號可以看到剛才命名的工作區「my mcudesign1」,在工作區下面是項目名「project1 」, 在項目名下面是源文件名「Led001. c」。
⑺編寫MCU源C語言程序(過程略);
⑻調出其他模擬元件,搭建單片機模擬電路,進行模擬;
2、51單片機用protues這個軟體模擬更好!裡面已經有現成的51模塊了。調用就可以用,電源、地、復位電路和時鍾等等都不用畫。只要把編好的程序下載到protues中的51單片機裡面就可以運行。外圍提供的器件可以自己搭建。非常好用。
3、可以參考《基於Multisim 10的51單片機模擬實戰教程:使用匯編和C語言》。
② 51單片機如何模擬I2C匯流排中從機接收ID,發送數據的程序
希望能給你解答:
1、時鍾信號都是主機產生的,從機只有一種情況下才能控制時鍾線,即在忙的時候,主機還在發送數據,從機會主動把時鍾拉低,表示我正在忙,不能收數據。
2、兩個主機的話,在發送的時候一定會有一個從屬關系,這個需要自己設置。
3、響應:i2c上每傳輸一個位元組,都必須要有響應,方向是從機到主機。
③ 關於用51單片機的IO口模擬SPI驅動NRF2401模塊,nrf的CE,CSN和IRQ怎麼與單片機IO口連
I/O口相連,首先要電壓相等,3V不能直接5V。電壓不相等,要在中間串電阻。具體接法,就看你I/O口的定義了。
④ 51單片機模擬器的作用是什麼
模擬器可以看作一個特殊的單片機,你用模擬頭代替單片機,可以在電腦上讓它一句句的執行你寫的指令,也可以讓它運行到某個指令時就停止,程序有問題可以隨時改,重要的是你可以隨時看寄存器的值,所以它可以幫你快速調試程序。當然這種特殊功能的"單片機"挺貴的,幸好現在有的功能強大的單片機本身已經把這種功能集成了,你買個JTAG介面就行了!
有時也別太相信它,否則你也許會被它害苦了,它只是"模擬",不是真的"真"
`
大哥!這是我一個字一個字打的,說假話我不是人!
「有時也別太相信它,否則你也許會被它害苦了,它只是"模擬",不是真的"真"」
這是我的真實經歷,我有一回用偉福模擬器調TLC549,收到的8位二進制采樣值不知為何向左循環移了一位,我用了兩小時才發現這個規律,然後被這個問題折磨一天,因為程序確實沒錯。第二天實在是沒招了,燒了一片AT89C52放上去一試,居然一點問題也沒有了。你說不確定的事我能瞎說嗎?我CONTROL-C、CONTROL-V有啥意思?
心酸啊我!
356448120,請教不敢當,因為我水平也不怎麼樣,共同探討吧!
⑤ 51單片機可以做模擬量控制嗎.需要用什麼模塊
可以做模擬量控制,需要用DA轉換器,部分單片機本身也自帶DA功能。
⑥ 51單片機能否做nes游戲解碼
理論上是可以的,但實際上,由於51單片機計算能力十分弱,所以用51解碼真是雞肋。
最好用ARM或者用FPGA硬體解碼。
⑦ 最好的51單片機模擬軟體是什麼
樓上二人明顯沒看問題~~~~
模擬軟體,當然非Proteus莫屬,它支持51,AVR,430等常用單片機的模擬,而且可以和51的c語言編輯器聯調,即可以與keil連接在一起,進行單步運行來調試。
⑧ 51單片機如何模擬I2C匯流排中從機接收ID,發送數據的程序
#include /*頭文件的包含*/
#include
#define uchar unsigned char /*宏定義*/
#define uint unsigned int
/*埠位定義*/
sbit BELL_OUT=P3^5;
sbit SCL="P1"^3;/*模擬I2C數據傳送位*/
sbit SDA="P1"^4;/*模擬I2C時鍾控制位*/
bit ack; /*應答標志位*/
/*********************************************************************
起動匯流排函數
函數原型: void Start_I2c();
功能:啟動I2C匯流排,即發送I2C起始條件
********************************************************************/
void Start_I2c()
{
SDA="1"; /*發送起始條件的數據信號*/
_nop_();
SCL="1"; /*起始條件建立時間大於4.7us,延時*/
_nop_();
SDA="0"; /*發送起始信號*/
_nop_(); /* 起始條件鎖定時間大於4μs*/
SCL="0"; /*鉗住I2C匯流排,准備發送或接收數據 */
_nop_();
}
/***********************************************
結束匯流排函數
函數原型: void Stop_I2c();
功能:結束I2C匯流排,即發送I2C結束條件
***********************************************/
void Stop_I2c()
{
SDA="0"; /*發送結束條件的數據信號*/
_nop_(); /*發送結束條件的時鍾信號*/
SCL="1"; /*結束條件建立時間大於4μs*/
_nop_();
SDA="1"; /*發送I2C匯流排結束信號*/
_nop_();
}
/*******************************************************************
位元組數據傳送函數
函數原型: void SendByte(uchar c);
功能:將數據c發送出去,可以是地址,也可以是數據,發完後等待應答,並對此狀
態位進行操作(不應答或非應答都使ack=0 假) 。發送數據正常,ack=1;
ack=0表示被控器無應答或損壞。
********************************************************************/
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要傳送的數據長度為8位*/
{
SCL="0";
if((c<
else SDA="0";
SCL="1"; /*置時鍾線為高,通知被控器開始接收數據位*/
_nop_(); /*保證時鍾高電平周期大於4μs*/
}
//從機應答,可以用應答和非應答信號代替
_nop_();
SCL="0";
_nop_();
SDA="1"; //
_nop_();
SCL="1";
_nop_();
if(SDA==1){ack=0;} /*判斷是否接收到應答信號*/
else ack="1";
SCL="0";
_nop_();
}
/*******************************************************************
位元組數據傳送函數
函數原型: uchar RcvByte();
功能:用來接收從器件傳來的數據,並判斷匯流排錯誤(不發應答信號),
發完後請用應答函數。
********************************************************************/
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc="0";
for(BitCnt=0;BitCnt<8;BitCnt++)
{
SCL="1"; /*置時鍾線為高使數據線上數據有效*/
_nop_();
retc="retc"<<1;
if(SDA==1) retc="retc"+1; /*讀數據位,接收的數據位放入retc中 */
SCL="0";
}
return(retc);
}
/********************************************************************
應答子函數
原型: void Ack_I2c();
功能:主控器進行應答信號
********************************************************************/
void Ack_I2c()
{
SDA="0"; /*在此發出應答信號 */
_nop_();
SCL="0";
_nop_();
SCL="1";
_nop_();
SCL="0"; /*清時鍾線,鉗住I2C匯流排以便繼續接收*/
_nop_();
SDA="1";
_nop_();
}
/********************************************************************
非應答子函數
原型: void NoAck_I2c();
功能:主控器進行非應答信號
********************************************************************/
void NoAck_I2c()
{
SDA="1"; /*在此發出非應答信號 */
_nop_();
SCL="1";
_nop_();
SCL="0"; /*清時鍾線,鉗住I2C匯流排以便繼續接收*/
}
/*******************************************************************
向無子地址器件發送位元組數據函數
函數原型: bit ISendByte(uchar sla,ucahr c);
功能:從啟動匯流排到發送地址,數據,結束匯流排的全過程,從器件地址sla。如果
返回1表示操作成功,否則操作有誤。
********************************************************************/
bit ISendByte(uchar sla,uchar c)
{
Start_I2c(); /*啟動匯流排*/
SendByte(sla); /*發送器件地址*/
if(ack==0)return(0);
SendByte(c); /*發送數據*/
if(ack==0)return(0);
Stop_I2c(); /*結束匯流排*/
return(1);
}
/*******************************************************************
向有子地址器件發送多位元組數據函數
函數原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能:從啟動匯流排到發送地址,子地址,數據,結束匯流排的全過程,從器件地址sla,
子地址suba,發送內容是s指向的內容,發送no個位元組。如果返回1表示
操作成功,否則操作有誤。
********************************************************************/
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start_I2c(); /*啟動匯流排*/
SendByte(sla); /*發送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*發送器件子地址*/
if(ack==0)return(0);
for(i=0;i
{
SendByte(*s); /*發送數據*/
if(ack==0)return(0);
s++;
}
Stop_I2c(); /*結束匯流排*/
//delayMs(1); //
return(1);
}
/*******************************************************************
向無子地址器件讀位元組數據函數
函數原型: bit IRcvByte(uchar sla,ucahr *c);
功能:從啟動匯流排到發送地址,讀數據,結束匯流排的全過程,從器件地址sla,返
回值在c。如果返回1表示操作成功,否則操作有誤。
********************************************************************/
bit IRcvByte(uchar sla,uchar *c)
{
Start_I2c(); /*啟動匯流排*/
SendByte(sla+1); /*發送器件地址*/
if(ack==0)return(0);
*c=RcvByte(); /*讀取數據*/
NoAck_I2c(); /*發送非就答位*/
Stop_I2c(); /*結束匯流排*/
return(1);
}
/**********************************************************************
向有子地址器件讀取多位元組數據函數
函數原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能:從啟動匯流排到發送地址,子地址,讀數據,結束匯流排的全過程,從器件地址sla,
子地址suba,讀出的內容放入s指向的存儲區,讀no個位元組。如果返回1
表示操作成功,否則操作有誤。
**********************************************************************/
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
Start_I2c(); /*啟動匯流排*/
SendByte(sla); /*發送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*發送器件子地址*/
if(ack==0)return(0);
Start_I2c();
SendByte(sla+1);
if(ack==0)return(0);
while(no!=1)
{
*s=RcvByte();/*發送數據*/
Ack_I2c(); /*發送就答位*/
s++;
no--;
}
*s=RcvByte();
NoAck_I2c(); /*發送非應位*/
Stop_I2c(); /*結束匯流排*/
return(1);
}
⑨ 51單片機可以做8位FC游戲機嗎
非常勉強,網上好像有驅動彩屏的俄羅斯方塊,開發fc這樣的游戲起碼也要用stm32或者樹莓派吧,不過51做個打地鼠機還是不錯的