|
放假焊了一个倒计时器。设想,倒计时时间结束后蜂鸣器鸣响。但是实际上蜂鸣器压根没动静。但是单独使用时蜂鸣器声音很大。困惑了一天了。
使用的STC11F02E和74HC595搭建的。数码管是0.36共阴,晶振使用12MHz的,电容是22PF的,蜂鸣器是5V无源的。
电路原理图如下:
制作出来的实物图如下:
放一下单片机代码。
#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();
}
放一下图片
|
|