编程实现如下所有任务(同时):
1. L1以0.5s间隔闪烁;(不能使用Delay)
2. 当L1闪烁5次后,继电器吸合;再次闪烁5次后继电器关闭;(改成蜂鸣器)
3. L4~L8以0.1s间隔流水灯;
4. 蜂鸣器一直处于关闭状态,且L2,L3一直处于熄灭状态
源码:
#include <STC15F2K60S2.H>
#include <system.h>
/*************************************************
File name: 【定时器】综合练习 @12MHz
Description:
编程实现如下所有任务(同时):
1. L1以0.5s间隔闪烁;(不能使用Delay)
2. 当L1闪烁5次后,继电器吸合;再次闪烁5次后继电器关闭;(改成蜂鸣器)
3. L4~L8以0.1s间隔流水灯;
4. 蜂鸣器一直处于关闭状态,且L2,L3一直处于熄灭状态。
*************************************************/
HexToBin led_ctrl,buzzer_ctrl;
u16 led_count1 = 0;
u16 led_count2 = 0;
u16 buzzer_count = 0;
void device_ctrl(unsigned char p2data,unsigned char p0data)
{
P0 = p0data;
P2 = p2data;
P2 = 0;
}
void vSystem_Init(void)
{
device_ctrl(0xa0,0); /* 关闭蜂鸣器、继电器*/
led_ctrl.hex=0xff;
device_ctrl(0x80,led_ctrl.hex); /* 关闭LED*/
}
void Timer2_Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x20; //设置定时初始值
T2H = 0xD1; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x04; //开定时器2中断
EA = 1; //开启总中断
}
u8 led_shift;
//led闪烁
void led_process()
{
// 1. L1以0.5s间隔闪烁
if(led_count1>=500) //500ms执行一次
{
led_count1=0;
led_ctrl.b.b0 = ~led_ctrl.b.b0;
device_ctrl(0x80,led_ctrl.hex);
}
// 3. L4~L8以0.1s间隔流水灯
if(led_count2>=100) //100ms执行一次
{
led_count2=0;
led_ctrl.b.b3 = ~(0x01>>led_shift);
led_ctrl.b.b4 = ~(0x02>>led_shift);
led_ctrl.b.b5 = ~(0x04>>led_shift);
led_ctrl.b.b6 = ~(0x08>>led_shift);
led_ctrl.b.b7 = ~(0x10>>led_shift);
device_ctrl(0x80,led_ctrl.hex);
led_shift = (led_shift + 1) % 5;
}
}
void buzzer_process()
{
if (buzzer_count == 2500)
{
buzzer_ctrl.b.b6 = 1;
device_ctrl(0xa0, buzzer_ctrl.hex);
}
if (buzzer_count == 5000)
{
buzzer_ctrl.b.b6 = 0;
buzzer_count = 0;
device_ctrl(0xa0, buzzer_ctrl.hex);
}
}
void
void main()
{
vSystem_Init();
Timer2_Init();
while(1)
{
}
}
void t2int() interrupt 12 //中断入口
{
led_count1++;
led_count2++;
buzzer_count++;
led_process();
buzzer_process();
}
头文件:
#ifndef __SYSTEM_H_
#define __SYSTEM_H_
#include <STC15F2K60S2.H>
typedef char s8;
typedef unsigned char u8;
typedef int s16;
typedef unsigned int u16;
typedef unsigned long u32;
/* 用typedef定义一个叫bits的结构体“数据类型”, 从而可以用 bits b; 定义b为结构体的“变量”*/
typedef struct
{
u8 b0 : 1;
unsigned char b1 : 1;
unsigned char b2 : 1;
unsigned char b3 : 1;
unsigned char b4 : 1;
unsigned char b5 : 1;
unsigned char b6 : 1;
unsigned char b7 : 1;
}bits;
/* 用typedef定义一个叫HexToBin的共用体“数据类型”, 从而可以用 HexToBin led_ctrl; 定义led_ctrl为共用体的“变量”*/
typedef union
{
unsigned char hex;
bits b;//通过改变结构体bits中的变量来进行位赋值
}HexToBin;
#endif