stem32 程式編譯和proteus模擬

Moon in the water發表於2020-10-08

基於keil、proteus軟體的程式編譯和模擬

stm32程式編譯

1.建立一個新的工程檔案

在這裡插入圖片描述
2.選擇晶片並設定
在這裡插入圖片描述
在這裡插入圖片描述
4.編譯程式
設定工程,勾選create hex file
在這裡插入圖片描述

程式如下所示:

include "public.h"	  //¹«¹²º¯ÊýÍ·Îļþ

int main()
{	
	LED_Init();		//LED¶Ë¿Ú¼°Ê±ÖÓ³õʼ»¯  
	while(1)
	{
		led_display(); //ledÏÔʾ			
	}	
}
#ifndef _public_H
#define _public_H

#include "stm32f10x.h"
#include "led.h"


#endif
#include "led.h"


void delay(u32 i)	  
{
	while(i--);
}

void LED_Init()	  //¶Ë¿Ú³õʼ»¯
{
	GPIO_InitTypeDef GPIO_InitStructure; //ÉùÃ÷Ò»¸ö½á¹¹Ìå±äÁ¿£¬ÓÃÀ´³õʼ»¯GPIO

	SystemInit();	//ʱÖÓ³õʼ»¯
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

	/*  ÅäÖÃGPIOµÄģʽºÍIO¿Ú */
	GPIO_InitStructure.GPIO_Pin=LED;  //Ñ¡ÔñÄãÒªÉèÖõÄIO¿Ú
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;	 //ÉèÖÃÍÆÍìÊä³öģʽ
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	  //ÉèÖô«ÊäËÙÂÊ
	GPIO_Init(GPIOC,&GPIO_InitStructure); 	   /* ³õʼ»¯GPIO */
}


void led_display()
{
	GPIO_SetBits(GPIOC,LED);
	delay(6000000);//ÑÓʱԼΪ1s
	GPIO_ResetBits(GPIOC,LED);
	delay(6000000);
}

編譯成功
在這裡插入圖片描述

proteus電路模擬

原始碼

/*************************
s1:Äϱ±   ºì     ¶«Î÷   ÂÌ
s2:Äϱ±   ºì     ¶«Î÷   »Æ    k1Çл»Ä£Ê½
s3:Äϱ±   ÂÌ     ¶«Î÷   ºì
s4:Äϱ±   »Æ     ¶«Î÷   ºì
*************************/
#include<reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;

#define count 50000
#define TH_0 (65536-count)/256
#define TL_0 (65536-count)%256

sbit ew_led_r=P3^0;
sbit ew_led_y=P3^1;
sbit ew_led_g=P3^2;

sbit ns_led_r=P3^3;
sbit ns_led_y=P3^4;
sbit ns_led_g=P3^5;

sbit bit_0=P2^0;
sbit bit_1=P2^1;

sbit k1=P2^2;
sbit k2=P2^3;
sbit k3=P2^4;
sbit k4=P2^5;

uchar code duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar sec=30;
uchar flag=1;
uchar temp=30;

void delay(uint iii)
{
	while(iii--);
}
void display()
{
	if(flag==1||flag==2)	//״̬1ºÍ״̬2£¬¶«Î÷±ÈÄϱ±ÉÙ2Ãë
	{
		bit_0=0;bit_1=1;
	
		P0=duanxuan[sec%10];
		delay(100);P0=0x00;
		if(sec>2)
		{
			P1=duanxuan[(sec-2)%10];
			delay(200);P1=0x00;
		}
		else
		{
			P1=duanxuan[sec%10];
			delay(200);P1=0x00;
		}
	
		bit_0=1;bit_1=0;
		
		P0=duanxuan[sec/10];
		delay(100);P0=0x00;
		if(sec>2)
		{
			P1=duanxuan[(sec-2)/10];
		    delay(200);P1=0x00;
		}
		else
		{
			P1=duanxuan[sec/10];
			delay(200);P1=0x00;
		} 
	}
	else if(flag==3||flag==4)//״̬3ºÍ״̬4£¬Äϱ±±È¶«Î÷ÉÙ2Ãë
	{
		bit_0=0;bit_1=1;
	
		P1=duanxuan[sec%10];
		delay(100);P1=0x00;
		if(sec>2)
		{
			P0=duanxuan[(sec-2)%10];
			delay(200);P0=0x00;
		}
		else
		{
			P0=duanxuan[sec%10];
			delay(200);P0=0x00;
		}
	
		bit_0=1;bit_1=0;
		
		P1=duanxuan[sec/10];
		delay(100);P1=0x00;
		if(sec>2)
		{
			P0=duanxuan[(sec-2)/10];
		    delay(200);P0=0x00;
		}
		else
		{
			P0=duanxuan[sec/10];
			delay(200);P0=0x00;
		} 	
	}
	else if(flag==6||flag==7||flag==8)	 //·¿ÚͨÐйÜÀí
	{
		bit_0=0;bit_1=1;

		P0=0x3f;
		delay(100);P0=0x00;
		P1=0x3f;
		delay(100);P1=0x00;

		bit_0=1;bit_1=0;

		P0=0x3f;
		delay(100);P0=0x00;
		P1=0x3f;
		delay(100);P1=0x00;
	}
}

void timer_init()
{
	TMOD=0x01;
	EA=1;ET0=1;TR0=1;
	TH0=TH_0;TL0=TL_0;
}
void led_display()
{
	if(flag==1)	//s1
	{
		ew_led_r=0;	
		ew_led_g=1;
		ew_led_y=1;

		ns_led_r=1;
		ns_led_g=0;
		ns_led_y=1;
	}
	else if(flag==2) //s2
	{
		ew_led_r=0;	
		ew_led_g=1;
		ew_led_y=1;

		ns_led_r=1;
		ns_led_g=1;
		ns_led_y=0;
	}
	else if(flag==3) //s3
	{
		ew_led_r=1;	
		ew_led_g=0;
		ew_led_y=1;

		ns_led_r=0;
		ns_led_g=1;
		ns_led_y=1;
	}
	else if(flag==4)	//s4
	{
		ew_led_r=1;	
		ew_led_g=1;
		ew_led_y=0;

		ns_led_r=0;
		ns_led_g=1;
		ns_led_y=1;
	}
	else if(flag==5)	 //»Øµ½s1
	{
		flag=1;//Ò»¹²Ëĸö״̬
	}
	else if(flag==6)
	{
		ew_led_r=1;	
		ew_led_g=1;
		ew_led_y=0;

		ns_led_r=1;
		ns_led_g=1;
		ns_led_y=0;
	}
	else if(flag==7)
	{
		ew_led_r=1;	
		ew_led_g=0;
		ew_led_y=1;

		ns_led_r=0;
		ns_led_g=1;
		ns_led_y=1;
	}
	else
	{
		ew_led_r=0;	
		ew_led_g=1;
		ew_led_y=1;

		ns_led_r=1;
		ns_led_g=0;
		ns_led_y=1;
	}
}
void key()
{
	static bit k=0;
	static uchar i=0;
	if(k==0&&k1==0)
	{
		delay(1000);
		if(k1==0)
		{
			k=1;
			i++;TR0=0;	
		}
	}
	if(TR0==0&&k==0&&k2==0&&sec<=60&&(flag==1||flag==2||flag==3||flag==4))
	{
		delay(1000);
		if(k2==0)
		{
			sec=sec+2;
			temp=sec;
			k=1;
		}
	}
	if(TR0==0&&k==0&&k3==0&&sec>=20&&(flag==1||flag==2||flag==3||flag==4))
	{
		delay(1000);
		if(k3==0)
		{
			sec=sec-2;
			temp=sec;
			k=1;	
		}
	}
	if(k==0&&k4==0&&(flag==1||flag==2||flag==3||flag==4))
	{
		delay(1000);
		if(k4==0)
		{
			TR0=~TR0;
			k=1;	
		}
	}
	if(k1==1&&k2==1&&k3==1&&k4==1)
	{
		delay(1000);
		if(k1==1&&k2==1&&k3==1&&k4==1)
		{
			k=0;
		}
	}
	if(i==1)
	{
		flag=6;
	}
	if(i==2)
	{
		flag=7;
	}
	if(i==3)
	{
		flag=8;
	}
	if(i==4)
	{
		flag=1;
		TR0=1; 
		i=0;
	}
}
void main()
{
	timer_init();
	while(1)
	{
		display();
		led_display();
		key();
	}
}

void timer0() interrupt 1
{
	static uchar jjj=0;
	TH0=TH_0;TL0=TL_0;
	if(++jjj==20)
	{
		jjj=0;
		sec--;
		if(sec==0)
		{
			sec=temp;
			flag++;//s3
		
		}		
		if(sec-2==0)
		{
			flag++;//s2	   s4
		}
	}
}

模擬電路
在這裡插入圖片描述

總結

keil設定的時候工程須要勾選生產hex檔案,這次的實驗讓我們學到了MDK5的編譯方式以及如何將模擬工程與程式相結合達到模擬的目的,讓我們能更直觀的看到自己設計的不足和成果。

相關文章