c8051f330单片机 要控制一个小灯 编程要它亮灭 怎么接啊
答案:2 悬赏:10 手机版
解决时间 2021-01-21 11:45
- 提问者网友:嘚啵嘚啵
- 2021-01-21 07:23
c8051f330单片机 要控制一个小灯 编程要它亮灭 怎么接啊
最佳答案
- 五星知识达人网友:旧脸谱
- 2021-01-21 08:54
给你一个定时器2实现小灯亮灭的程序。
接法为:把一个电阻(1K以下,100欧以上)接在P1.3端口上,电阻的另一端接发光二极管的正极,发光二极管的负极接地即可。不知道是所说的灯是什么灯,如果是电压高的,还需要通过继电器或者是三极管做转换。
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include // SFR declarations
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F33x
//-----------------------------------------------------------------------------
sfr16 TMR2RL = 0xca; // Timer2 reload value
sfr16 TMR2 = 0xcc; // Timer2 counter
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define SYSCLK 24500000 / 8 // SYSCLK frequency in Hz
sbit LED = P1^3; // LED灯的引脚
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer2_Init (int counts);
void Timer2_ISR (void);
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void) {
PCA0MD &= ~0x40; //关闭看门狗
SYSCLK_Init ();
PORT_Init ();
Timer2_Init (SYSCLK / 12 / 10); // 初始化定时器2为10Hz
EA = 1; // 使能全局中断
while (1)
{ // 循环
}
}
//系统初始化
void SYSCLK_Init (void)
{
OSCICN = 0x80; // 设置内部时钟
RSTSRC = 0x04; // 使能时钟失效检测
}
//初始化IO口
void PORT_Init (void)
{
XBR0 = 0x00;
XBR1 = 0x40; // 允许交叉开关
P1MDOUT |= 0x08; // LED灯的引脚推挽输出
}
//-----------------------------------------------------------------------------
//定时器2初始化,设置为16bit重新装载方式
void Timer2_Init (int counts)
{
TMR2CN = 0x00;
CKCON &= ~0x60;
TMR2RL = -counts; // Init reload values
TMR2 = 0xffff; // 设置重新装载的计数值
ET2 = 1; // 使能定时器2中断
TR2 = 1; // 启动定时器
}
//中断服务程序,当定时时间到达后,LED灯会亮或者是灭。
void Timer2_ISR (void) interrupt 5
{
TF2H = 0; // 清除中断标志
LED = ~LED; // 改变LED灯的状态
}
接法为:把一个电阻(1K以下,100欧以上)接在P1.3端口上,电阻的另一端接发光二极管的正极,发光二极管的负极接地即可。不知道是所说的灯是什么灯,如果是电压高的,还需要通过继电器或者是三极管做转换。
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F33x
//-----------------------------------------------------------------------------
sfr16 TMR2RL = 0xca; // Timer2 reload value
sfr16 TMR2 = 0xcc; // Timer2 counter
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define SYSCLK 24500000 / 8 // SYSCLK frequency in Hz
sbit LED = P1^3; // LED灯的引脚
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer2_Init (int counts);
void Timer2_ISR (void);
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void) {
PCA0MD &= ~0x40; //关闭看门狗
SYSCLK_Init ();
PORT_Init ();
Timer2_Init (SYSCLK / 12 / 10); // 初始化定时器2为10Hz
EA = 1; // 使能全局中断
while (1)
{ // 循环
}
}
//系统初始化
void SYSCLK_Init (void)
{
OSCICN = 0x80; // 设置内部时钟
RSTSRC = 0x04; // 使能时钟失效检测
}
//初始化IO口
void PORT_Init (void)
{
XBR0 = 0x00;
XBR1 = 0x40; // 允许交叉开关
P1MDOUT |= 0x08; // LED灯的引脚推挽输出
}
//-----------------------------------------------------------------------------
//定时器2初始化,设置为16bit重新装载方式
void Timer2_Init (int counts)
{
TMR2CN = 0x00;
CKCON &= ~0x60;
TMR2RL = -counts; // Init reload values
TMR2 = 0xffff; // 设置重新装载的计数值
ET2 = 1; // 使能定时器2中断
TR2 = 1; // 启动定时器
}
//中断服务程序,当定时时间到达后,LED灯会亮或者是灭。
void Timer2_ISR (void) interrupt 5
{
TF2H = 0; // 清除中断标志
LED = ~LED; // 改变LED灯的状态
}
全部回答
- 1楼网友:渡鹤影
- 2021-01-21 09:15
二级管串一个电阻,一边接电源,一边接单片机端口
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯