发布网友 发布时间:2022-04-23 01:34
共3个回答
热心网友 时间:2023-10-03 22:30
#include<reg51.h>
#define LEDData P0
unsigned char code LEDCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char time=99;
unsigned char second,count,count1; //秒,计数器
sbit LEDH = P2^6; //高位阴极
sbit LEDL = P2^7; //低位阴极
sbit buzzer = P2^5; //蜂鸣器
sbit Alam=P3^6;
bit Over = 0; //倒计时到0标志
void Delay5ms(void)
{
unsigned int i;
for(i=1000;i>0;i--);
}
void DisplayTime(void)
{
LEDData=LEDCode[second/10];
LEDH=0;
Delay5ms();
LEDH=1;
LEDData=LEDCode[second%10];
LEDL=0;
Delay5ms();
LEDL=1;
}
//******************************主函数*************************************************
void main(void)
{
TMOD=0x11; //两个8为计数器
TL0=0xb0; //两个8位定时计数器
TH0=0x3c; //两个8位定时计时器
TL1=0xb0; //作计数器
TH1=0x3c; //作寄存器
second=time;
EA=1; //总中断打开
ET0=1; //定时器0中断打开
ET1=1; //定时器1中断打开
TR0=0; //定时器0开关关闭
TR1=0; //定时器1开关关闭
EX0=1; //外部中断0开
IT0=1; //边沿触发
IT1=1; //边沿触发
EX1=1; //外部中断1开
PX0=1; //外部中断0为高优先级控制位
PX1=1; //外部中断1为高优先级控制位
PT0=0; //定时/ 计数器T0为低优先级中断
while(1)
{
DisplayTime();
if(Over){
buzzer();/延时一会儿buzzer();延时一会儿buzzer();延时一会儿
}
}
}
void PxInt0(void) interrupt 0
{
if(Over==1)
{
second=time;
Over=0;
TR1=0; //定时器1开关关闭
Alam=1;
TH1=0x3C; //作寄存器
TL1=0xB0; //作计时器
}
else
{
second=second;
}
TR0=1; //--------------开启计时器
}
void PxInt1(void) interrupt 2
{
TR0=0; //--------------关闭计时器
}
//*********************************中断服务函数**************************************
void time0_int(void) interrupt 1
{
TL0=0xb0; //计时器
TH0=0x3c; //寄存器
TR0=1; //开启计时器
count++;
if(count==20)
{
count=0;
second--;
if(second==0)
{
second=0;
Over=1;
TR0=0; //定时器0关闭
TR1=1; //定时器1打开
}
}
}
//*********************************中断服务函数**************************************
void time1_int(void) interrupt 3
{
TL1=0xb0; //计时器
TH1=0x3c; //寄存器
TR1=1; //定时器1打开
count1++;
if(count1==10)
{
count1=0;
Alam=~Alam;
buzzer();调用响一声函数
}
}
//*********************************响一声函数**************************************
void buzzer(void)
unsigned int b,c;
for(b=60;b>0;b--)
{ for(c=3;c>0;c--)
buzzer=!buzzer //将蜂鸣器控制端取反
}追问你的程序不行啊!编译时都错误
追答这个思路应该行得通,至于错误,你自己慢慢找找看,我没试,自己查错早晚要查,不可能每次都万无一失吧。祝你好运。
热心网友 时间:2023-10-03 22:31
要发声音,一般是用定时器确定某一频率发声,不用很准确。你可以度一下用几个频段的频率发声试下。
首先,定一个标志位,如果有这个标志位则发声,没有则不发声。
然后确定频率,确定定时器,定时中断后,检测到需要发声,则翻转脉冲。
按这思路去试下。追问你直接把程序发给我就行了嘛,我不是很理解你的话,我初学不久,是个新手。麻烦了~~~~
热心网友 时间:2023-10-03 22:31
……
count++;
if(count==20) {
count = 0;
……
楼主的程序,变量 count 是从 0,到 19。
可以在它小于 5 的时候,响一声。大于 5,停止响,这就是每秒一短声。
如果是小于 10 的时候响,能响半秒钟,这就是每秒一长声。
怎么响呢?在延时程序中,加入代码即可。
void Delay5ms(void)
{
unsigned int i, j;
for(i = 100; i > 0; i--) {
if (count < 10) {Alam = ~Alam; for(j = 0; j < 10; j++)} // j 控制音调
else {Alarm = 1; for(j = 0; j < 10; j++)}
}
}
你可以随时调用它,当 count < 10 时,它就会响。