【定时器】综合练习

            编程实现如下所有任务(同时):
            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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值