C语言铃声程序

来源:百度知道 编辑:UC知道 时间:2024/06/16 06:19:51
#include<reg51.h>
#define uchar unsigned char
sbit key=P1^7;
sbit sound=P1^0;
uchar flag;
int i;
void delay1()
{
uchar x,y;
for(x=2000;x>0;x--)
for(y=2000;y>0;y--);
}
void delay()
{
uchar x,y;
for(x=200;x>0;x--)
for(y=200;y>0;y--);
}
void init()
{
EA=1;
ET0=1;
TMOD=0X01;
TH0=(65536-700)/256;
TL0=(65536-700)% 256;
flag=0;
i=0;
}

main()
{
loop:init();
while(key);
delay();
while(key);
while(!key);
TR0=1;
delay();
while(1)

{

if((i==500) && (flag==0))
{

i=0;
flag++;
delay();
}
else if((i==500) && (flag==1))
{
i=0;
TR0=0;
flag=0;
delay();
}

// goto loop;

}
}

void t0_rpt() interrupt 1

不加goto,响一次的原因是你把定时器关了"TR0=0"。
加goto,你的程序就乱了。
另:你的程序结构有点乱,不好理解。你是不是想让单片机按键后重复响两个音?

如果你想实现的效果是按键响两个音停止,再按键再响的话你要改程序结构(个人看法)。你现在的程序不是那种经典的教科书式的结构,感觉很乱,个部分功能不明确。

程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key=P1^7;
sbit sound=P1^0;
uchar flag=0,i=0;

void delay(uint n){ //一般延时
while(--n);
}

void timer0(void) interrupt 1 using 1{
if(flag==0){
TH0=(65536-700)/256;
TL0=(65536-700)% 256;
i++;
sound=~sound;
}
if(flag==1){
TH0=(65536-1000)/256;
TL0=(65536-1000)% 256;
i++;
sound=~sound;
}
}

void main(){
TMOD=0x01;
TH0=(65536-700)/256;
TL0=(65536-700)% 256;
EA=1;
ET0=1;
while(1){
if(key==0){ //扫描按键
delay(200); //延时,防止键抖动影响
if(key==0){
TR0=1;
whil