C51单片机中用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响100ms,500Hz信号响200ms,交替进行,P1.7接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。我是这样写的,不知道对不对,请大神指教?
#include<reg51.h>
sbit P1_0=P1^0;
sbit P1_7=P1^7;
void main(void)
{
for(; ;)
{
while(P1_7==0) //确认按键按下
{
IE=0X88;
TMOD=0X10;
TR1=1;
while(1);
}
}
}
void t1_isr() interrupt 2
{
uchair i;
for(i=0;i<2;i++)
{
P1_0=~P1_0;
TH1=0XFF;
TL1=0X0B; //1KHZ音频为f=1/T,为0.5ms
} //2次中断形成1KHZ方波
for(i=0;i<2;i++)
{
P1_0=~P1_0;
TH1=0XFC;
TL1=0X17; //500HZ音频为f=1/T,为1ms
} //2次中断形成500HZ方波
}
第19行是uchar,手误写错了
开两个计时器,计时器0用作定时中断,计数器1用作普通计数器用,用计数器1产生两个不同的频率。
定时器0中断用以判别100ms和200ms的时间隙,由于定时器中断需要在两个中断间隔时间间跳变,帮需要加一个标志位FLAG,当FLAG=0时让定时器0延时100MS中断,当FLAG=1时定时器0延时200MS中断。
假设p1.1外接按钮,对输出1khz和500hz进行切换。
#include
sbit wave = p1^0;
sbit k = p1^1;
#define fosc 12000000ul //晶振频率,可以自行修改
#define fint 1000 //定时器中断频率
bit switchflag;
void delayms(unsigned int x)
{
unsigned char t;
while(x--)
for(t=0;t<120;t++);
}
void main()
{
tmod&=0xf0;
tmod|=0x01;
th0=(65536-fosc/fint/12)/256;
tl0=(65536-fosc/fint/12)%256;
ie|=0x82;
tr0=1;
while(1)
{
if(!k)
{
delayms(10);
if(!k)
switchflag=!switchflag;
}
}
}
void t0_int() interrupt 1
{
static bit i;
th0=(65536-fosc/fint/12)/256;
tl0=(65536-fosc/fint/12)%256;
i=!i;
if(switchflag) {wave=!wave;}
else {wave=(i)?!wave:wave;}
}
扩展资料:
单片机也被称为单片微控器,属于一种集成式电路芯片。在单片机中主要包含CPU、只读存储器ROM和随机存储器RAM等,多样化数据采集与控制系统能够让单片机完成各项复杂的运算,无论是对运算符号进行控制,还是对系统下达运算指令都能通过单片机完成。
由此可见,单片机凭借着强大的数据处理技术和计算功能可以在智能电子设备中充分应用。简单地说,单片机就是一块芯片,这块芯片组成了一个系统,通过集成电路技术的应用,将数据运算与处理能力集成到芯片中,实现对数据的高速化处理。
参考资料来源:百度百科-单片机
在此基础上怎么改呢?正确的编程习惯和语序又是怎样的呢,我感觉还是很好理解的啊
追答其一for(; ;)是什么意思你懂不懂,你这样做面试大公司会有问题的,其二初始化和判断放在一起了,编程习惯差
粗略看中断应该没问题,你可以用电脑仿真试,问题出在while(1);死循环了报警不会停,不受控制
如果你不封装程序,建议你在段和段之间空开,加注释,代码长的必须封装.这是习惯
追问嗯嗯,我也是大二的,以后一定注意,谢谢指导!
本回答被提问者和网友采纳