叮咚 产生的方式

仿真

程序代码
#include<reg51.h>
sbit key=P3^4;
sbit beep=P1^5;
#define CRYSTAL_FREQ 12000000
#define INTERRUPT_PERIOD_0 4000
#define uchar unsigned char
#define uint unsigned int
uchar ding,dong,start,stop;
uint flag;
//
//
void delayms(uchar x)
{
int i,j;
for(i=x;i>0;i--)
for(j=0;j<120;j++);
}
//
//
void Canshu_Init()
{
ding=0;
dong=0;
start=0;
stop=0;
flag=0;
}
//
//
void Interrupt_Init()
{
TMOD = 0x01;
TH0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD_0) / 256;
TL0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD_0) % 256;
ET0 = 1;
EA = 1;
}
//
//
void main()
{
Canshu_Init();
Interrupt_Init();
while(1)
{
if(key==0)
{
delayms(5);
if(key==0)
{
TR0 = 1;//timer0 start
while(stop);
}
}
}
}
//
//
void Timer0() interrupt 1
{
TH0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD_0) / 256;
TL0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD_0) % 256;
flag++;
if(flag==2000)//0.5s get
{
flag=0;
if(start==0)
{
start=~start;
}
else
{
start=0;
stop=~stop;
TR0=0;
}
}
if(start==0)
{
ding++;
if(ding==3)
{
ding=0;
beep=~beep;
}
}
else
{
dong++;
if(dong==4)
{
dong=0;
beep=~beep;
}
}
}