DMK开发环境下对STM32的简单编译运行以及对89C51的编译及仿真

    科技2025-10-08  2

    DMK开发环境下对STM32的简单编译运行以及对89C51的编译及仿真

    文章目录

    DMK开发环境下对STM32的简单编译运行以及对89C51的编译及仿真作业任务:一、安装DMK5二、用STM32编译三、用protues仿真,利用89c51设计程序

    作业任务:

    安装mdk5软件和stm32包,熟悉mdk开发环境,完成一个stm32的简单程序的编译。安装过程可参考 网上或者“STM32底座实验指导书”第1章。示例程序可以参考网上代码,或者“STM32底座实验指导书”第 3章的“LED闪烁”。(注意,没有硬件之前,只能做程序的编译和仿真测试,无法下载到硬件上运行)安装并熟悉Proteus 电路仿真软件,完成一个51程序设计和仿真。

    一、安装DMK5

    操作过程请参考 https://blog.csdn.net/cheapter/article/details/80198168. 第一步:下载软件安装包并解压 第二步:以管理员身份打开安装好的keil5 打开后点击左上角“file”中的“License Management”,如下图 然后打开软件keygen(需要自行下载),复制上图的CID获得密匙延期。

    二、用STM32编译

    1、找到之前下载的安装包,双击下图的两个文件 2、打开Keil5,创建新工程并运行 然后点击ok后,进入下图这个页面,勾选出如图所示部分 点击ok 3、点击左上角的“file”创建一个新文件,将代码写入其中,保存格式将其命名为“.c” 代码如下: ps:代码参考与实验指导书及其他

    //宏定义,用于存放stm32寄存器映射 #define PERIPH_BASE ((unsigned int)0x40000000)//AHB #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) //GPIOA_BASE=0x40000000+0x10000+0x0800=0x40010800,该地址为GPIOA的基地址 #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) //GPIOB_BASE=0x40000000+0x10000+0x0C00=0x40010C00,该地址为GPIOB的基地址 #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) //GPIOC_BASE=0x40000000+0x10000+0x1000=0x40011000,该地址为GPIOC的基地址 #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) //GPIOD_BASE=0x40000000+0x10000+0x1400=0x40011400,该地址为GPIOD的基地址 #define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) //GPIOE_BASE=0x40000000+0x10000+0x0800=0x40011800,该地址为GPIOE的基地址 #define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) //GPIOF_BASE=0x40000000+0x10000+0x0800=0x40011C00,该地址为GPIOF的基地址 #define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) //GPIOG_BASE=0x40000000+0x10000+0x0800=0x40012000,该地址为GPIOG的基地址 #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C #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)) //#define LED0 *((volatile unsigned long *)(0x422101a0)) //PA8 //定义typedef类型别名 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类型别名 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; //GPIOA指向地址GPIOA_BASE,GPIOA_BASE地址存放的数据类型为GPIO_TypeDef #define GPIOA ((GPIO_TypeDef *)GPIOA_BASE) void LEDInit( void ) { RCC->APB2ENR|=1<<2; //GPIOA 时钟开启 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;//LED熄灭 Delay_ms(500);//延时时间 LED0=1;//LED亮 Delay_ms(500);//延时时间 } }

    将“.c”文件添加至“Source Group 1”并运行,运行结果如下: 3、程序仿真测试 按顺序点击如下列图所示 然后再点击debug 仿真测试结果如下图,没有发现问题

    三、用protues仿真,利用89c51设计程序

    此次编程一个交通信号灯 1、创建新工程 2、先选择好仿真器件,再连接好仿真运行图 仿真图: 3、打开keil,编程89c51的程序 代码如下:

    #include "reg51.h" sbit hr=P1^0; sbit hy=P1^1; sbit hg=P1^2; sbit sr=P1^3; sbit sy=P1^4; sbit sg=P1^5; sbit h1=P2^0; sbit h2=P2^1; sbit s1=P2^2; sbit s2=P2^3; int count=0; int time=0; int num[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void delay(int t) { int x,y; for(x=0;x<t;x++) { for(y=0;y<100;y++); } } void main() { P1=0xff; hg=0; sr=0; P2=0x00; TMOD=0x01; TL0=0x3C; TH0=0xB0; ET0=1; EA=1; TR0=1; while(1) { if(time<30) { h1=1;P0=num[((30-time)/10)];delay(10);h1=0; h2=1;P0=num[((30-time)%10)];delay(10);h2=0; s1=1;P0=num[((33-time)/10)];delay(10);s1=0; s2=1;P0=num[((33-time)%10)];delay(10);s2=0; } else if(time<33) { h1=1;P0=num[((33-time)/10)];delay(10);h1=0; h2=1;P0=num[((33-time)%10)];delay(10);h2=0; s1=1;P0=num[((33-time)/10)];delay(10);s1=0; s2=1;P0=num[((33-time)%10)];delay(10);s2=0; } else if(time<63) { h1=1;P0=num[((66-time)/10)];delay(10);h1=0; h2=1;P0=num[((66-time)%10)];delay(10);h2=0; s1=1;P0=num[((63-time)/10)];delay(10);s1=0; s2=1;P0=num[((63-time)%10)];delay(10);s2=0; } else if(time<66) { h1=1;P0=num[((66-time)/10)];delay(10);h1=0; h2=1;P0=num[((66-time)%10)];delay(10);h2=0; s1=1;P0=num[((66-time)/10)];delay(10);s1=0; s2=1;P0=num[((66-time)%10)];delay(10);s2=0; } } } void timer() interrupt 1 { TH0=0x3C; TL0=0xB0; count=count+1; if(count==20) { count=0; time=time+1; if(time==30) { P1=0xff;hy=0;sr=0; } else if(time==33) { P1=0xff;hr=0;sg=0; } else if(time==63) { P1=0xff;hr=0;sy=0; } else if(time==66) { time=0; P1=0xff;hg=0;sr=0; } } }

    用keil运行该程序 得到“.hex”的文件 4、打开protues,打开工程 双击89c51 5、仿真运行,结果如下

    Processed: 0.011, SQL: 10