单片机C语言编程问题

我编写的程序
题目是这样的

由上位机发送1给单片机时,蜂鸣器以400ms频率发声,发2时以200ms频率发声,发3时以100ms频率发声,发4时关闲蜂鸣器。

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag,temp=0;
sbit beep=P3^6;//蜂鸣器引脚,低电平有效
//初始化
void init()
{
TMOD=0X20;
SCON=0X50;
TR1=1;
TH1=TL1=0XFD;
ES=1;
EA=1;
}
//一毫秒延时
void delay(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<115;j++);
}
}
//发送回PC
void send(uchar dat)
{
SBUF=dat;
while(!TI); //等待发送完成
TI=0; //把发送标志位置零
}
//蜂鸣器
void beep0(uchar z)
{
while(1)
{
beep=0;
delay(z);
beep=1;
delay(z);
}
}
//判断从PC向单片机发送的数值
void p()
{
if(temp==1)
beep0(200);
else if(temp==2)
beep0(100);
else if(temp==3)
beep0(50);
else if(temp==4)
beep=1;
}

//主函数
void main()
{
init(); //初始化
while(1)
{
p();
}
}

//串口接收中断函数
void ser() interrupt 4
{
if(RI==1)
{
RI=0;
temp=SBUF;
send (temp);//返回PC显示
}
}

现在出现的问题是:我向单片机发送1,蜂鸣器工作,然后分别发送2,3,4而单片机没有反应,还是按照发送1工作。

第1个回答  2015-08-12
蜂鸣器以400ms频率发声,以200ms频率发声。。。
----
这是不可能的。
频率单位,是 Hz,不是 ms。

任何人,都作不到《以400ms频率发声》。

出题人,基本概念,他都不清楚。
这样的题目,就别琢磨了。
----------------
如果说,400ms 是周期,还像回事。

但是,这时的频率,是 2.5Hz,人,是听不见的。
----------------
如果楼主,自己规定几个合理的频率,
编写一个程序,还不难。

http://zhidao.baidu.com/question/465662388.html
http://zhidao.baidu.com/question/135695899.html

可以参考。
第2个回答  2011-06-20
改成下面的试试,我觉得send函数放在中断里不是很好,你可以单步调试一下,或者是设置个断点的看一下,SBUF的值主要的是没有变。
void send(uchar dat)
{
while(!TI); //等待发送完成
SBUF=dat;
TI=0; //把发送标志位置零
}
第3个回答  2011-06-21
你的程序用了两个while(1),发现没有。当temp没有值时循环执行p(),当temp=1时就会beep0(),跳不出来了。再发送也没用了。本回答被提问者采纳
第4个回答  2011-06-20
你那个 if(temp==1)
beep0(200);
else if(temp==2)
beep0(100);
else if(temp==3)
beep0(50);
else if(temp==4)
beep=1;
怎么都没叫{}啊?
你加上括号试试、
if(temp==1)

beep0(200);
}
else
{ if(temp==2)

beep0(100);

else
{ if(temp==3)
beep0(50);

else
{ if(temp==4)
beep=1;
追问

我用的是if ......else if ......语句

追答

知道啊、、一个if语句后面如果你用了一个分号,就表明这个if语句完了,
if(temp==1)
{
beep0(200);
}
else
{
if(temp==2)
{
beep0(100);
}
else
{
if(temp==3)
{
beep0(50);
}
else
{
if(temp==4)
{
beep=1;
}
}
}
}

追问

还是不行,应该不是这的问题吧?

第5个回答  2011-06-23
void beep0(uchar z)
{
while(1)
{
beep=0;
delay(z);
beep=1;
delay(z);
}
}
程序死在这儿了。

请问单片机的C语言怎么编写啊?
单片机C语言编译错误:requires ANSI-style prototype,是编译过程错误造成的,解决方法如下:1、编程前保存文件,单击文件菜单,下拉菜单中选择保存按钮。2、输入文件名,文件类型选择为.c类型。3、然后开编辑,首先,定义头文件,头文件一般为stdio.h。4、接着,定义主函数,主函数名为main。5、然后,...

c55单片机中,独立按键用C语言编程,
在c55单片机中,独立按键的C语言编程需要考虑去抖动的问题。下面是一个简单的去抖动函数示例:void delay(int t) \/\/延迟 { int i;while(t--)for(i=0;i<125;i++);} void key() \/\/k1要接哪个引脚记得在开头定义一下 { if(k1==0)\/\/按下按键 { delay(5); \/\/去抖 if(k1==0)\/\/确...

c语言编程单片机难吗
总的来说,虽然c语言编程单片机可能需要一些时间来学习和掌握,但只要具备一定的思维能力和实践精神,这个过程并不难。随着时间的推移,你将能够更加熟练地使用C语言进行单片机编程。

单片机C语言编译错误:requires ANSI-style prototype
requires ANSI-style prototype的意思是:需要ANSI样式原型。

单片机C语言 键盘编程问题 做的 关于密码锁 数码管显示 希望解答 大侠...
在密码锁项目中,通过单片机C语言实现键盘编程,数码管显示功能,需要解决的关键问题在于如何高效且清晰地处理按键输入和响应。这里,我们将重点讨论如何在代码中组织按键处理逻辑。首先,将获取按键键值的逻辑集成到一个名为keyscan()的函数中,确保此函数仅负责从键盘接收并处理按键输入。在主程序中,我们...

关于单片机C语言的问题
1:你的示例中没有中断服务程序;2:中断发生后,如果当时没有其它同级或更高级的中断服务程序在执行,会马上停在正在执行的主程序,并记住这个位置,然后进入中断函数(当然CPU还要做些必要的处理,如压栈等操作);3:中断函数完后,程序会返回当初停止的那个位置,继续往下执行;4:示例中,当程序开始...

单片机C语言按键控制LED编程3个问题 *(自学菜鸟)
sbit K3 = P0^2;void main (void){ while(1) { switch(P0&0x07) { case 0x06:P2=0xAA;break; case 0x05:P2=0X55;break; case 0x03:P2=0x00;break; default :P2=0xff;break; } }}

单片机编程(C语言)问题
你可以尝试将num从0累加到255再看看什么情况,include <stdio.h>#include <string.h>void main(){unsigned char num=0;int index=0;for(index=0;index<300;index++){printf("%3d ",num);if(num % 15==0){putchar('\\n');}num++;}} ...

单片机c语言编程定义和声明问题
定义和声明的语句不影响程序的运行 单片机上电就找main执行 而定义和声明的语句是给编译软件用的

单片机C语言问题
首先:u8其实为 define u8 unsigned char \/\/用u8代替unsigned char(无符号8位二进制数)其次 KEY_Scan 为函数名;接下来 (u8 mode) 为参数;所以,该程序为一个函数

相似回答