|
放假焊了一個倒計時器。設想,倒計時時間結束后蜂鳴器鳴響。但是實際上蜂鳴器壓根沒動靜。但是單獨使用時蜂鳴器聲音很大。困惑了一天了。
使用的STC11F02E和74HC595搭建的。數碼管是0.36共陰,晶振使用12MHz的,電容是22PF的,蜂鳴器是5V無源的。
電路原理圖如下:
index3.jpg (503.69 KB, 下載次數: 27)
下載附件
這是手繪的電路圖
2019-2-2 12:07 上傳
制作出來的實物圖如下:
index1.jpg (129.11 KB, 下載次數: 26)
下載附件
這是正面
2019-2-2 12:07 上傳
放一下單片機代碼。
#include <stc11f02e.h>
#include <intrins.h>
sbit BEE = P3^7;
sbit ADDR3 = P1^0;
sbit ADDR2 = P1^1;
sbit ADDR1 = P1^2;
sbit ADDR4 = P1^3;
sbit KEY0 = P3^2;
sbit KEY1 = P3^3;
sbit P_HC595_SER = P1^4; //串行數據輸入
sbit OE = P1^5; //輸出允許控制
sbit P_HC595_RCLK = P1^6; //三態輸出鎖存器的時鐘輸入
sbit P_HC595_SRCLK = P1^7; //移位寄存器的時鐘輸入
unsigned char code t_display[] = {0x05,0x7d,0x46,0x54,0x3c,0x94,0x84,0x5d,0x04,0x14};
unsigned char LED4[4];
unsigned char display_index = 0; //位選指示標志
unsigned int Time_User; //預設時間
unsigned char cnt = 0; //1s指示標志
bit B_P; //蜂鳴器指示
void Init_System(); //初始化函數
void Send_595(unsigned char dat);
void DisplayScan(void);
void Delay_1ms(void);
void Delay_10ms(void);
void Buzzer(void); //蜂鳴器函數
void main(void)
{
Init_System();
while(1)
{
while(B_P==1)
{
Buzzer();
}
LED4[0] = ~(t_display[Time_User/60/10]);
LED4[1] = ~(t_display[Time_User/60%10]&0xfb);
LED4[2] = ~(t_display[Time_User%60/10]);
LED4[3] = ~(t_display[Time_User%60%10]);
DisplayScan();
}
}
void Init_System()
{
TMOD = 0x01;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
ET0 = 1;
TR0 = 0;
EX0 = 1;
IT0 = 1;
EX1 = 1;
IT1 = 1;
EA = 1;
OE = 0;
B_P=0;
Time_User=180;
}
void Send_595(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(dat & 0x80) P_HC595_SER = 1;
else P_HC595_SER = 0;
P_HC595_SRCLK = 1;
P_HC595_SRCLK = 0;
dat = dat<<1;
}
}
void DisplayScan(void)
{
switch(display_index)
{
case(0):ADDR1=0;ADDR2=1;ADDR3=1;ADDR4=1;Send_595(LED4[0]);display_index++;break;
case(1):ADDR1=1;ADDR2=0;ADDR3=1;ADDR4=1;Send_595(LED4[1]);display_index++;break;
case(2):ADDR1=1;ADDR2=1;ADDR3=0;ADDR4=1;Send_595(LED4[2]);display_index++;break;
case(3):ADDR1=1;ADDR2=1;ADDR3=1;ADDR4=0;Send_595(LED4[3]);display_index=0;break;
default:break;
}
P_HC595_RCLK=0;
_nop_();
_nop_();
P_HC595_RCLK=1;
Delay_1ms();
}
void timer0(void) interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
cnt++;
if(cnt==20)
{
cnt = 0;
Time_User--;
}
if(Time_User==0)
{
B_P=1;
TR0=0;
}
}
void exint0(void) interrupt 0
{
if(KEY0==0)
{
Delay_10ms();
if(KEY0==0)
{
if(Time_User==0) TR0=0;
else
{
TR0=!TR0;
}
B_P=0;
}
while(!KEY0);
}
}
void exint1(void) interrupt 2
{
if(KEY1==0)
{
Delay_10ms();
if(KEY1==0)
{
TR0=0;
Time_User+=15;
if(Time_User==3600) Time_User=0;
B_P=0;
}
while(!KEY1);
}
}
void Delay_1ms(void)
{
unsigned char i,j;
_nop_();
_nop_();
i = 12;
j = 168;
do
{
while(--j);
}while(--i);
}
void Delay_10ms(void)
{
unsigned char i,j;
_nop_();
_nop_();
i=117;
j=183;
do
{
while(--j);
}while(--i);
}
void buzzer(void)
{
BEE = 0;
Delay_1ms();
BEE = 1;
Delay_1ms();
}
放一下圖片
|
|