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
}
}
}