/*-----------------------------------------------------
程序功能:LED 闪烁,用 Timer0 实现
闪烁速度变化依次为: 0.5次/秒 ,1次/秒,2次/秒
工作状态:每个速度维持时间为3秒
硬件引脚:P3_4
问题:为什么程序进不了for循环里面去?
现象:指示灯常量。
-------------------------------------------------------*/
#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 T0MODE1 0x01 // 0000 0001,Timer0工作在模式1 ,16位定时;
#define SET_T0X12_C 0x80 // or AUXR
#define CLR_T0X12_C 0x7F // 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; //工作状态计数
// 初始化硬件
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 中断
//初始化起始状态--亮
bWork_Disp=LIGHT; //点亮
bCur_DispStat=LIGHT; //记忆当前状态
uiDisp_Time_Val = LIGNT_HALF_C; //显示时间
uiDisp_Time_Cnt = uiDisp_Time_Val;
uiWorkStat_TimeCnt = 3000;
ucWorkStat_Cnt = 3;
g_1ms_flag=FALSE;
EA="TRUE"; //启动中断
while(1)
{
if(g_1ms_flag==TRUE)
{
g_1ms_flag=FALSE;
for(;ucWorkStat_Cnt>=0;ucWorkStat_Cnt--)
{
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 if(ucWorkStat_Cnt>1)
{
uiDisp_Time_Val = LIGHT_ONE_C;
uiWorkStat_TimeCnt = 3000;
}
else if(ucWorkStat_Cnt>0)
{
uiDisp_Time_Val = LIGHT_TWO_C;
uiWorkStat_TimeCnt = 3000;
}
}
}
}
}
/********************************************/
/* 定时器 0 中断服务 */
/* 说明: 1ms 中断一次, */
/********************************************/
void Timer0_Int(void) interrupt 1 using 1
{
TH0 = 0xF8;
TL0 = 0xCC;
g_1ms_flag = TRUE;
} <PIXTEL_MMI_EBOOK_2005>4 </PIXTEL_MMI_EBOOK_2005>
文章评论(0条评论)
登录后参与讨论