找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 439|回复: 2
打印 上一主题 下一主题
收起左侧

只有单片机程序没有电路,求能正确实现下列程序的电路图

[复制链接]
跳转到指定楼层
楼主
ID:1081533 发表于 2023-6-2 20:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
#include <REG52.H>
#include <INTRINS.H>
#define LED_DIGITS_NUM 3 //LED数码管位数
#define LED_MAX_VALUE 999 //LED最大值
//定义按键引脚和按键状态
sbit ADD_BUTTON = P2^0; //加号按钮
sbit SUB_BUTTON = P2^1; //减号按钮
unsigned char add_button_state = 0; //加号按钮状态(按下为1,未按下为0)
unsigned char sub_button_state = 0; //减号按钮状态(按下为1,未按下为0)
//定义LED显示引脚和显示状态
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
unsigned char led1_state = 0;
unsigned char led2_state = 0;
unsigned char led3_state = 0;
//定义声音报警引脚和闪烁引脚
sbit BUZZER = P3^1; //声音报警引脚
sbit BLINK = P3^0; //闪烁引脚
//定义计数器和报警标志
unsigned int counter = 0; //计数器
unsigned int alarm_value = 0; //报警值
unsigned int alarm_triggered = 0; //报警触发标志(已触发为1,未触发为0)
unsigned int alarm_confirm = 0; //报警确认标志(已确认为1,未确认为0)
unsigned int alarm_delay = 0; //报警延时计数器
void init_timer0() //初始化定时器0
{
TMOD &= 0xF0; //清零定时器0模式和计数值
TMOD |= 0x01; //设置定时器0为16位自动重装模式
TH0 = 0xFC; //定时器0初值为65536-50000=15536,计数1s(12MHz晶振)
TL0 = 0x00;
TR0 = 1; //启动定时器0
ET0 = 1; //开启定时器0中断
EA = 1; //开启总中断
}
void display_led() //LED数码管显示
{
unsigned char digits[LED_DIGITS_NUM]; //定义每位数字
digits[0] = alarm_value / 100; //百位数
digits[1] = (alarm_value % 100) / 10; //十位数
digits[2] = alarm_value % 10; //个位数
if(alarm_value > LED_MAX_VALUE) //超过最大值则显示“Err”
{
led1_state = 0; led2_state = 0; led3_state = 1; //标志位赋值
//...
}
else
{
led1_state = 1; led2_state = 1; led3_state = 1; //标志位赋值
LED1 = digits[0]; //显示百位数
_nop_(); _nop_(); _nop_(); _nop_(); //短暂延时
LED2 = digits[1]; //显示十位数
_nop_(); _nop_(); _nop_(); _nop_();
LED3 = digits[2]; //显示个位数
_nop_(); _nop_(); _nop_(); _nop_();
}
}
void buzzer_alarm() //声音报警
{
static unsigned char buzzer_state = 0; //静态变量,用于表示声音报警状态
static unsigned char delay_counter = 0; //报警延时计数器
if(!alarm_triggered) return; //未触发报警则退出
if(alarm_confirm) //已确认报警,关闭声音报警
{
BUZZER = 0; //关闭声音报警
delay_counter = 0; //计数器清零
buzzer_state = 0; //标志位清零
alarm_triggered = 0; //报警触发标志清零
alarm_confirm = 0; //报警确认标志清零
}
else if(delay_counter < 1000 && alarm_delay > 0) //延时中,不响报警但闪烁提示
{
delay_counter++; //计数器自加
BLINK = (delay_counter % 20 < 10) ? 1 : 0; //0.5Hz闪烁
}
else //正常报警
{
delay_counter++; //计数器自加
if(delay_counter % 50 < 25) //高频低频交替声音
{
buzzer_state = !buzzer_state; //状态反转
BUZZER = buzzer_state;
}
}
}
void main()
{
init_timer0(); //初始化定时器0
while(1)
{
display_led(); //LED数码管显示
buzzer_alarm(); //声音报警
if(alarm_triggered && alarm_delay == 0) //报警触发且无延时,仅清除标志位
{
alarm_triggered = 0; //报警触发标志清零
}
//检测加号、减号按钮状态,设定报警值
if(ADD_BUTTON == 0 && !add_button_state) //加号按钮按下
{
add_button_state = 1; //标志位赋值
alarm_value++; //报警值自加
if(alarm_confirm) //已确认报警,清除报警
{
alarm_confirm = 0; //报警确认标志清零
counter = 0; //计数器清零
}
}
else if(ADD_BUTTON == 1 && add_button_state) //加号按钮松开
{
add_button_state = 0; //标志位清零
}
else if(SUB_BUTTON == 0 && !sub_button_state) //减号按钮按下
{
sub_button_state = 1; //标志位赋值
if(alarm_value > 0) alarm_value--; //报警值自减
if(alarm_confirm) //已确认报警,清除报警
{
alarm_confirm = 0; //报警确认标志清零
counter = 0; //计数器清零
}
}
else if(SUB_BUTTON == 1 && sub_button_state) //减号按钮松开
{
sub_button_state = 0; //标志位清零
}
}
}
void T0_isr() interrupt 1 //定时器0中断服务程序
{
TH0 = 0xFC; //重新赋初值
TL0 = 0x00;
counter++; //计数器自加
if(counter > LED_MAX_VALUE) //超出最大值,触发报警并延时30s
{
alarm_triggered = 1; //报警触发标志赋值
alarm_delay = 30000; //延时30s
BLINK = 1; //闪烁引脚置位
BUZZER = 1; //声音报警引脚置位
counter = 0; //计数器清零
}
else if(counter >= alarm_value && alarm_value > 0) //达到报警值,触发报警并延时30s
{
alarm_triggered = 1; //报警触发标志赋值
alarm_delay = 30000; //延时30s
BLINK = 1; //闪烁引脚置位
BUZZER = 1; //声音报警引脚置位
}
if(alarm_delay > 0) alarm_delay--; //延时计数器自减
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2023-6-2 23:11 | 只看该作者
你确定程序是正确的吗?
前面定义LED1 LED2 LED3为位
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
程序中控制LED1 LED2 LED3为字节数据,这样能控制数码管显示出数字吗?
LED1 = digits[0]; //显示百位数
LED2 = digits[1]; //显示十位数
LED3 = digits[2]; //显示个位数
回复

使用道具 举报

板凳
ID:789121 发表于 2023-6-13 16:26 | 只看该作者
设置倒计时报警?数码管显示部分好像确实有问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表