標(biāo)題: 只有單片機(jī)程序沒有電路,求能正確實(shí)現(xiàn)下列程序的電路圖 [打印本頁]

作者: edfdf    時(shí)間: 2023-6-2 20:53
標(biāo)題: 只有單片機(jī)程序沒有電路,求能正確實(shí)現(xiàn)下列程序的電路圖
單片機(jī)源程序如下:
#include <REG52.H>
#include <INTRINS.H>
#define LED_DIGITS_NUM 3 //LED數(shù)碼管位數(shù)
#define LED_MAX_VALUE 999 //LED最大值
//定義按鍵引腳和按鍵狀態(tài)
sbit ADD_BUTTON = P2^0; //加號(hào)按鈕
sbit SUB_BUTTON = P2^1; //減號(hào)按鈕
unsigned char add_button_state = 0; //加號(hào)按鈕狀態(tài)(按下為1,未按下為0)
unsigned char sub_button_state = 0; //減號(hào)按鈕狀態(tài)(按下為1,未按下為0)
//定義LED顯示引腳和顯示狀態(tài)
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;
//定義聲音報(bào)警引腳和閃爍引腳
sbit BUZZER = P3^1; //聲音報(bào)警引腳
sbit BLINK = P3^0; //閃爍引腳
//定義計(jì)數(shù)器和報(bào)警標(biāo)志
unsigned int counter = 0; //計(jì)數(shù)器
unsigned int alarm_value = 0; //報(bào)警值
unsigned int alarm_triggered = 0; //報(bào)警觸發(fā)標(biāo)志(已觸發(fā)為1,未觸發(fā)為0)
unsigned int alarm_confirm = 0; //報(bào)警確認(rèn)標(biāo)志(已確認(rèn)為1,未確認(rèn)為0)
unsigned int alarm_delay = 0; //報(bào)警延時(shí)計(jì)數(shù)器
void init_timer0() //初始化定時(shí)器0
{
TMOD &= 0xF0; //清零定時(shí)器0模式和計(jì)數(shù)值
TMOD |= 0x01; //設(shè)置定時(shí)器0為16位自動(dòng)重裝模式
TH0 = 0xFC; //定時(shí)器0初值為65536-50000=15536,計(jì)數(shù)1s(12MHz晶振)
TL0 = 0x00;
TR0 = 1; //啟動(dòng)定時(shí)器0
ET0 = 1; //開啟定時(shí)器0中斷
EA = 1; //開啟總中斷
}
void display_led() //LED數(shù)碼管顯示
{
unsigned char digits[LED_DIGITS_NUM]; //定義每位數(shù)字
digits[0] = alarm_value / 100; //百位數(shù)
digits[1] = (alarm_value % 100) / 10; //十位數(shù)
digits[2] = alarm_value % 10; //個(gè)位數(shù)
if(alarm_value > LED_MAX_VALUE) //超過最大值則顯示“Err”
{
led1_state = 0; led2_state = 0; led3_state = 1; //標(biāo)志位賦值
//...
}
else
{
led1_state = 1; led2_state = 1; led3_state = 1; //標(biāo)志位賦值
LED1 = digits[0]; //顯示百位數(shù)
_nop_(); _nop_(); _nop_(); _nop_(); //短暫延時(shí)
LED2 = digits[1]; //顯示十位數(shù)
_nop_(); _nop_(); _nop_(); _nop_();
LED3 = digits[2]; //顯示個(gè)位數(shù)
_nop_(); _nop_(); _nop_(); _nop_();
}
}
void buzzer_alarm() //聲音報(bào)警
{
static unsigned char buzzer_state = 0; //靜態(tài)變量,用于表示聲音報(bào)警狀態(tài)
static unsigned char delay_counter = 0; //報(bào)警延時(shí)計(jì)數(shù)器
if(!alarm_triggered) return; //未觸發(fā)報(bào)警則退出
if(alarm_confirm) //已確認(rèn)報(bào)警,關(guān)閉聲音報(bào)警
{
BUZZER = 0; //關(guān)閉聲音報(bào)警
delay_counter = 0; //計(jì)數(shù)器清零
buzzer_state = 0; //標(biāo)志位清零
alarm_triggered = 0; //報(bào)警觸發(fā)標(biāo)志清零
alarm_confirm = 0; //報(bào)警確認(rèn)標(biāo)志清零
}
else if(delay_counter < 1000 && alarm_delay > 0) //延時(shí)中,不響報(bào)警但閃爍提示
{
delay_counter++; //計(jì)數(shù)器自加
BLINK = (delay_counter % 20 < 10) ? 1 : 0; //0.5Hz閃爍
}
else //正常報(bào)警
{
delay_counter++; //計(jì)數(shù)器自加
if(delay_counter % 50 < 25) //高頻低頻交替聲音
{
buzzer_state = !buzzer_state; //狀態(tài)反轉(zhuǎn)
BUZZER = buzzer_state;
}
}
}
void main()
{
init_timer0(); //初始化定時(shí)器0
while(1)
{
display_led(); //LED數(shù)碼管顯示
buzzer_alarm(); //聲音報(bào)警
if(alarm_triggered && alarm_delay == 0) //報(bào)警觸發(fā)且無延時(shí),僅清除標(biāo)志位
{
alarm_triggered = 0; //報(bào)警觸發(fā)標(biāo)志清零
}
//檢測(cè)加號(hào)、減號(hào)按鈕狀態(tài),設(shè)定報(bào)警值
if(ADD_BUTTON == 0 && !add_button_state) //加號(hào)按鈕按下
{
add_button_state = 1; //標(biāo)志位賦值
alarm_value++; //報(bào)警值自加
if(alarm_confirm) //已確認(rèn)報(bào)警,清除報(bào)警
{
alarm_confirm = 0; //報(bào)警確認(rèn)標(biāo)志清零
counter = 0; //計(jì)數(shù)器清零
}
}
else if(ADD_BUTTON == 1 && add_button_state) //加號(hào)按鈕松開
{
add_button_state = 0; //標(biāo)志位清零
}
else if(SUB_BUTTON == 0 && !sub_button_state) //減號(hào)按鈕按下
{
sub_button_state = 1; //標(biāo)志位賦值
if(alarm_value > 0) alarm_value--; //報(bào)警值自減
if(alarm_confirm) //已確認(rèn)報(bào)警,清除報(bào)警
{
alarm_confirm = 0; //報(bào)警確認(rèn)標(biāo)志清零
counter = 0; //計(jì)數(shù)器清零
}
}
else if(SUB_BUTTON == 1 && sub_button_state) //減號(hào)按鈕松開
{
sub_button_state = 0; //標(biāo)志位清零
}
}
}
void T0_isr() interrupt 1 //定時(shí)器0中斷服務(wù)程序
{
TH0 = 0xFC; //重新賦初值
TL0 = 0x00;
counter++; //計(jì)數(shù)器自加
if(counter > LED_MAX_VALUE) //超出最大值,觸發(fā)報(bào)警并延時(shí)30s
{
alarm_triggered = 1; //報(bào)警觸發(fā)標(biāo)志賦值
alarm_delay = 30000; //延時(shí)30s
BLINK = 1; //閃爍引腳置位
BUZZER = 1; //聲音報(bào)警引腳置位
counter = 0; //計(jì)數(shù)器清零
}
else if(counter >= alarm_value && alarm_value > 0) //達(dá)到報(bào)警值,觸發(fā)報(bào)警并延時(shí)30s
{
alarm_triggered = 1; //報(bào)警觸發(fā)標(biāo)志賦值
alarm_delay = 30000; //延時(shí)30s
BLINK = 1; //閃爍引腳置位
BUZZER = 1; //聲音報(bào)警引腳置位
}
if(alarm_delay > 0) alarm_delay--; //延時(shí)計(jì)數(shù)器自減
}

作者: csmyldl    時(shí)間: 2023-6-2 23:11
你確定程序是正確的嗎?
前面定義LED1 LED2 LED3為位
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
程序中控制LED1 LED2 LED3為字節(jié)數(shù)據(jù),這樣能控制數(shù)碼管顯示出數(shù)字嗎?
LED1 = digits[0]; //顯示百位數(shù)
LED2 = digits[1]; //顯示十位數(shù)
LED3 = digits[2]; //顯示個(gè)位數(shù)
作者: 不要黑    時(shí)間: 2023-6-13 16:26
設(shè)置倒計(jì)時(shí)報(bào)警?數(shù)碼管顯示部分好像確實(shí)有問題




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1