DebugLab 发表于 2025-3-26 11:47:01

新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!

——新手问题汇总——

初始化先打开EAXFR:
代码:
P_SW2|=0x80;(8位、32位)
EAXFR=1;(32位)
因传统8051的SFR地址空间有限,新增的SFR位于xdata区域(XSFR),必须先打开EAXFR才能访问
XSFR和XDATA共用地址,只有访问62.5K以上的XDATA时才需要关闭EAXFR
现有型号,只要不是扩展了片外64K SRAM(外接并口SRAM芯片),初始化时果断先打开EAXFR,并且不需要再关闭,不要犹豫!
数据手册:


头文件:


8G系列和更新的型号初始化必须先设置IO模式:
代码:
P0M0=0x00;      P0M1=0x00;
P1M0=0x00;      P1M1=0x00;
P2M0=0x00;      P2M1=0x00;
P3M0=0x00;      P3M1=0x00;
P4M0=0x00;      P4M1=0x00;
P5M0=0x00;      P5M1=0x00;
P6M0=0x00;      P6M1=0x00;
P7M0=0x00;      P7M1=0x00;
蓝色部分按需要设置,可以使用ISP软件上的IO配置工具
IO模式固定准双向:89C、90C
IO模式可设置,默认准双向:12C、11F、10F、15F、15W、8A、8F
IO模式可设置,默认高阻:8C、12H、8G、8H、32F、32G、8051U
IO默认高阻是防止上电瞬间“闪一下、响一声、动一下”的,初学者不要认为这是妨碍学习的设计



各种ISP下载问题:
建议使用官方下载工具,或使用官方开源方案自制下载器,不要使用第三方下载工具
官方下载工具及下载器方案免安装驱动(win10或以上),支持双串口同时下载通信仿真,自动断电上电,固件可更新,IO模式可设置
且TXD(S-RXD)不需要串二极管,冷启动断电期间IO强下拉确保可靠放电
如使用485下载等非要串二极管的应用场合,必须串低压降的肖特基二极管(压降0.2~0.3V),不能串普通硅二极管(压降0.6~0.7V),否则可能导致下载失败
官方下载工具及下载器方案有出厂预置常用频率的IRC参数,即使无外部晶振也能保证波特率精度高,可以满足动态调节IRC频率的要求
第三方下载工具一般为了节省成本无外部晶振,波特率误差较大,仅可满足串口通信要求(还是单串口不是双串口),不建议用于下载
还有需要安装驱动、无自动断电上电功能或自动断电上电功能不可靠、TXD推挽输出无法彻底放电等问题
动态调节IRC频率是根据串口波特率调节内部高频时钟频率的,除列表中的常用频率外,还可以自定义频率(手动输入)
如选择该选项,必须保证波特率精度高,否则会导致内部高频时钟频率误差大或下载失败
USB下载无法动态调节频率,只能使用内部预置频率

各种电源、基准、IO问题:
单片机任意脚都不能超过VCC、GND范围,否则外部信号会被钳位到电源轨正负一个PN结压降的范围,或电源轨漂移,甚至单片机被烧毁
如使用ADC,则VREF、AVCC、AGND一定不能悬空,否则ADC无法正常工作
VREF建议范围为2.4V~VCC,更低的电压会损失精度,mV级小信号必须外接低失调轨到轨运放放大,不能直接连接单片机的ADC
省电模式建议所有IO设置为高阻(外部电路是高阻输入且不允许开路的除外),并关闭数字输入(否则作为输入的IO在外部电平变化或处于临界状态时会产生额外功耗)
省电模式作为输出的IO,为了外部电路抗干扰,设置为高或低电平也可,状态需要与外部电平保持一致,电位相等才不会有漏电流
(如外接其他芯片,需要根据其他芯片内部有无上下拉电阻设置,如外部芯片的IO为高阻输入模式,IO建议设置为更不易被干扰的状态)
(如IO(推挽模式)直接驱动N-MOS,为了防止上电瞬间意外导通一下(初始化前IO高阻),一般G极会接个10K~100K的下拉电阻,这种情况如需要进入省电模式还希望N-MOS抗干扰,IO就要设置为低电平)
省电模式如需外部32768晶振正常工作,晶振两个IO需要设置为高阻并关闭数字输入

各种中断问题:
打开的中断必须要有中断函数,哪怕是空的也行,否则硬件产生中断后,PC LJMP到中断向量处,无中断程序也无RETI,程序直接跑飞,导致意外死机或复位
中断频率不能过高,也不能在中断函数内执行耗时操作
如中断函数执行时间占比大于100%,中断还没退出就再次请求中断,就会卡在中断里一直循环出不来,主程序和优先级更低或查询次序靠后的中断会被阻塞
注意中断重入和互锁问题,此类逻辑错误可能导致各种异常

各种时钟问题:
内部低频时钟(约32K)作为掉电唤醒定时器,出于低功耗考虑,无抗温飘压飘电路,精度较低,不能作为RTC时钟使用,RTC使用内部低频时钟仅供测试(看秒在走就是RTC正常工作),不要在实际运行时使用
外接晶振必须要先设置接晶振的IO口为高阻,然后打开晶振并等待频率稳定,否则用死循环等待时钟稳定会在这里卡死
内部高频时钟精度足够高,可以满足绝大多数应用场合,外部高频晶振易受干扰且对外电磁辐射大,无特殊要求没有理由使用外部高频晶振,支持追频的型号可外接32768晶振实时校准内部高频时钟

I2C问题:
注意7位地址还是8位地址,7位地址不含读写位,8位地址含读写位

触摸按键问题:
只有对应手指的位置才允许有大面积连接单片机IO口的导体用于感应手指,不要既放个焊盘又焊个弹簧(那么大个焊盘跟谁感应呢?跟GND感应呢还是吸收干扰呢?)
触摸弹簧底下放个LED中间要透光的,直的弹簧肯定不行,起码得用喇叭口的,装上面板后喇叭口被压成平面,大概要四五圈,还有不要使用PWM驱动LED,避免干扰


C语言、汇编语言、编译器、仿真问题:
包含startup.a51时,默认会初始化data(也是idata的低128字节)为0,xdata不操作为上电随机数;不包含startup.a51时,data和xdata为上电随机数
程序只能在函数内执行,全局变量禁止在声明时赋值,赋值的语句必须在函数内,函数外的非声明语句无效
数组可以在初始化时用memset函数全部清零(或其他初始化值)
养成好习惯,函数内的局部变量也不要声明时赋值,而且必须在函数开头声明
USB或UART仿真时,全速运行不能实时更新变量的值,因为USB或UART仿真是软件完成的,全速运行时CPU完全在执行用户程序,无法同时运行仿真程序,如此时运行仿真程序,就会影响用户程序的全速运行,所以不支持在全速运行时实时更新变量的值

——发帖须知——

提问:
希望得到准确的回复以解决问题,请提供具体分析所需的必要信息,包括原理图PDF和程序
原理图截图也可,请保证完整且清晰,不要使用手机拍屏幕
程序请提供可编辑的文本文件,不要截图或手机拍屏幕
受PCB设计影响较大的功能(如ADC和触摸按键)和可能存在生产、制造、结构、焊接等问题的,请提供PCB图或实物照片
其他需要提供的:单片机型号、版本、ISP软件版本、下载工具型号和版本、电源上下电波形、单片机供电电压电流、主时钟频率等硬件选项

学习打卡感悟:
每个人的学习打卡感悟请统一以回复的形式发到一个帖,不要发新帖,谢谢!

——全站导航链接和二维码——

官方网站:
https://www.stcai.com/


官方论坛:
https://www.stcaimcu.com/


微信小程序:


论坛使用教程:
如何 贴图 ?如何 上传视频 ?如何 论坛注册 ?
论坛上传视频或分享B站视频的方法介绍
论坛发帖 专业编辑器, Markdown 使用语法参考

其他新手必读:
一灯大师,I/O口控制: LED点灯, 三极管, MOS管, 光耦, 继电器
省电模式,I/O口如何设置才省电,进入主时钟停振/省电模式前

其他链接:
如何扫码网上小量购买 单片机/烧录器/开发工具

——欢迎网友补充——




vb2002 发表于 2025-3-27 00:30:47

P_SW2|=0x80;
从来没有关过,一直开着的

zhange 发表于 2025-3-27 07:05:20

学习了{:4_188:}

小涵子爸爸 发表于 2025-3-27 08:55:13

都是很有用的知识点

jwd 发表于 2025-3-27 09:08:56

有用

ZRF197210 发表于 2025-3-28 19:32:07

一直在学习,虽然年龄有点大

猫虎的 发表于 2025-3-29 08:03:41

看文案,像老姚的风格

zzcqyc 发表于 2025-3-29 09:18:47

都是新手容易犯的,或是说容易忽略错误,此贴帮助极大!

zzcqyc 发表于 2025-3-29 09:21:52

ZRF197210 发表于 2025-3-28 19:32
一直在学习,虽然年龄有点大

退休了!丰富退休生活,比打麻将强{:ciya:}

llyymm 发表于 2025-3-29 11:44:32

经验之笔,这里有些坑我是踩过了{:4_167:}
页: [1] 2 3
查看完整版本: 新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!