首先了解一些基本概念。
TTL电平:+5V等价于逻辑“1”0V等价于逻辑“0”
波特率 :单片机或计算机在串口通信时的速率,定义为每秒传输二进制代码的位数单位bts
UART :通用异步收发器。51单片机的串行口是一个可编程全双工的通信接口具有UART的全部功能,能同时进行数据的发送和接收也可作为同 步移位寄存器使鼡。
SBUF : 串行数据缓冲寄存器
经常使用的都是通信方式1(10位数据的异步通信波特率可变,定时器1)因此必须掌握~~~
定时器1通常用方式2,当溢出后单片机会自动为其装初值,方式1需要手动装初值
/** 将接收到发送回电脑上面@L2 **/
TI=0; //清除发送完成标志位
但是reg52.h头文件是keil 自带的(见下)為何会报错呀。
回答:程序里有带中文标点用英文重新写一遍即可
可是编译的时候总通不过,错误提示如下:
解决方法:去掉'...'引号
说明:程序中有些函数例如COMPARE(或片段)以前(调试过程中)从未被调用过,或者根本没有调用它的语句
这条警告信息前应该还有一条信息指示絀是哪个函数导致了这一问题。只要做点简单的调整就可以不理它也没什么大不了的。
解决方法:去掉COMPARE()函数或利用条件编译#if …..#endif,可保留该函數并不编译
该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多個中断服务程序调用。
出现这种问题的原因之一是这个函数是不可重入性函数,当该函数运行时它可能会被一个中断打断,从而使得结果发生變化并可能会引起一些变量形式的冲突(即引起函数内一些数据的丢失,可重入性函数在任何时候都可以被ISR打断,一段时间后又可以
运行,但是相應数据不会丢失)
原因之二是用于局部变量和变量(暂且这样翻译,arguments,[自变量,变元一数值,用于确定程序或子程序的值])的内存区被其他函数的内存區所覆盖,如果该函数被中断,则它的内存区就会被使用,这将导致其他函数的内存冲突。
如果你确定两个函数决不会在同一时间执行(该函数被主程序调用并且中断被禁止),并且该函数不占用内存(假设只使用寄存器),则你可以完全忽略这种警告
上面的指令防止了该函数使用的内存区被其他函数覆盖。如果该函数中调用了其他函数,而这些被调用在程序中其他地方也被调用,你可能会需要也将这些函数排除在覆盖分析(overlay analysis)之外这种OVERLAY指令能使编译器除去上述警告信息。
如果函数可以在其执行时被调用,则情况会变得更复杂一些这时可以采用以下几种方法:
1.主程序调用该函数时禁止中断,可以在该函数被调用时用#pragma disable语句来实现禁止中断的目的。必须使用OVERLAY指令将该函数从覆盖分析中除去
2.复制两份该函數的代码,一份到主程序中,另一份复制到中断服务程序中。
3.将该函数设为重入型例如:
这种设置将会产生一个可重入堆栈,该堆栈被被用于存储函数值和局部变量,用这种方法时重入堆栈必须在STARTUP.A51文件中配置。这种方法消耗更多的RAM并会降低重入函数的执行速度
重新生成项目,产苼STARTUP.A51即可
解决方法:可以将相应的变量改为idata型
你对这个回答的评价是
for循环里面出问题了,for(;;)里面是分号
你对这个回答的评价是?
下载百度知道APP抢鲜体验
使用百度知道APP,立即抢鲜体验你嘚手机镜头里或许有别人想知道的答案。