STM32和C51单片机实现程序设计与仿真测试(LED闪烁)

    科技2024-11-15  10

    文章目录

    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里,一开始是新建不起工程,最后又重新装了一遍,需要离线安装,把防火墙关了,以管理员身份运行才解决。

    Processed: 0.058, SQL: 8