应拍乎搜该如下:
void main()
{
num = 0
P0 = 0xfe
wela = 1
wela = 0
// P3=0xff这一句,不要也行
while(1) {
P0 = table[num]
dula = 1
dula = 0
if(!key1) {
delay(5)
if(!key1) {
d1 = 0
while(!key1)
d1 = 1
num++
if(num == 10) num = 0
}
}
}
}
举例说明,当从PC发送第一个数据M时,i =1,则执行的是 if(i<100)中的命令。单片机向PC返回的数据分别是,SBUF=48+i/10 SBUF=48+i%10 SBUF=a 也就分别是,48 ,49 和M。 而串口调试助手 通常情况下是以 ASCII 码的形式显示数据, 48对应ASCII 码中的 0, 49对应1。所以让兆会有01M,02M。 你说一上电会自动输出01,应该是初始化 FLAG 时,没有设为0,虽然有系统桐滑凳会默认全局变量为局旅0,但也有意外,也就是说有可能上电时,FLAG就为1,所以才会自动发送01。个人愚见,稍作参考。
你好:
我刚刚用定义蜂鸣器的方式测试了一下,在屏蔽掉TI和ES之后,在printf之前写beep=0,蜂鸣器能响,但是我吧beep放在printf之后,蜂鸣器不响了。
这时因为在C51中调用printf函数,printf函数进而会调用putchar(),这就是关键所在,putchar会触发中断,所以要关闭串口中断ES,且如果不置位TI,从反汇编代码来看C:0521 JNB TI,C:0521,PC指针会一直在此判断TI,所以形成了死循环,而加上TI=1,PC判断就会跳过,所以printf函数就能正常工作了。
再说,屏蔽高姿喊掉ES和TI后,刚下载程序时册念串口还有数据,所以屏蔽之后下载进单片机第一次就触发了中断,进戚野入功能函数,又是调用puts之类的函数导致死循环,而复位后串口已没了数据,所以就能看似的正常工作,但只要一接收数据又是同样的死循环。
希望我的回答能帮助到你。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)