一个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)
#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);
}
}
将代码保存后把文件加入工程
打开项目点击目标选项
注意记得勾选生成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
;
unsigned char dxtime
,nbtime
;
unsigned char deng
;
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)
{
TMOD
= 0x01;
TH0
=(65536-50000)/256;
TL0
= (65536-50000)%256;
TF0
= 0;
TR0
= 1;
EA
=1;
ET0
=1;
}
unsigned char cnt
= 0;
int flag
=1;
void time0()interrupt
1
{
TH0
=(65536-50000)/256;
TL0
= (65536-50000)%256;
cnt
++;
if(cnt
==20)
{dxtime
--;
nbtime
--;
cnt
=0;
}
if(flag
)
{
if(nbtime
==0)
{ nbtime
=5;deng
=0x2e;}
if(dxtime
==0)
{
dxtime
=25;nbtime
=30;
deng
=0x33;
flag
=1-flag
;
}
}
else
{
if(dxtime
==0)
{ dxtime
=5;deng
=0x35;}
if(nbtime
==0)
{
dxtime
=30;nbtime
=25;
deng
=0x1E;
flag
=1-flag
;
}
}
}
void display1(unsigned char yi
,er
)
{
yi
=dxtime
/10;er
=dxtime
%10;
P1
=0XFE;P0
=tab
[yi
];
Delay100us();
P1
=0XFD;P0
=tab
[er
];
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()
{
P3
=deng
;
}
void Delay100us()
{
unsigned char i
, j
;
_nop_();
_nop_();
i
= 2;
j
= 15;
do
{
while (--j
);
} while (--i
);
}
保存.c文件并进行编译
编译后执行生成HEX文件
建立proteus工程进行仿真
建立新工程
找出原器件并连线
将HEX文件代入C51芯片并进行仿真
进行仿真
小结:
通过这次作业我对stm32有了更多的了解,对proteus仿真更加熟练。