① 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做个打地鼠机还是不错的