久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 991|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品亚洲一区二区三区在线观看 | 精品国产乱码久久久久久蜜臀 | 欧美精品91爱爱 | 成人在线免费观看av | 女女爱爱视频 | 国产精品色av | 成人免费网站 | 人人玩人人添人人澡欧美 | 黄色国产在线视频 | 中文字幕1区 | av日日操| 中文字幕一区二区三区乱码在线 | 久久99国产精一区二区三区 | 成人在线观看中文字幕 | 黄色网址av | 色中文在线 | 欧美综合久久久 | 国产精品污www一区二区三区 | 人操人人| 亚洲三级在线观看 | 亚洲精品68久久久一区 | 暖暖成人免费视频 | 红桃视频一区二区三区免费 | 久久999| 成人免费视频网站在线看 | 日韩欧美日韩在线 | 欧美三区视频 | 国产精品高潮呻吟久久av黑人 | 国产一区二区三区免费 | 国产精品久久久久无码av | 国产精品久久国产愉拍 | 久久亚洲一区二区 | 亚洲一区二区三区在线免费观看 | 精品视频久久久 | 在线视频91 | 国产伦精品一区二区三区在线 | 99热精品久久 | 成人网在线看 | aaaaaa大片免费看最大的 | 久久综合伊人 | 国产观看|