关于stc单片机做LED点亮和灭的时间控制程序问题?

关于stc单片机做LED点亮和灭的时间控制程序问题?,第1张

你可以按照以下步骤编写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)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7937993.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存