电子产业一站式赋能平台

PCB联盟网

搜索
查看: 2589|回复: 0
收起左侧

嵌入式视频教程全套_实际开发中单片机常见问题有哪些是高发的

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 2020-9-7 15:36:11 | 显示全部楼层 |阅读模式
嵌入式视频教程全套_实际开发中单片机常见问题有哪些是高发的,   

单片机常见问题

学习单片机开发的朋友越来越多,因为是初学往往在学习的过程中有看书的有看视频的学习方式五花八门,但是在实际的操作中却会出现各种各样的问题,今天我就把一下单片机常见问题给新手朋友总结一下。

① :有关晶振

单片机的晶振在内部可以简化成一个反向器。当晶振输入脚XI刚过坎压、被认为是1的一瞬间,输出脚XO就输出0,这个0会带动晶振使XI电压下降,当降低到坎压被认为是0的一瞬间,输出脚XO就输出1。这样周而复始。

因此,用示波器观察正常工作的晶振输入脚XI时,得到的是一个不高不低的近似水平线。而XO则是幅值很大的正弦波。测量晶振输入脚XI时,示波器表笔要打在X10档上,否则,表笔就能把晶振弄停。

因此布线时,晶振输入脚XI要尽量靠近晶振,而XO脚可稍远。同时XO具有一定的驱动能力,某些芯片可以用它驱动其它时序电路(不推荐这么做,因为系统可靠性下降)。

② 、用机械开关触发INT中断时:

由于机械开关会震动,产生的电压会有毛刺,这些毛刺会多次触发中断。会造成多次触发的因素有两点:

(1 )开关按下时的震动。第一次低电平到来时会进入中断处理程序,之后就算这些震动在中断处理程序执行的过程中产生,即使进入中断处理程序后关掉了总中断,这些毛刺仍然会使中断标志位置位,会在结束中断处理程序结束后再次马上触发中断处理程序。

(2 )开关释放时的震动。在第一次高电平到来时会退出中断处理程序,之后的毛刺会再次进入中断处理程序。

解决办法:

在中断处理程序的最后加一段低电平等待代码,等待低电平结束再延时5ms(为了消除开关释放时毛刺的干扰),5ms延时结束后再清除中断标志位(在中断处理程序执行的过程中可能已经再次触发了中断标志位)。代码如下:

void int0() interrupt 0

{

/*Do something*/

while(rollRA==0);//等待低电平结束

delay5(1);//等待按键释放的毛刺结束

IE0=0; //清除中断标志位,以防再次进入中断

}

  

③ :C51为什么要嵌套汇编

51单片机一个显著优点就是指令执行时间固定,因此可以适应时序要求严格的场合。例如符合ISO7816协议的cpu卡的读写,对时序要求比较严格。其实就是用io脚做出来的同步半双工串口。支持cpu卡的程序一般比较庞大,需要用c51来组织,但是由于c编译的不确定性,必须把底层程序封装成汇编语言模块嵌入到工程中。这就带来几个问题:如何声明函数、参数如何传递等。限于篇幅,不能说得很细。下面举例:

汇编程序单独保存一个文件,加入到工程中,函数如下:

_proc_a:

mov a, r7

inc a

mov r7, a

ret

用c语言在.h文件中声明: extern unsigned char proc_a(unsigned char val);

调用时形如: retvalue = proc_a(0x11);

说明:

a:汇编程序如果带参数,则需要在汇编程序前多加一个下划线。而声明它的地方不用加(伟福编译器这么要求的)。

b:函数的形参中第一参数用R7传递,函数返回值用R7返回,这是C51的通用规范。其他参数都有相应规定。函数可以返回一个位,用psw的c位返回。c:上面的语句,执行顺序是把0x11给R7,然后跳转子程序,子程序将它加1后送回。达内嵌入式视频百度网盘, 达内嵌入式视频百度云, 达内嵌入式视频教程, 达内嵌入式视频教程程序, 达内嵌入式视频教程下载, 达内嵌入式视频密码, 达内嵌入式视频破解, 达内嵌入式视频下载, 达内嵌入式视频有多少, 达内嵌入式系统视频教程, 达内嵌入式最新视频, 达内嵌入式最新视频100g, 达内嵌入式最新视频教程, 达内嵌入式最新视频下载, 达内视频嵌入式, 达内最新嵌入式视频, 达内最新嵌入式视频教程, 达内最新嵌入式视频下载, 大华

d:函数跳转到汇编程序时,本区的R0-R7,A,B,PSW,DPTR等寄存器可以供子程序使用,不必考虑调用后是否要恢复这些常规资源。上例中,A的值被函数使用了,编程者不必恢复调用前的值。

④ 、指向code区数组的指针也要加 code 关键字声明。

比如 unsigned char code arr[30]; 数组,要用指针指向它,要把指针也声明成 unsigned charcode*p;

后来使用发现其它很多地方使用是不需要这样声明的,只要 unsigned char *p;就行了,但是清楚地记得那次确实是要加 code 关键字声明才可以的。

⑤ :51单片机的P0口特殊之处

许多新手都碰到这个问题,其实很简单,这涉及到芯片的io脚是怎么做出来的。这对硬件工程师来说十分重要。TTL的io脚模型:

P1,P2,P3口都可以理解成左图,注意vcc下面有个电阻,因此可以理解成:引脚输出1的能力弱。地那边没有电阻,可以理解成引脚吸入电流能力强。而P0口,可以理解成右图。这就是集电极开路输出,也叫OC输出。可以看出,当CTR=1时,三极管导通,引脚被接地;当ctr=0时,三极管截止,引脚浮空,也叫三态。这个端口这么做的目的是考虑P0口肩负读写数据和地址复用,这个关系要仔细看懂cpu时序图。因此,P0口要加合适的上拉电阻,绝不要加下拉电阻。上拉电阻的选择要看外部负载情况。

⑥ :C51编译器如何区分位地址和字节地址

是靠预定义实现的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者声明了P0端口地址位于0x80,后者说明了P0端口的bit0,即P0.0位于位地址空间0x80处。这2个0x80具有完全不同的含义,靠关键字sfr和sbit来区别。这样当程序被编译时,编译器会依此编译成相应的汇编语言。例如:

C51语句: P0 = 1;

P0声明为sfr,因此编译成:mov 80h,01h,将把0x01数据送入0x80单元,由于0x80单元物理上对应P0端口,因此,P0.0脚将输出高电平(其实是呈现高阻态,P0口独有的),其他.1-.7脚输出低电平。

C51语句: P0_0 = 1;

P0_0声明为sbit,因此编译成:setb 80h,这将把位地址空间的0x80地址的bit的值置1。这个位正是P0口的bit0,执行后,P0.0将输出高阻态。而P0.1-.7不会变化。

⑦ 、在51里面,位变量貌似是有限的。

如果要用一个布尔型作为标识变量,为了节省控件可以用 bit 型变量,但是在DRS1000项目中遇到过一次用 bit 型变量出错,改为 unsigned char 型就OK了,那时定义的变量已经很多了,可能是把可以用bit寻址的存储区都用光了吧。

⑧ 、对于15系列单片机,在使用串口时必须要指定AUXR寄存器的值,否则程序无法正常运行。

这个情况遇到过很多次,15系列单片机只要使用到串口就一定要知名AUXR寄存器的值,不像12系列那样可以把这个寄存器忽略。

在使用15系列单片机时养成了一个习惯:main 函数的第一句让 AUXR=0; ,后面串口在根据需要对其进行初始化。

⑨ :P1-3口如何输入输出

从上节的左图可以看出。做输出时,ctr=1则输出强信号0,ctr=0则输出弱信号1。当io脚做输入时,应使ctr=0,这样三极管截止。外部信号如果是1,则上拉电阻加强了这个1,单片机就会读到1。当外部信号为0时,注意,必须将上拉电阻的上拉作用全部抵消,才能在引脚上得到0。

因此,对于程序来说,把io脚置1就处于接收状态,当然也是输出1状态。程序置io口为1,读取的信号是不是1就依靠外部电路了,如果外部电路没有“吃掉”上拉电阻的电流,则读取得到1,反之,虽然程序置io脚为1,但是读取得到的就是0。

因此,如果用io脚的高电平驱动外部电路时,要小心外部电路把这个1“吃掉”从而输出不了1。而作为输入时,为0电平的外设必须足够有能力将io脚拉低。所以,用io脚直接点亮led的时候,最好用反逻辑,就是输出0,让led亮。这样能保证驱动能力。就是io脚接led的负端,led的正端过电阻接vcc。

因此,io脚输出1时,外部电路将它强行接地是没有关系的,而io脚输出0的时候,外部电路强行接电源就会把io脚损坏。所以,程序加电之后,一般把所有io口都写成1:MOV P0,0FFH。

P3口引脚复用,必须引脚都处于输出1状态。例如,把RXD脚输出0,则它什么数据都读不进来了,笔者早期曾调试一整天才发现串口收不到数据是没有把RXD置1的原因,把时间都浪费在外围了,当时很是汗颜。

⑩ ,单片机报警系统有哪两种程序设计方法?

依据报警参数和传感器划分,简单的报警程序可分为两种:一种是全软件报警程序,另一种是硬件申请,软件处理报警程序。

怎样使用全软件报警程序的方法实现报警?

全软件件报警程序的基本方法是:作业现场的被测参数经传感器、变送器、模/数转换器送到单片机后,再与规定的上、下限给定值相比较,根据比较的结果进行报警或处理,其整个过程都由软件实现。

回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条


联系客服 关注微信 下载APP 返回顶部 返回列表