多文件工程

beep.c

#include "beep.h"


void	Beep_Poll(void)		//我在main文件里面,被1ms调用一次,所以我里面的内容,也是每1ms执行一次,反复执行
{
	static	unsigned int timer=0;

	//这种不用delay等待
	//而用timer来看时间刻度来做动作的,这种机制,叫做轮询
	//轮询的意思,就是轮流不断的去询看timer这个变量,是否到达了我要的那个数字
	//到达了我才进行动作
	timer++;
	if(timer==2)
	{
		Beep_On();
	}
	else if(timer==4)
	{
		Beep_Off();
		timer=0;
	}
}

beep.h

#include "timer0.h"	   //把timer0.h文件包含进来
sbit BEEP = P1^5;
#define	Beep_On()	(BEEP=1)
#define	Beep_Off()	(BEEP=0)


void	Beep_Init(void);
void	Beep_Poll(void);

key.h

#include "timer0.h"

sbit	K1 = P3^1;
sbit	K2 = P3^0;
sbit	K3 = P3^2;
sbit	K4 = P3^3;

void	Key_Init(void);
uchar	Key_Scan(void);

key.c

#include "key.h"


void	Key_Init(void)	//按键函数
{
	K1=K2=K3=K4=1;
}


uchar	Key_Scan(void)	//我在main文件里面,被1ms调用一次,说明我里面的内容,也是1ms调用一次的
{
	static	uint timer=0; 	//静态变量
	if(K1==0)
	{
		timer++;
		if(timer==10){return(1);} 
	}
	else if(K2==0)
	{
		timer++;
		if(timer==10){return(2);} 			
	}
	else if(K3==0)
	{
		timer++;
		if(timer==10){return(3);} 			
	}
	else if(K4==0)
	{
		timer++;
		if(timer==10){return(4);} 			
	}
	else
	{
		timer=0;
	}
	return(0);
}

timer0.h

#include "reg51.h"		  //51头文件

#define	FOSC	12000000L		//晶振12M	   
#define	T1MS	(65536-FOSC/12/1000)  //定时1毫秒
#define uchar unsigned char 	 //定义无符号字符
#define	uint  unsigned int		 //定义无符号整形

void	Timer0_Init(void);	//调用定时器0函数

timer0.c

#include "timer0.h"	   //把timer0.h文件包含进来

uchar flag_1ms=0;		//定时器计数初值

void	Timer0_Init(void)  //定时器0函数
{
	TH0 = T1MS>>8; //赋初值
	TL0 = T1MS;	   //赋初值
	TMOD = 0x01;  //设置定时器0用十六位定时器方式
    EA = 1;			 //打开总中断
  	ET0 = 1;		 //打开定时器0中断
  	TR0 = 1;		 //启动定时器0	
}

void Timer0() interrupt 1		 //中断号1
{	
	TH0 = T1MS>>8; //赋初值
	TL0 = T1MS;	   //赋初值
	flag_1ms=1;		//每进来一次等于1
}

led.h

#include "timer0.h"	   //把timer0.h文件包含进来
#define LED P2		//led管脚
 void	Led_Init(void);
 void	Led_Move(void);

led.c

#include "led.h"	 //把led.h文件包含进来
#include "timer0.h"	   //把timer0.h文件包含进来
uchar data1=0xfe;

//led的初始化函数
void	Led_Init(void)
{

}

//led移位函数   
void	Led_Move(void)	
{	 	static	unsigned int timer=0;
    //static	uchar timer=0;
	LED = data1;
	//if(timer=0,timer<500,timer++)
	 //{
	 timer++;
	if(timer==500)
	{
    data1 = data1<<1|0x01;
	timer=0;	
	if(data1==0xff)
	{
	data1=0xfe;
	}
	}
   }
 

main.c

#include "led.h"
#include "timer0.h"
#include "key.h"
#include "Beep.h"

//程序的思想1:模拟多线程并行
//首先,初始化一个定时器,再从它那里,获得一个1ms标志,得意让我们的while里面的内容,每1ms执行一次
//其次,把所有的任务或者驱动的内容,分时轮询,每1ms都有不同的进度,千万不要用delay。


//程序的思想2:分层:任务和驱动
//任务,就是我们按开发要求,所总结的业务逻辑。所以我们把他写在main里面
//驱动,就是每个单一的硬件功能,例如定时器、led、数码管、蜂鸣器、按键
		//他们每一样都是一个单一的功能而已,所以我们要独立的把它写在自己的文件里面
		//例如定时器就写在timer0文件里面,led就写在led文件里面,蜂鸣器就写在beep文件里面
extern	uchar flag_1ms;	   //在其他模块中寻找其定义。另外,extern也可用来进行链接指定。

void main(void)			//程序的主函数
{
	uchar	key;
	Timer0_Init(); ////定时器0函数调用
	Key_Init();		 //按键函数调用
	Led_Init();		
	while(1)  			//大括号里面的东西,被不停的循环执行
	{
		//1ms进入一次
		if(flag_1ms==1)	//加了我之后,我的大括号里面的东西,被定期的1ms执行一次,反复执行	 	
		{
			flag_1ms=0;

			//线程1
			key = Key_Scan();			//我被每1ms调用一次,但执行一次我,只需要7us=0.007ms
			if(key==1){P2^=0xff;}//LED改变状态
			else if(key==2){P2=0xff;}
			else if(key==3){P2=0x0f;}
			else if(key==4){P2=0xfe;}

			//线程2
		 Led_Move();
		 Beep_Poll(); 				//我也被每1ms调用一次,但执行一次我,只需要5us=0.005ms
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值