本人单片机课程设计简易电子琴,可是仿真出来一直有错误,
#include <reg51.h>
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
unsigned char key;
sbit sound=P3^7;
unsigned int C;
unsigned int f;
#define dao 523
#define re 587
#define mi 659
#define fa 698
#define sao 784
#define la 880
#define xi 987
#define h_dao 1046
void delays20ms(void)
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
void delay()
{
unsigned char i,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++)
;
}
void Output_Sound(void)
{
C=(46083/f)*10;
TH0=(65536-C)/256;
TL0=(65536-C)%256;
TR0=1;
delay();
TR0=0;
sound=1;
key=0xff;
}
void main(void)
{
EA=1; //开总中断
ET0=1; //定时器T0中断允许
ET1=1; //定时器T1中断允许
TR1=1; //定时器T1启动,开始键盘扫描
TMOD=0x11; //分别使用定时器T1的模式1,T0的模式0
TH1=(65536-500)/256; //定时器T1的高8位赋初值
TL1=(65536-500)%256; //定时器T1的高8位赋初值
while(1) //无限循环
{
switch(key)
{
case 0:f=dao;
Output_Sound();
break;
case 1:f=re;
Output_Sound();
break;
case 2:f=mi;
Output_Sound();
break;
case 3:f=fa;
Output_Sound();
break;
case 4:f=sao;
Output_Sound();
break;
case 5:f=la;
Output_Sound();
break;
case 6:f=xi;
Output_Sound();
break;
case 7:f=h_dao;
Output_Sound();
break;
}
}
}
/**************************************************************
函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频方波
**************************************************************/
void Time0_serve(void ) interrupt 1 using 1
{
TH0=(65536-C)/256; //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(65536-C)%256; //可证明这是13位计数器TL0低5位的赋初值方法
sound=~sound; //将P3.7引脚取反,输出音频方波
}
/**************************************************************
函数功能:定时器T1的中断服务子程序,进行键盘扫描,判断键位
**************************************************************/
void time1_serve(void) interrupt 3 using 2 //定时器T1的中断编号为3,使用第2组寄存器
{
TR1=0; //关闭定时器T0
P1=0xff; //所有行线置为低电平“0”,所有列线置为高电平“1”
if((P1&0xff)!=0xff) //列线中有一位为低电平“0”,说明有键按下
{
//delays20ms(); //延时一段时间、软件消抖
if((P1&0xff)!=0xff) //确实有键按下
{
if(P10==0)
key=0;
else if(P11==0)
key=1;
else if(P12==0)
key=2;
else if(P13==0)
key=3;
else if(P14==0)
key=4;
else if(P15==0)
key=5;
else if(P16==0)
key=6;
else if(P17==0)
key=7;
}
}
TR1=1; //开启定时器T1
TH1=(65536-500)/256; //定时器T1的高8位赋初值
TL1=(65536-500)%256; //定时器T1的高8位赋初值
}
|