郭天祥51学习,看下面的程序,例程给的,独立键盘按一下显示加一,感觉不太对,见我程序汉字,谢谢!

郭天祥51学习,看下面的程序,例程给的,独立键盘按一下显示加一,感觉不太对,见我程序汉字,谢谢!,第1张

原来的程序,逻袭历辑顷备,够滥的。

应拍乎搜该如下:

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之类的函数导致死循环,而复位后串口已没了数据,所以就能看似的正常工作,但只要一接收数据又是同样的死循环。

希望我的回答能帮助到你。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12436904.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存