
调试已经通过
///////////////////////////spih/////////////////////////////
#ifndef
SPI_H
#define
SPI_H
#include
<stc12le5a60s2h>
#include
<spih>
//sfr
P4
=
0xe8;
//STC12LE5A60S2单片机自带SPI控制器连接
//sbit
VCC1
=
P2^0;//
VCC1
NO
USE
//sbit
SON
=
P1^6
;//
MISO
//sbit
SIN
=
P1^5
;//
MOSI
//sbit
SCKN
=
P1^7
;
//
SCK
sbit
CSN
=
P1^4
;//
28J60
--
CS
//sbit
RSTN
=
P3^5
;
//RST,
no
use
//sbit
INTN
=
P3^3
;
//
INT,
no
use
void
init_spi(void);
void
WriteByte(u8_t
temp);
u8_t
ReadByte(void);
#endif
////////////////////////////////////////////////////////////////
///////////////////////////spic/////////////////////////////
#include<spih>
//STC12LE5A60S2单片机自带SPI控制器连接
void
init_spi(void)
{
//SSIG
=
1;
//忽略SS脚
//SPEN
=
1;
//允许SPI工作
//DORD
=
0;
//先传高位MSB
//MSTR
=
1;
//设置单片机为主机
SPCTL
=
0xD0;
//SPI
Control
Register
SSIG
SPEN
DORD
MSTR
CPOL
CPHA
SPR1
SPR0
0000,0100
SPSTAT
=
0xC0;
//
//IE2
|=
0x02;
//允许SPI中断控制位
}
void
WriteByte(u8_t
temp)
{
SPDAT
=
temp;
while(!(SPSTAT
&
0x80));
SPSTAT
=
0xC0;
}
u8_t
ReadByte(void)
{
idata
u8_t
temp;
//SPSTAT
=
0xC0;
SPDAT
=
0x00;
while(!(SPSTAT
&
0x80));
temp
=
SPDAT;
SPSTAT
=
0xC0;
return
temp;
}
////////////////////////////////////////////////////////////////
可以用软件画出单片机电路图,然后也照常写程序加到单片机上,运行后,就可以得到相应的仿真效果,就像实物单片机运行程序的效果一样。这样,对于学习单片机很方便,不用买实物开发板就可以学习单片机的电路和练习编写程序。单片机用protues这个软件仿真更好!里面已经有现成的51模块了。调用就可以用,电源、地、复位电路和时钟等等都不用画。只要把编好的程序下载到protues中的51单片机里面就可以运行。外围提供的器件可以自己搭建。双机单片机出现这个框架,打开Program File ,把要仿真的程序烧进去就可以了,然后点下面的开始跟停止按键,开始仿制。系统仿真的概念是根据系统分析的目的,在分析系统各要素性质及其相互关系的基础上,建立能描述系统结构或行为过程的、且具有一定逻辑关系或数量关系的仿真模型,据此进行试验或定量分析,以获得正确决策所需的各种信息。 计算机试验常被用来研究仿真模型(simulation model)。仿真也被用于对自然系统或人造系统的科学建模以获取深入理解。仿真可以用来展示可选条件或动作过程的最终结果。 仿真也可用在真实系统不能做到的情景,这是由于不可访问(accessible)、太过于危险、不可接受的后果、或者设计了但还未实现、或者压根没有被实现等。 仿真的主要论题是获取相关选定的关键特性与行为的有效信息源,仿真时使用。
package guidemo;
import javaawt;
import javaawteventMouseEvent;
import javaawteventMouseListener;
/
<p>Title: 图形用户界面</p>
<p>Description: 简单的图形界面编程</p>
<p>Copyright: Copyright (c) 2006</p>
<p>Company: </p>
@author vic
@version 10
/
public class ColorFrame extends Frame implements MouseListener {
Label L; //标签
TextField T; //文本域
Button B1, B2; //按钮
public ColorFrame() {
thissetLayout(null); //想要手动指定各组件的的位置
L = new Label("输入学号:"); //设定标签L内容
LsetBounds(60, 50, 50, 25); //设定标签L外观
thisadd(L); //将标签L添加到窗口中
T = new TextField("请在这里输入"); //设定文本域T的内容
TsetBounds(125, 50, 90, 25); //设定文本域T的外观
thisadd(T); //将文本域T添加到窗口中
B1 = new Button("变红!"); //设定按钮B1的内容
B1setBounds(25, 90, 90, 25); //设定按钮B1的外观
B1addMouseListener(this);//在B1上注册鼠标监听器
thisadd(B1); //将按钮B1添加到窗口中
B2 = new Button("变绿!");
B2setBounds(125, 90, 90, 25);
B2addMouseListener(this);
thisadd(B2);
WindowDestroyer Listener = new WindowDestroyer(); //创建关闭窗口监听器
thisaddWindowListener(Listener); //将监听器添加到窗口中
thissetBackground(Coloryellow); //设定窗口背景颜色
thissetTitle("This is Frame!"); //设定窗口标题文字
thissetBounds(0, 0, 250, 220); //设定窗口位置和大小
thissetVisible(true); //显示窗口
}
public void mouseClicked(MouseEvent e) {
if (egetComponent() == B1) {//getComponent返回按钮上面的字符串
thissetBackground(Colorred);
}
if (egetComponent() == B2) {
thissetBackground(Colorgreen);
}
}
public void mouseExited(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public static void main(String[] args) {
new ColorFrame();
}
}
#include<reg51h>
#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsigned char sec=0,scanled;
unsigned char key,mode,time;
unsigned char disdat[2];
sbit keyqd=P1^0;
sbit keyzt=P1^1;
sbit keyql=P1^2;
void dischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
}
void t0isr() interrupt 1 //秒计时
{
TH0=0x3c;
TL0=0xb0;
time++;
if(time==20)
{
time=0;
if(sec<99)sec++;
}
dischg();
}
void t1isr() interrupt 3 //显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case 0:
P3=0x02;
P2=ledtab[disdat[1]];
break;
case 1:
P3=0x01;
P2=ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=2;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
TR1=1;
TR0=0;
ET0=1;
ET1=1;
EA=1;
scanled=0;
time=0;
mode=1;
dischg();
while(1)
{
if(keyqd==0)
{
while(keyqd==0);
TR0=1;
}
if(keyzt==0)
{
while(keyzt==0);
TR0=0;
}
if(keyql==0)
{
while(keyql==0);
sec=0;
}
dischg();
}
}
首先,,烧到单片机里面和单片机的仿真,你说的仿真应该指的是软件仿真。不论是软件仿真还是硬件仿真都代替不了程序实际运行的真实效果,首先,软件仿真的话,软件毕竟是软件,可能会有漏洞,我有时候用KEIL自带的软件仿真器程序能运行但是烧写之后不能运行是很正常的;
硬件仿真的话,仿真器可以让程序单步执行,还能够设置断点,看程序运行的时候相应的寄存器的值是否跟设计的一样,对调试软件很有帮助。
软件仿真的话常用的就是protues,我一般直接用KEIL的软件仿真,功能没有protues强大,但是方便;
硬件大致仿真器分两种,一种是用FGPA或者特殊的CPU来模拟单片机,程序每次是烧在RAM里面运行的,网上有用SST89E516做51单片机仿真器的,就是这个原理,每执行一次单步,就重新烧写一次程序,只不过SST89E516是烧在FLASH里面的,单步用多了的话,SST89E516很快就挂了,这种仿真器效果要比上面的软件仿真效果好,但是也有问题,它是用别的东西模拟的单片机,跟真实的还是有差异;现在用的很多的都是叫做JTAG的嵌入式仿真,这种仿真让单片机自己仿真自己,只是使用者可以随时把程序运行停下来看寄存器,效果就好多了,现在很多单片机都具有这个功能,像C8051F,AVR,ARM都有,仿真器的硬件也比上面的一种简单很多,便宜许多
初学51的话,硬件仿真成本太大,可以多用用软件仿真,但是肯定不能完全只用软件仿真,还是要实际运行一下看效果的;不用仿真器,用串口帮助调试也是很不错的选择,在感觉有问题的地方用串口发点数据,证明前面没有卡死或者直接就发单片机的状态,调试起来也很快
以上就是关于求51单片机模拟SPI通讯的C程序,最好带详解!谢谢全部的内容,包括:求51单片机模拟SPI通讯的C程序,最好带详解!谢谢、单片机怎么仿真、模拟交通灯 单片机C51,要电路图和程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)