在单片机开发盒上,使用P1.0-P1.7接发光二极管D1D8,单片机 P0.0口接开关D8闪烁,闪烁周期为1S,松开K1
K1,P0.1接K2,编程实现长按K1时,
所有灯光D1
时,所有灯管熄灭;
当长按K2时,只有D1灯闪烁,闪烁周期400毫秒,其它灯都灭,同
时蜂鸣器报警。延时函数用定时器TO、工作方式1实现。
注:画电路原理图仿真时要有基本的晶振电路、复位电路以及上述功能所包含的电路,并
将相应的原理图、程序及演示视频放到指定的文件夹。


在单片机开发盒上,使用P1.0-P1.7接发光二极管D1D8,单片机 P0.0口接开关D8闪烁,闪烁周期为1S,松开K1
K1,P0.1接K2,编程实现长按K1时,
所有灯光D1
时,所有灯管熄灭;
当长按K2时,只有D1灯闪烁,闪烁周期400毫秒,其它灯都灭,同
时蜂鸣器报警。延时函数用定时器TO、工作方式1实现。
注:画电路原理图仿真时要有基本的晶振电路、复位电路以及上述功能所包含的电路,并
将相应的原理图、程序及演示视频放到指定的文件夹。


关注引自免费微信小程序:皆我百晓生
为了实现您描述的功能,我们可以按照以下步骤进行设计与编程:
根据您的描述,我们已经有了一个初步的电路设计图。这里,我会简化地描述电路连接方式,因为实际的电路图您已经提供了,不过看起来图1和图2是重复的,所以我们将基于图1进行讨论。
使用 Keil C51 编译器,我们编写如下代码:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar P1State = 0;
uchar D1State = 0;
void Delay(uint xms);
void Delay400ms();
void Timer0_Init();
void Timer0_ISR(void) interrupt 1 using 1;
void main()
{
TMOD = 0x01; // 定时器0 工作模式1
TH0 = TL0 = (65536 - 10000) / 256;
TR0 = 1; // 启动定时器0
EA = 1; // 开总中断
IT0 = 1; // 设置外部中断0为下降沿触发
EX0 = 1; // 开启外部中断0
while(1)
{
if(P1State)
{
P1 = ~P1State; // 如果P1State为1,则P1全部端口输出取反,即闪烁
}
else
{
P1 = 0xFF; // 全部端口输出高电平,灯灭
}
if(D1State)
{
P1 = 0xFE; // D1闪烁,其余灯灭
BUZ1 = !BUZ1; // 蜂鸣器报警
}
else
{
P1 = 0xFF; // 全部灯灭
BUZ1 = 0; // 蜂鸣器关闭
}
}
}
void Timer0_ISR()
{
static uchar cnt = 0;
if(cnt == 0)
{
P1State = !P1State; // 每隔1秒改变状态
}
else if(cnt == 2)
{
D1State = !D1State; // 每隔400ms改变状态
}
if(cnt < 4)
{
cnt++;
}
else
{
cnt = 0;
}
}
void Delay(uint xms)
{
uchar i,j;
for(i=0;i<xms;i++)
for(j=0;j<110;j++);
}
void Delay400ms()
{
Delay(400);
}
在 main 函数中,初始化定时器0为工作模式1,并设置定时时间为1ms。通过中断服务函数 Timer0_ISR 来控制灯的闪烁频率。
将编译好的代码下载到单片机中,使用示波器或逻辑分析仪检查各个IO口的状态变化,确保功能正常。
这样,您应该能够实现描述中的功能。如果有任何问题,欢迎继续提问。