本帖最后由 冷漠 于 2009-12-17 08:50 编辑
回65楼:做这样的实验显然不能用循环发送,应该只发送一次。像这样:
// while (1) {
SBUF = 'a';
SBUF = 'b';
SBUF = 'c';
while(1);
//}
还有:下面的写法,将得到不同的结果。(只有从不同的结果中才能发现更多的东西。)
while (1) {
TI=1; // 关闭发送中断条件下
SBUF = 'a';
SBUF = 'b';
SBUF = 'c';
TI=0;
while(1);
}
这正是中外教授的不同。中国的51教材上写的是“TI=1表示发送器空;通知CPU可以送入下一数据。”“TI必须软件清除为0。”
哈!为什么要软件清除?TI=0应该表示发送器不空(满),那么为什么硬件设计上不利用以发送器SBUF为目标的写脉冲(MOV SBUF, #DATA )自动清零TI,而要把这个完全可以自动实现的操作留给用户来软件控制实施?——谁都清楚:中外教材上写的很清楚:是MOV SBUF, #DATA 指令(写脉冲)启动了发送控制器发送开始。那么它同时自动清零TI不是很合理的设计吗?为何留给用户操作?(这里没考虑清除中断的作用。)
这就是中国教材上20年没有讲清楚的地方。
所以,可以展开想象:软件CLR TI; 是有控制作用的。而不仅仅是复位中断申请信号。
SETB TI ; // 关中断条件下
MOV SBUF,#DATA;
会发生什么? |