初学stm32的简单编译与熟悉MDK的开发环境,以及proteus的简单仿真

    科技2025-06-20  14

    初学stm32的简单编译与熟悉MDK5的开发环境,以及proteus的简单仿真

    安装MDK5与stm32包,以及一个简单stm32程序的编译MDK5的下载与安装安装stm32包一个简单stm32程序的编译 proteus的设计和仿真(十字路口的交通灯)keil4的编译仿真与运行

    安装MDK5与stm32包,以及一个简单stm32程序的编译

    MDK5的下载与安装

    1.可到KEIL 的官网网址:https://www.keil.com/download/product/下载最新版本。 2.将上述下好的安装包打开(以管理员身份运行),出现以下界面,点击next 在以后的几步中继续点next,安装路径可以改成除系统盘以外的盘,但是注意,安装目录最好不要有中文。注册信息名字和一系列信息就可以了,等待一会,安装好后会弹出一个界面,点击安装。 安装好后,MDK5就差不多完成了,最后的自动更新页面可以不用管,直接关掉。

    安装stm32包

    MDK5器件支持包下载地址:http://www.keil.com/dd2/pack,可以去下载自己需要的包,下面以Keil.STM32F1xx_DFP.1.0.4.pack为列,选择好安装路径直接安装就可以了

    一个简单stm32程序的编译

    首先打开keil5,新建一个工程命名为test 依次选择STM321 Series --> STM32F103–>STM32F103,然后一直点ok就创建成功了。 新建两个组一个源文件,一个主函数。 然后新建一个文件名为main加入代码:

    #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); } } void SystemInit( void ) { }

    保存时以main.c名字保存。然后把他添加到main组中。 具体操作:右键main组,点击Add existing File to group “main” 选择刚保存的main.c文件 同理创建名为startup_stm32f10x_md.s的文件,把相关代码输入

    ;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** ;* File Name : startup_stm32f10x_md.s ;* Author : MCD Application Team ;* Version : V3.5.0 ;* Date : 11-March-2011 ;* Description : STM32F10x Medium Density Devices vector table for MDK-ARM ;* toolchain. ;* This module performs: ;* - Set the initial SP ;* - Set the initial PC == Reset_Handler ;* - Set the vector table entries with the exceptions ISR address ;* - Configure the clock system ;* - Branches to __main in the C library (which eventually ;* calls main()). ;* After Reset the CortexM3 processor is in Thread mode, ;* priority is Privileged, and the Stack is set to Main. ;* <<< Use Configuration Wizard in Context Menu >>> ;******************************************************************************* ; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS ; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. ; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, ; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE ; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING ; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. ;******************************************************************************* ; Amount of memory (in bytes) allocated for Stack ; Tailor this value to your application needs ; <h> Stack Configuration ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h> Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ; <h> Heap Configuration ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h> Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit PRESERVE8 THUMB ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; SysTick Handler ; External Interrupts DCD WWDG_IRQHandler ; Window Watchdog DCD PVD_IRQHandler ; PVD through EXTI Line detect DCD TAMPER_IRQHandler ; Tamper DCD RTC_IRQHandler ; RTC DCD FLASH_IRQHandler ; Flash DCD RCC_IRQHandler ; RCC DCD EXTI0_IRQHandler ; EXTI Line 0 DCD EXTI1_IRQHandler ; EXTI Line 1 DCD EXTI2_IRQHandler ; EXTI Line 2 DCD EXTI3_IRQHandler ; EXTI Line 3 DCD EXTI4_IRQHandler ; EXTI Line 4 DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 DCD ADC1_2_IRQHandler ; ADC1_2 DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 DCD CAN1_RX1_IRQHandler ; CAN1 RX1 DCD CAN1_SCE_IRQHandler ; CAN1 SCE DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 DCD TIM1_BRK_IRQHandler ; TIM1 Break DCD TIM1_UP_IRQHandler ; TIM1 Update DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare DCD TIM2_IRQHandler ; TIM2 DCD TIM3_IRQHandler ; TIM3 DCD TIM4_IRQHandler ; TIM4 DCD I2C1_EV_IRQHandler ; I2C1 Event DCD I2C1_ER_IRQHandler ; I2C1 Error DCD I2C2_EV_IRQHandler ; I2C2 Event DCD I2C2_ER_IRQHandler ; I2C2 Error DCD SPI1_IRQHandler ; SPI1 DCD SPI2_IRQHandler ; SPI2 DCD USART1_IRQHandler ; USART1 DCD USART2_IRQHandler ; USART2 DCD USART3_IRQHandler ; USART3 DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend __Vectors_End __Vectors_Size EQU __Vectors_End - __Vectors AREA |.text|, CODE, READONLY ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP ; Dummy Exception Handlers (infinite loops which can be modified) NMI_Handler PROC EXPORT NMI_Handler [WEAK] B . ENDP HardFault_Handler\ PROC EXPORT HardFault_Handler [WEAK] B . ENDP MemManage_Handler\ PROC EXPORT MemManage_Handler [WEAK] B . ENDP BusFault_Handler\ PROC EXPORT BusFault_Handler [WEAK] B . ENDP UsageFault_Handler\ PROC EXPORT UsageFault_Handler [WEAK] B . ENDP SVC_Handler PROC EXPORT SVC_Handler [WEAK] B . ENDP DebugMon_Handler\ PROC EXPORT DebugMon_Handler [WEAK] B . ENDP PendSV_Handler PROC EXPORT PendSV_Handler [WEAK] B . ENDP SysTick_Handler PROC EXPORT SysTick_Handler [WEAK] B . ENDP Default_Handler PROC EXPORT WWDG_IRQHandler [WEAK] EXPORT PVD_IRQHandler [WEAK] EXPORT TAMPER_IRQHandler [WEAK] EXPORT RTC_IRQHandler [WEAK] EXPORT FLASH_IRQHandler [WEAK] EXPORT RCC_IRQHandler [WEAK] EXPORT EXTI0_IRQHandler [WEAK] EXPORT EXTI1_IRQHandler [WEAK] EXPORT EXTI2_IRQHandler [WEAK] EXPORT EXTI3_IRQHandler [WEAK] EXPORT EXTI4_IRQHandler [WEAK] EXPORT DMA1_Channel1_IRQHandler [WEAK] EXPORT DMA1_Channel2_IRQHandler [WEAK] EXPORT DMA1_Channel3_IRQHandler [WEAK] EXPORT DMA1_Channel4_IRQHandler [WEAK] EXPORT DMA1_Channel5_IRQHandler [WEAK] EXPORT DMA1_Channel6_IRQHandler [WEAK] EXPORT DMA1_Channel7_IRQHandler [WEAK] EXPORT ADC1_2_IRQHandler [WEAK] EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] EXPORT CAN1_RX1_IRQHandler [WEAK] EXPORT CAN1_SCE_IRQHandler [WEAK] EXPORT EXTI9_5_IRQHandler [WEAK] EXPORT TIM1_BRK_IRQHandler [WEAK] EXPORT TIM1_UP_IRQHandler [WEAK] EXPORT TIM1_TRG_COM_IRQHandler [WEAK] EXPORT TIM1_CC_IRQHandler [WEAK] EXPORT TIM2_IRQHandler [WEAK] EXPORT TIM3_IRQHandler [WEAK] EXPORT TIM4_IRQHandler [WEAK] EXPORT I2C1_EV_IRQHandler [WEAK] EXPORT I2C1_ER_IRQHandler [WEAK] EXPORT I2C2_EV_IRQHandler [WEAK] EXPORT I2C2_ER_IRQHandler [WEAK] EXPORT SPI1_IRQHandler [WEAK] EXPORT SPI2_IRQHandler [WEAK] EXPORT USART1_IRQHandler [WEAK] EXPORT USART2_IRQHandler [WEAK] EXPORT USART3_IRQHandler [WEAK] EXPORT EXTI15_10_IRQHandler [WEAK] EXPORT RTCAlarm_IRQHandler [WEAK] EXPORT USBWakeUp_IRQHandler [WEAK] WWDG_IRQHandler PVD_IRQHandler TAMPER_IRQHandler RTC_IRQHandler FLASH_IRQHandler RCC_IRQHandler EXTI0_IRQHandler EXTI1_IRQHandler EXTI2_IRQHandler EXTI3_IRQHandler EXTI4_IRQHandler DMA1_Channel1_IRQHandler DMA1_Channel2_IRQHandler DMA1_Channel3_IRQHandler DMA1_Channel4_IRQHandler DMA1_Channel5_IRQHandler DMA1_Channel6_IRQHandler DMA1_Channel7_IRQHandler ADC1_2_IRQHandler USB_HP_CAN1_TX_IRQHandler USB_LP_CAN1_RX0_IRQHandler CAN1_RX1_IRQHandler CAN1_SCE_IRQHandler EXTI9_5_IRQHandler TIM1_BRK_IRQHandler TIM1_UP_IRQHandler TIM1_TRG_COM_IRQHandler TIM1_CC_IRQHandler TIM2_IRQHandler TIM3_IRQHandler TIM4_IRQHandler I2C1_EV_IRQHandler I2C1_ER_IRQHandler I2C2_EV_IRQHandler I2C2_ER_IRQHandler SPI1_IRQHandler SPI2_IRQHandler USART1_IRQHandler USART2_IRQHandler USART3_IRQHandler EXTI15_10_IRQHandler RTCAlarm_IRQHandler USBWakeUp_IRQHandler B . ENDP ALIGN ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR ALIGN ENDIF END ;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE*****

    注意:在添加进source组中时,文件类型改为.s的 当两个文件添加进组时,就可以运行编译了。

    proteus的设计和仿真(十字路口的交通灯)

    仿真图:

    keil4的编译

    与keil5同理创建工程名为test1,在创建时选择Atmel,然后选择51芯片。 把控制交通灯的C语言程序放入

    #include<reg51.H> #define uchar unsigned char #define uint unsigned int uchar code table[]={ //共阴极数码管码表 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71, 0xC9,0xFF,0x40};//设置码,测试码,不计时码 void delay(uint x);//延时函数 void display(uchar,uchar,uchar,uchar); //数码管显示函数 void mkeys(); //键盘函数 void traffic(); //交通灯函数 uchar num,num1,num2, //1南北 2东西 shi1,ge1,shi2,ge2, value1,value2,//南北 绿灯时间 黄灯时间 value3,value4,//东西 绿灯时间 黄灯时间 count1,count2,flag1,flag2; //南北标记 东西标记 void main() { TMOD=0x01; TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; /*初状态*/ value1=15; //南北 黄绿灯默认值 value2=5; value3=10; //东西 黄绿灯默认值 value4=5; num1=value1; //南北数码管先绿灯时间 num2=value2+value1;//东西红灯时间 shi1=num1/10; ge1=num1%10; shi2=num2/10; ge2=num2%10; P1=0x41;//初始状态:东西红灯 南北绿灯 20 15 while(1){ if(num==20) //定时器1s { num=0; num1--; num2--; traffic(); shi1=num1/10; ge1=num1%10; shi2=num2/10; ge2=num2%10; } mkeys(); display(shi1,ge1,shi2,ge2); } } void traffic() //红绿灯主控制程序 { if(num1==0){ count1++; if(count1==1){ P1=0x42;//东西红灯 南北黄灯 5 5 num1=value2; } if(count1==2){ num1=value3+value4;//东西绿灯 南北红灯 10 15 P1=0x14; } if(count1==3){ P1=0x41;// 东西黄灯 南北红灯 5 5 num1=value4; count1=0; } } if(num2==0){ count2++; if(count2==1){ //P1=0x14;//东西绿灯 南北红灯 num2=value3; } if(count2==2){ P1=0x24;//东西黄灯 南北红灯 num2=value4; } if(count2==3){ num2=value1+value2; //东西红灯 南北绿灯 num1=value1; count2=0; } } } void display(uchar shi1,uchar ge1,uchar shi2,uchar ge2) //数码管显示子函数 { uchar temp; temp=P2; P2=0xfe; P0=table[shi1]; delay(5); P2=0xfd; P0=table[ge1]; delay(5); P2=0xfb; P0=table[shi2]; delay(5); P2=0xf7; P0=table[ge2]; delay(5); } void delay(uint x)//延时子函数 { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void mkeys() //4*4矩阵键盘功能子函数 { uchar temp,key; P3=0xfe;//第一行线 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0){ temp=P3; switch(temp) { case 0xee: key=0; break; case 0xde: key=1; break; case 0xbe: key=2; break; case 0x7e: key=3; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } if(key==0) {//按键1:暂停 TR0=~TR0; //定时器取反 flag1=~flag1;//南北能够设置标志 0有效 flag2=~flag2;//东西能够设置标志 } if(key==1&&flag1==0){ //按键2:设置时间按钮 TR0=0; P1=0x44;//禁止东南西北车辆 全为红灯 可以设置 shi1=ge1=shi2=ge2=16; } if(key==2&&flag2==0){//按键3:设置完成 重启 TR0=1; num=0; //定时器 初始化 P1=0x41; //重新开始初状态 num1=value1; //南北数码管先绿灯时间 num2=value2+value1;//东西红灯时间 shi1=num1/10; ge1=num1%10; shi2=num2/10; ge2=num2%10; } if(key==3&&P1==0x44){ //按键4:测试交通灯各个设备的好坏 P1=0xff; delay(1000); P1=~P1; shi1=ge1=shi2=ge2=17; P1=0x44; } } } P3=0xfd;//第二行线 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0){ temp=P3; switch(temp) { case 0xed: key=0; break; case 0xdd: key=1; break; case 0xbd: key=2; break; case 0x7d: key=3; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } if(key==0&&P1==0x44){ //按键5:设置南北绿灯时间+ num1=value1; if(num2!=159){ //@@@@保证交通合理,红灯最大值计时159s,绿灯不再增加 num1++; value1=num1; } shi1=num1/10; ge1=num1%10; num2=value1+value2;//显示东西红灯时间 shi2=num2/10; ge2=num2%10; } if(key==1&&P1==0x44){ //按键6:设置南北黄灯时间+ num1=value2; if(num2!=159){ num1++; value2=num1; } shi1=num1/10; ge1=num1%10; num2=value1+value2;//显示东西红灯时间 shi2=num2/10; ge2=num2%10; } if(key==2&&P1==0x44&&value1>3){ //按键7:设置南北绿灯时间- @@@@保证交通合理,绿灯最小值计时3s,绿灯不再减少 num1=value1; num1--; value1=num1; shi1=num1/10; ge1=num1%10; num2=value1+value2;//显示东西红灯时间 shi2=num2/10; ge2=num2%10; } if(key==3&&P1==0x44&&value2>3){ //按键8:设置南北黄灯时间- num1=value2; num1--; value2=num1; shi1=num1/10; ge1=num1%10; num2=value1+value2;//显示东西红灯时间 shi2=num2/10; ge2=num2%10; } } } |||||||||||||||||| P3=0xfb;//第三行线 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0){ temp=P3; switch(temp) { case 0xeb: key=0; break; case 0xdb: key=1; break; case 0xbb: key=2; break; case 0x7b: key=3; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } if(key==0&&P1==0x44){ //按键9:设置东西绿灯时间+ num2=value3; if(num1!=159){ num2++; value3=num2; } shi2=num2/10; ge2=num2%10; num1=value3+value4;//显示南北红灯时间 shi1=num1/10; ge1=num1%10; } if(key==1&&P1==0x44){ //按键10:设置东西黄灯时间+ num2=value4; if(num1!=159){ num2++; value4=num2; } shi2=num2/10; ge2=num2%10; num1=value3+value4;//显示南北红灯时间 shi1=num1/10; ge1=num1%10; } if(key==2&&P1==0x44&&value3>3){ //按键11:设置东西绿灯时间- num2=value3; num2--; value3=num2; shi2=num2/10; ge2=num2%10; num1=value3+value4;//显示南北红灯时间 shi1=num1/10; ge1=num1%10; } if(key==3&&P1==0x44&&value4>3){ //按键12:设置东西黄灯时间- num2=value4; num2--; value4=num2; shi2=num2/10; ge2=num2%10; num1=value3+value4;//显示南北红灯时间 shi1=num1/10; ge1=num1%10; } } } P3=0xf7;//第四行线 2未用 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0){ temp=P3; switch(temp) { case 0xe7: key=0; break; case 0xd7: key=1; break; case 0xb7: key=2; break; case 0x77: key=3; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } if(key==0&&P1==0x44){ //按键13:南北紧急情况:南北绿灯常亮 东西红灯常亮 P1=0x41; shi1=ge1=shi2=ge2=18; } if(key==1&&P1==0x44){ //按键14:东西紧急情况:东西绿灯常亮 南北红灯常亮 P1=0x14; shi1=ge1=shi2=ge2=18; } if(key==2&&P1==0x44){//按键15: } if(key==3&&P1==0x44){//按键16: } } } } void T0_time() interrupt 1 //定时器T0 中断子程序 { TH0=(65536-45872)/256; TL0=(65536-45872)%256; num++; }

    此时右键target1,点出设置,选择output,把生成hex文件勾上。 此时就可以点击编译,系统会提示生成了hex文件。 可以看到creating hex file from 11。生成了一个名为11.hex的文件。 在proteus中双击51芯片,就可以添加生成的11.hex文件。

    仿真与运行

    按照原理图在proteus上依次连线

    Processed: 0.013, SQL: 8