/*-----------------------------------------------------
程序功能:LED 闪烁,用 Timer0 实现
闪烁速度从 0.5次/秒 到4次/秒
工作状态:均分为8个状态,每个速度维持时间为3秒,
硬件引脚:P3_4
-------------------------------------------------------*/
#include <STC12C5410AD.h> /* STC12C5410AD 的头文件,为MCU中各个硬件寄存器定个名称,以便C语言中使用*/
sbit bWork_Disp = P3^4; // 用主控显示的名称代替硬件
#define LIGHT 0 // 亮逻辑值
#define DARK 1 // 暗逻辑值
#define TRUE 1
#define FALSE 0
#define LIGNT_HALF_C 1000 // 亮时间,
#define DARK_HALF_C 1000 // 暗时间
#define LIGHT_ONE_C 500 // 亮时间,
#define LIGHT_ONE_C 500 // 亮时间,
#define LIGHT_TWO_C 250 // 亮时间,
#define DARK_TWO_C 250 // 暗时间
#define P3MODE0 0x10 // 00010000,P3.4 设置为开漏输出,其余均为标准 51 口;
#define P3MODE1 0x10 // 00010000,
/* 定时器参数定义 */
#define T0MODE0 0x00 // 0000 0000,Timer0工作在模式0 ,13位定时;
#define T0MODE1 0x01 // 0000 0001,Timer0工作在模式1 ,16位定时;
#define SET_T0X12_C 0x80 // or AUXR
#define CLR_T0X12_C 0x7F // and AUXR
#define SET_T1X12_C 0x40 // or AUXR
#define CLR_T1X12_C 0xBF // and AUXR
#define TIME1ms_C 0xF8D0 /* 1ms 定时的加载值字节,对应 22.1184MHz 定时器12分频 */
#define TIME1msH_C 0xF8 /* 1ms 定时的加载值高字节 */
#define TIME1msL_C 0xD0 /* 1ms 定时的加载值低字节 */
/* 中断处理参数定义 */
#define EnT0_C 0x02
/*********** 主程序 *****************/
bit g_1ms_flag; // 1ms中断标志
void main(void)
{
unsigned int uiDisp_Time_Cnt; // 显示时间计数器
unsigned int uiDisp_Time_Val; // 每次闪烁时间值
bit bCur_DispStat; //记忆当前显示状态
unsigned int uiWorkStat_TimeCnt; // 每个显示状态计时
unsigned char ucWorkStat_Cnt; //工作状态计数
unsigned int a_uiDisp_Time_Val[16]={LIGNT_HALF_C,
LIGHT_ONE_C,LIGHT_ONEHALF_C,LIGHT_TWO_C,LIGHT_TWOHALF_C,
LIGHT_THR_C,
LIGHT_THRHALF_C,
LIGHT_FOUR_C,
LIGHT_FOUR_C,
LIGHT_THRHALF_C,
LIGHT_THR_C,
LIGHT_TWOHALF_C,
LIGHT_TWO_C,
LIGHT_ONEHALF_C,
LIGHT_ONE_C,
LIGNT_HALF_C};
// 初始化硬件
P3M0 = P3MODE0; // P3 口初始化
P3M1 = P3MODE1;
/* 初始化定时器 */
TMOD = T0MODE1; // Timer0 工作在模式1 ,16位定时
AUXR = AUXR&CLR_T0X12_C; // Timer0 工作在12分频
TCON=0; //未使用外部中断,所以不用定义中断的触发方式
TH0 = 0xF8; //
TL0 = 0xCC;
TR0 = TRUE;
//初始化中断
IE = EnT0_C; // 此处只允许 Timer0 中断
IPH = NOIP_C; // 此处不设优先级
IP = NOIP_C;
//初始化起始状态--亮
uiWorkStat_TimeCnt = 3000;
ucWorkStat_Cnt = 0;
bWork_Disp=LIGHT; //点亮
bCur_DispStat=LIGHT; //记忆当前状态
uiDisp_Time_Val = a_uiDisp_Time_Val[ucWorkStat_Cnt]; //显示时间
uiDisp_Time_Cnt = uiDisp_Time_Val;
g_1ms_flag=FALSE;
EA="TRUE"; //启动中断
while(1)
{
if(g_1ms_flag==TRUE)
{
g_1ms_flag=FALSE;
if(uiWorkStat_TimeCnt!=0)
{
uiWorkStat_TimeCnt--;
//0.5秒/次闪
uiDisp_Time_Cnt--;
if(uiDisp_Time_Cnt==0)
{
if(bCur_DispStat==LIGHT)
{
bWork_Disp = DARK; // 熄灭
bCur_DispStat= DARK;
uiDisp_Time_Cnt = uiDisp_Time_Val;
}
else
{
bWork_Disp = LIGHT; // 点亮
bCur_DispStat= LIGHT;
uiDisp_Time_Cnt = uiDisp_Time_Val;
}
}
}
else
{
ucWorkStat_Cnt++;
if(ucWorkStat_Cnt>=16)
{
ucWorkStat_Cnt=0;
}
uiDisp_Time_Val = a_uiDisp_Time_Val[ucWorkStat_Cnt];
uiWorkStat_TimeCnt = 3000;
}
}
}
}
/********************************************/
/* 定时器 0 中断服务 */
/* 说明: 1ms 中断一次, */
/********************************************/
void Timer0_Int(void) interrupt 1 using 1
{
TH0 = 0xF8;
TL0 = 0xCC;
g_1ms_flag = TRUE;
}
文章评论(0条评论)
登录后参与讨论