/*-----------------------------------------------------
程序功能:LED 闪烁,用 Timer0 实现:
闪烁速度从 0.5次/秒 到 5次/秒,
再回到 0.5次/秒,变化的间隔数为10,每个速度维持时间为3秒,
硬件引脚:P3_4
存在问题:没想到怎么实现第二次及以后的定时器赋值
不会每个速度维持时间为3秒,所以只搭个框架
希望大家给予帮助,谢谢!
-------------------------------------------------------*/
#include <STC12C5410AD.h> /* STC12C5410AD 的头文件,为MCU中各个硬件寄存器定个名称,以便C语言中使用*/
sbit work_disp = P3^4; // 用主控显示的名称代替硬件
#define LIGHT 0 // 亮逻辑值
#define DARK 1 // 暗逻辑值
#define TRUE 1
#define FALSE 0
#define LIGHT_TWOs_C 2000 // 亮时间,
#define DARK_TWOs_C 2000 // 暗时间
#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 T0MODE2 0x02 // 0000 0010,Timer0工作在模式2 ,8 位自动重加载定时;
#define T0MODE3 0x03 // 0000 0011,Timer0工作在模式3
#define T0_TIMER 0x00 // Timer0 工作在定时器模式
#define T0_COUNTER 0x04 // Timer0 工作在计数器模式
#define T0_DISGATE 0x00 // Timer0 禁止INT0引脚控制
#define T0_ENGATE 0x08 // Timer0 允许INT0引脚控制
#define T1MODE0 0x00 // 0000 0000,Timer0工作在模式0 ,13位定时;
#define T1MODE1 0x10 // 0000 0001,Timer0工作在模式1 ,16位定时;
#define T1MODE2 0x20 // 0000 0010,Timer0工作在模式2 ,8 位自动重加载定时;
#define T1MODE3 0x30 // 0000 0011,Timer0工作在模式3
#define T1_TIMER 0x00 // Timer1 工作在定时器模式
#define T1_COUNTER 0x40 // Timer1 工作在计数器模式
#define T1_DISGATE 0x00 // Timer1 禁止INT1引脚控制
#define T1_ENGATE 0x80 // Timer1 允许INT1引脚控制
#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 EnINT0_C 0x01
#define EnT0_C 0x02
#define EnINT1_C 0x04
#define EnT1_C 0x08
#define EnUART_C 0x10
#define EnADCSPI_C 0x20
#define EnPCALVD_C 0x40
#define INT0_DOWN 0x01 // TCON 中对INT0中断信号的控制,下降沿触发;
#define INT0_LOW 0x00 // TCON 中对INT0中断信号的控制,低电平触发;
#define INT1_DOWN 0x04 // TCON 中对INT1中断信号的控制,下降沿触发;
#define INT1_LOW 0x00 // TCON 中对INT1中断信号的控制,低电平触发;
#define NOIP_C 0x00 /* 无优先级 */
#define INT0_HIGH 0x01 // IP 寄存器中的优先级设置,IPH暂不处理。
#define T0_HIGH 0x02
#define INT1_HIGH 0x04
#define T1_HIGH 0x08
#define UART_HIGH 0x10
#define ADCSPI_HIGH 0x20
#define PCALVD_HIGH 0x40
/*********** 主程序 *****************/
bit g_1ms_flag; // 1ms中断标志
void main(void)
{
unsigned int disp_time; //显示时间计数器
bit cur_disp; //记忆当前显示状态
// 初始化硬件
P3M0 = P3MODE0; // P3 口初始化
P3M1 = P3MODE1;
/* 初始化定时器 */
TMOD = T0MODE1; // Timer0 工作在模式1 ,16位定时
AUXR = AUXR&CLR_T0X12_C; // Timer0 工作在12分频
TCON="0"; //未使用外部中断,所以不用定义中断的触发方式
TH0 = TIME1msH_C;
TL0 = TIME1msH_C;
TR0 = TRUE;
//初始化中断
IE = EnT0_C; // 此处只允许 Timer0 中断
IPH = NOIP_C; // 此处不设优先级
IP = NOIP_C;
//初始化起始状态--亮
work_disp=LIGHT; //点亮
cur_disp=LIGHT; //记忆当前状态
disp_time=LIGHT_TWOs_C; //显示时间
g_1ms_flag=FALSE;
EA="TRUE"; //启动中断
while(1)
{
if(g_1ms_flag==TRUE)
{
g_1ms_flag=FALSE;
//0.5秒/次闪烁
disp_time--;
if(disp_time==0)
{
if(cur_disp==LIGHT)
{
work_disp = DARK; // 熄灭
cur_disp= DARK;
disp_time= DARK_TWOs_C;
}
else
{
work_disp = LIGHT; // 点亮
cur_disp= LIGHT;
disp_time= LIGHT_TWOs_C;
}
}
//1秒/次闪烁
disp_time--; //计时
if(disp_time==0)
{
if(cur_disp==LIGHT)
{
work_disp = DARK; // 熄灭
cur_disp= DARK;
disp_time= DARK_TWOs_C;
}
else
{
work_disp = LIGHT; // 点亮
cur_disp= LIGHT;
disp_time= LIGHT_TWOs_C;
}
}
//1.5秒/次闪烁
disp_time--;
if(disp_time==0)
{
if(cur_disp==LIGHT)
{
work_disp = DARK; // 熄灭
cur_disp= DARK;
disp_time= DARK_TWOs_C;
}
else
{
work_disp = LIGHT; // 点亮
cur_disp= LIGHT;
disp_time= LIGHT_TWOs_C;
}
}
//2秒/次闪烁
disp_time--;
if(disp_time==0)
{
if(cur_disp==LIGHT)
{
work_disp = DARK; // 熄灭
cur_disp= DARK;
disp_time= DARK_TWOs_C;
}
else
{
work_disp = LIGHT; // 点亮
cur_disp= LIGHT;
disp_time= LIGHT_TWOs_C;
}
}
//2.5秒/次闪烁
disp_time--;
if(disp_time==0)
{
if(cur_disp==LIGHT)
{
work_disp = DARK; // 熄灭
cur_disp= DARK;
disp_time= DARK_TWOs_C;
}
else
{
work_disp = LIGHT; // 点亮
cur_disp= LIGHT;
disp_time= LIGHT_TWOs_C;
}
}
//3秒/次闪烁
disp_time--;
if(disp_time==0)
{
if(cur_disp==LIGHT)
{
work_disp = DARK; // 熄灭
cur_disp= DARK;
disp_time= DARK_TWOs_C;
}
else
{
work_disp = LIGHT; // 点亮
cur_disp= LIGHT;
disp_time= LIGHT_TWOs_C;
}
}
//3.5秒/次闪烁
disp_time--;
if(disp_time==0)
{
if(cur_disp==LIGHT)
{
work_disp = DARK; // 熄灭
cur_disp= DARK;
disp_time= DARK_TWOs_C;
}
else
{
work_disp = LIGHT; // 点亮
cur_disp= LIGHT;
disp_time= LIGHT_TWOs_C;
}
}
//4秒/次闪烁
disp_time--;
if(disp_time==0)
{
if(cur_disp==LIGHT)
{
work_disp = DARK; // 熄灭
cur_disp= DARK;
disp_time= DARK_TWOs_C;
}
else
{
work_disp = LIGHT; // 点亮
cur_disp= LIGHT;
disp_time= LIGHT_TWOs_C;
}
}
//4.5秒/次闪烁
disp_time--;
if(disp_time==0)
{
if(cur_disp==LIGHT)
{
work_disp = DARK; // 熄灭
cur_disp= DARK;
disp_time= DARK_TWOs_C;
}
else
{
work_disp = LIGHT; // 点亮
cur_disp= LIGHT;
disp_time= LIGHT_TWOs_C;
}
}
//5秒/次闪烁
disp_time--;
if(disp_time==0)
{
if(cur_disp==LIGHT)
{
work_disp = DARK; // 熄灭
cur_disp= DARK;
disp_time= DARK_TWOs_C;
}
else
{
work_disp = LIGHT; // 点亮
cur_disp= LIGHT;
disp_time= LIGHT_TWOs_C;
}
}
}
}
}
/********************************************/
/* 定时器 0 中断服务 */
/* 说明: 1ms 中断一次, */
/********************************************/
void Timer0_Int(void) interrupt 1 using 1
{
TH0 = TIME1msH_C;
TL0 = TIME1msL_C;
g_1ms_flag = TRUE;
} <PIXTEL_MMI_EBOOK_2005>2 </PIXTEL_MMI_EBOOK_2005>
文章评论(0条评论)
登录后参与讨论