文章目录
STM32纯软仿真LED闪烁一、新建工程二、程序的设计三、程序编译四、仿真测试
C51单片机仿真LED流水灯一、程序设计二、Proteus仿真
总结
STM32纯软仿真LED闪烁
一、新建工程
打开keil uVision5,新建一个工程,选择我们需要用到的芯片,再设置运行环境即可。我们采用的是STM32F103。 具体过程参自: http://www.51hei.com/stm32/3728.html
二、程序的设计
#define PERIPH_BASE ((unsigned int)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)
#define GPIOA_ODR_Addr (GPIOA_BASE+12)
#define GPIOB_ODR_Addr (GPIOB_BASE+12)
#define GPIOC_ODR_Addr (GPIOC_BASE+12)
#define GPIOD_ODR_Addr (GPIOD_BASE+12)
#define GPIOE_ODR_Addr (GPIOE_BASE+12)
#define GPIOF_ODR_Addr (GPIOF_BASE+12)
#define GPIOG_ODR_Addr (GPIOG_BASE+12)
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define LED0 MEM_ADDR(BITBAND(GPIOA_ODR_Addr,8))
typedef struct
{
volatile unsigned int CR
;
volatile unsigned int CFGR
;
volatile unsigned int CIR
;
volatile unsigned int APB2RSTR
;
volatile unsigned int APB1RSTR
;
volatile unsigned int AHBENR
;
volatile unsigned int APB2ENR
;
volatile unsigned int APB1ENR
;
volatile unsigned int BDCR
;
volatile unsigned int CSR
;
} RCC_TypeDef
;
#define RCC ((RCC_TypeDef *)0x40021000)
typedef struct
{
volatile unsigned int CRL
;
volatile unsigned int CRH
;
volatile unsigned int IDR
;
volatile unsigned int ODR
;
volatile unsigned int BSRR
;
volatile unsigned int BRR
;
volatile unsigned int LCKR
;
} GPIO_TypeDef
;
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)
void LEDInit( void )
{
RCC
->APB2ENR
|=1<<2;
GPIOA
->CRH
&=0XFFFFFFF0;
GPIOA
->CRH
|=0X00000003;
}
void Delay_ms( volatile unsigned int t
)
{
unsigned int i
,n
;
for (n
=0;n
<t
;n
++)
for (i
=0;i
<800;i
++);
}
int main(void)
{
LEDInit();
while (1)
{
LED0
=0;
Delay_ms(500);
LED0
=1;
Delay_ms(500);
}
}
程序参自:https://blog.csdn.net/qq_43279579/article/details/108880667 闪烁LED的过程: ①配置时钟 可以使用默认的时钟——内部8MZH振荡器,也可以自己配置时钟PLL; ②配置I/O口 LED灯接到PA8,如何控制PA8?
void LEDInit( void )
{
RCC
->APB2ENR
|=1<<2;
GPIOA
->CRH
&=0XFFFFFFF0;
GPIOA
->CRH
|=0X00000003;
}
其中RCC->APB2ENR|=1<<2; 是使能GPIOA的时钟.
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;
是配置PA8为推挽输出,50MHZ。 ③I/O输出高低电平
三、程序编译
四、仿真测试
① 首先开始设置仿真调试,点击Options for target。 ② 选择debug,由于我们做的是纯软件仿真,没有硬件,所以选择左侧的Use Simulator,Dialog DLL改为:DARMSTM.DLL,Parameter改为:-pSTM32F103ZE。 ③ 开始调试 选择Start Debug,开始调试
C51单片机仿真LED流水灯
一、程序设计
(一)在keil上安装C51支持包 (二)新建工程,选择AT89C51RC2型号即可 (三)具体程序
#include"reg51.h"
#include"intrins.h"
void delay1ms(unsigned char c
)
{
unsigned char a
,b
;
for(c
;c
>0;c
--)
for(b
=142;b
>0;b
--)
for(a
=2;a
>0;a
--);
}
void main()
{
unsigned char led
,i
;
led
=0xfe;
delay1ms(100);
while(1)
{
for(i
=0;i
<7;i
++)
{
P2
=led
;
delay1ms(100);
led
=_crol_(led
,1);
}
for(i
=0;i
<7;i
++)
{
P2
=led
;
delay1ms(100);
led
=_cror_(led
,1);
}
}
}
程序参自:https://blog.csdn.net/void_much/article/details/99719705 注意: 编译之前一定要选择创建hex文件,否则proteus导入不了程序。 (四)编译 注意: C51的安装路径要和工程目录的默认路径一致,否则会报错:
二、Proteus仿真
(一)在Proteus新建工程,绘制电路图 (二)导入hex文件 (三)编译 (四)效果图
总结
这次实验遇到了很多难题,主要是在keil stm32里设置调试环境,路径的设置等,最后在网上查过资料解决了。在proteus里,一开始是新建不起工程,最后又重新装了一遍,需要离线安装,把防火墙关了,以管理员身份运行才解决。