你可以按照以下步骤编写STC8G1K08芯片的LED点亮和灭的时间控制程序:
设置芯片的时钟和计数器,以便实现时间控制。例如,可以使用定时器或延时函数来控制时间。
在主函数中编写程序,实现LED点亮和灭的时间控制。可以使用if语句或while语句来判断时间是否达到要求,然后控制LED灯的点亮和灭。
在main函数中添加延时函数,以实现上电后30秒后LED灯开始点亮的要求。
下面是一个简单的示例程序,仅供参考:
#include<reg52.h>
sbit LED=P1^0
void delay(unsigned int i)
{
while(i--)
}
void main()
{
unsigned int count=0 //计数器,用于实现30秒的延时
while(count<30000) //上电后30秒开始执行程序
{
delay(1000) //每次延时1秒
count+=1000
}
LED=1 //点亮LED
delay(3000) //LED持续3秒
LED=0 //灭掉LED
while(1) //芯片不工作
}
在上述程序中,使用了一个计数器来实现上电后30秒的延时,然后LED点亮并持续3秒后灭掉,最后芯片不工作。需要注意的是,示例程序仅供参考,具体实现方式需要根据实际情况进行调整和优化。
我的个天,不能让你家帮你作作业吧。给个框架和思路吧。LED二极管正极串一个限流电阻接在+5V电源上,负极接在MCU一个管脚上,如P20,如果灯不够亮,可以加个三极管放大电流。
程序思路:
main(void)
{
while(1)
{
延时
P20=~P20
//P20取反
点亮和熄灭LED
}
}
#include <REG51.H>#include <intrins.h>
#define U8 unsigned char
#define U16 unsigned int
void DelayMs(U8 ms)
void PWM_clock(U8 clock)
void PWM_start(U8 module,U8 mode)
////////////////////// 延时子程序/////////////////////////////
void DelayMs(U8 ms) //在11.0592M晶振下,stc10f系列(单周期指令)的ms级延时
{
U16 i
while(ms--)
{
for(i = 0i <850i++)
}
}
////////////////////主函数入口////////////////////////////
sfr CCON = 0xD8//PCA控制寄存器
sfr CMOD = 0xD9//PCA模式寄存器
sfr CCAPM0 = 0xDA//PCA模块0模式寄存器 //模块0对应P1.3/CEX0/PCA0/PWM0(STC12C5A60S2系列)
sfr CCAPM1 = 0xDB//PCA模块1模式寄存器 //模块1对应P1.4/CEX1/PCA1/PWM1(STC12C5A60S2系列)
sfr CL = 0xE9 //PCA 定时寄存器 低位
sfr CH = 0xF9//PCA 定时寄存器 高位
sfr CCAP0L = 0xEA//PCA模块0的 捕获寄存器 低位
sfr CCAP0H = 0xFA //PCA模块0的 捕获寄存器 高位
sfr CCAP1L = 0xEB//PCA模块1的 捕获寄存器 低位
sfr CCAP1H = 0xFB//PCA模块1的 捕获寄存器 高位
sfr PCA_PWM0 = 0xF2//PCA PWM 模式辅助寄存器0
sfr PCA_PWM1 = 0xF3//PCA PWM 模式辅助寄存器1
sbit CF = 0xDF//PCA计数溢出标志位
sbit CR = 0xDE//PCA计数器 运行控制位
sbit CCF1 = 0xD9//PCA模块1中断标志
sbit CCF0 = 0xD8//PCA模块0中断标志
//* CCAPOH = CCAPOL = 0XC0//模块0输出 占空因数为25%
//* CCAPOH = CCAPOL = 0X80//模块0输出 占空因数为50%
//* CCAPOH = CCAPOL = 0X40//模块0输出 占空因数为75%
void PWM_clock(U8 clock)
void PWM_start(U8 module,U8 mode)
void PWM_clock(U8 clock)
{
CMOD |= (clock<<1)
CL = 0x00
CH = 0x00
}
void PWM_start(U8 module,U8 mode)
{
CCAP0L = 0XE0
CCAP0H = 0XE0 //模块0初始输出 占空因数为75%
CCAP1L = 0XE4
CCAP1H = 0XE4 //模块1初始输出 占空因数为25%
if(module==0)
{
switch(mode)
{
case 0: CCAPM0 = 0X42break//模块0设置为8位PWM输出,无中断
case 1: CCAPM0 = 0X53break//模块0设置为8位PWM输出,下降沿产生中断
case 2: CCAPM0 = 0X63break//模块0设置为8位PWM输出,上升沿产生中断
case 3: CCAPM0 = 0X73break//模块0设置为8位PWM输出,跳变沿产生中断
default: break
}
}
else
if(module==1)
{
switch(mode)
{
case 0: CCAPM1 = 0X42break//模块1设置为8位PWM输出,无中断
case 1: CCAPM1 = 0X53break//模块1设置为8位PWM输出,下降沿产生中断
case 2: CCAPM1 = 0X63break//模块1设置为8位PWM输出,上升沿产生中断
case 3: CCAPM1 = 0X73break//模块1设置为8位PWM输出,跳变沿产生中断
default: break
}
}
else
if(module==2)
{
switch(mode)
{
case 0: CCAPM0 = CCAPM1 = 0X42break//模块0和1设置为8位PWM输出,无中断
case 1: CCAPM0 = CCAPM1 = 0X53break//模块0和1设置为8位PWM输出,下降沿产生中断
case 2: CCAPM0 = CCAPM1 = 0X63break//模块0和1设置为8位PWM输出,上升沿产生中断
case 3: CCAPM0 = CCAPM1 = 0X73break//模块0和1设置为8位PWM输出,跳变沿产生中断
default: break
}
}
CR=1//PCA计数器开始计数
}
void PCA_Intrrpt(void) interrupt 7
{
if(CCF0) CCF0=0
if(CCF1) CCF1=0 //软件清零
if(CF) CF=0 //软件清零
}
void main()
{
TMOD|=0x02/* timer 0 mode 2: 8-Bit reload */
TH0=0xAF
TR0=1
PWM_clock(2) // PCA/PWM时钟源为 定时器0的溢出
PWM_start(0,0)// 模块0,设置为PWM输出,无中断,初始占空因素为25%
while(1)
{
DelayMs(250)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)