嵌入式stm简单程序仿真

    科技2025-08-08  3

    一个stm32的简单程序的编译和一个51程序设计和仿真

    一、一个stm32的LED程序的编译打开keil5并建立新工程选择需要的芯片创建一个新文件夹输入代码:将代码保存后把文件加入工程打开项目点击目标选项编译执行生成HEX文件 二、一个51程序设计和仿真在keil5上重新建一个工程选上C51芯片创建文本输入代码保存.c文件并进行编译编译后执行生成HEX文件 建立proteus工程进行仿真建立新工程找出原器件并连线将HEX文件代入C51芯片并进行仿真 小结:

    一、一个stm32的LED程序的编译

    打开keil5并建立新工程

    选择需要的芯片

    创建一个新文件夹

    输入代码:

    #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) //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 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 ???? 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); } }

    将代码保存后把文件加入工程

    打开项目点击目标选项

    注意记得勾选生成HEX文件

    编译执行生成HEX文件

    到此LED的程序完成。 stm32仿真以后有时间完成。

    二、一个51程序设计和仿真

    在keil5上重新建一个工程选上C51芯片

    创建文本输入代码

    #include<reg51.h> #include<intrins.h> char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极字模 unsigned char yi,er,san,si; //yi,er为东西数码管两位,san,si为南北 unsigned char dxtime,nbtime; //东西倒计时,南北倒计时? unsigned char deng; //led红绿灯 void display1(unsigned char yi,er); //函数声明 void display2(unsigned char san,si); void led(); void Delay100us(); void Timer0Init(void); void main() //主函数 { Timer0Init(); //调用中断函数 dxtime=30;nbtime=25; //初始化东西倒计时,南北倒计时 deng=0X1E; //初始化交通灯 while(1) { display1(yi,er); //调用东西数码管显示函数 display2(san,si); //调用南北数码管显示函数 led(); //调用交通灯函数 } } void Timer0Init(void) //定时器50ms { TMOD = 0x01; //选择定时方式一 TH0 =(65536-50000)/256;// 0x15; TL0 = (65536-50000)%256;//0x9f; TF0 = 0; TR0 = 1; EA=1; //开中断总允许 ET0=1; } unsigned char cnt = 0;//定义计数变量 int flag=1; //标致位 void time0()interrupt 1 //定时中断一 { TH0 =(65536-50000)/256;// 高八位0x15;(写入计数初值) TL0 = (65536-50000)%256;//第八位0x9f; cnt++; //计数加一 if(cnt==20) //计数到二十,50ms×20=1s,数码管显示时间减一 {dxtime--; nbtime--; cnt=0; //计数复位 } if(flag) //flag=1,东西为绿灯(南北先是红灯,再是黄灯) { if(nbtime==0) //红灯时间计完 { nbtime=5;deng=0x2e;} //黄灯开始计时 if(dxtime==0) //黄灯和绿灯倒计时到0 { dxtime=25;nbtime=30; //东西倒计时赋值为25,南北绿灯赋值为30 deng=0x33; //东西红灯亮,南北绿灯亮 flag=1-flag; //flag由1变0 } } else //flag=0,东南北为绿灯(东西先是红灯,再是黄灯) { if(dxtime==0) //红灯时间计完 { dxtime=5;deng=0x35;} //黄灯开始计时 if(nbtime==0) //黄灯和绿灯倒计时到0 { dxtime=30;nbtime=25; //东西倒计时赋值为25,南北绿灯赋值为30 deng=0x1E; //南北红灯亮,东西绿灯亮 flag=1-flag; //flag由0变1 } } } void display1(unsigned char yi,er) //东西数码管 { yi=dxtime/10;er=dxtime%10; //十位,个位 P1=0XFE;P0=tab[yi]; //通过P1选中十位,从P0写入 Delay100us(); //延时 P1=0XFD;P0=tab[er]; //通过P1选中个位,从P0写入 Delay100us(); } void display2(unsigned char san,si) //南北数码管同理 { san=nbtime/10;si=nbtime%10; P1=0XFB;P2=tab[san]; Delay100us(); P1=0XF7;P2=tab[si]; Delay100us(); } void led() //LED显示 { P3=deng; //通过P3 } void Delay100us() //延时函数 { unsigned char i, j; _nop_(); _nop_(); i = 2; j = 15; do { while (--j); } while (--i); }

    保存.c文件并进行编译

    编译后执行生成HEX文件

    建立proteus工程进行仿真

    建立新工程

    找出原器件并连线

    将HEX文件代入C51芯片并进行仿真

    进行仿真

    小结:

    通过这次作业我对stm32有了更多的了解,对proteus仿真更加熟练。

    Processed: 0.016, SQL: 8