我就是物联网工程大二的,今年夏天就会有第一届毕业生了,不知道你关注过物联网的百度贴吧没?我在上面发过贴,也是问一些跟你差不多的问题,你要是问我一些关于物联网上课之类的,我倒是可以回答,想必楼主也看到了下面大家的回答,如果真的是问我就业这类的,我才大二 啊,那个迷茫相信你也看到了,我是这样觉得,如果你真的有点想法,有能力,注意,是非常有能力,就像中国第一代接触互联网的那些李彦宏,马化腾之类的,那你肯定能混的世界闻名,但是如果为了图安稳,还是慎重考虑,我现在就处在一个两难的境界
我能帮你的也不多,那我就说一下我的课程吧,我们的课一般就是和软件外包还有通信工程这两个班一起上,英语,物理(主要是电),数字逻辑,信号与系统。电路,模拟电路,信息论与编码,MATLAB基础,概率论,物联网工程导论,复变函数,RFID射频技术,C++,高数,线性代数,还有一些就是很普通的了,比如马克思,近代史之类的51单片机的几种精确延时实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
1 使用定时器/计数器实现精确延时
单片机系统一般常选用11059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。
2 软件延时与时间计算
在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。
21 短暂延时
可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下:
void Delay10us( ) {
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}
Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。 可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用\[4\],以实现较长时间的延时;但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 μs。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2 μs),然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us( ),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 μs。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。
22 在C51中嵌套汇编程序段实现延时
在C51中通过预处理指令#pragma asm和#pragma endasm可以嵌套汇编语言语句。用户编写的汇编语言紧跟在#pragma asm之后,在#pragma endasm之前结束。
如:#pragma asm
…
汇编语言程序段
…
#pragma endasm
延时函数可设置入口参数,可将参数定义为unsigned char、int或long型。根据参数与返回值的传递规则,这时参数和函数返回值位于R7、R7R6、R7R6R5中。在应用时应注意以下几点:
◆ #pragma asm、#pragma endasm不允许嵌套使用;
◆ 在程序的开头应加上预处理指令#pragma asm,在该指令之前只能有注释或其他预处理指令;
◆ 当使用asm语句时,编译系统并不输出目标模块,而只输出汇编源文件;
◆ asm只能用小写字母,如果把asm写成大写,编译系统就把它作为普通变量;
◆ #pragma asm、#pragma endasm和 asm只能在函数内使用。
将汇编语言与C51结合起来,充分发挥各自的优势,无疑是单片机开发人员的最佳选择。
23 使用示波器确定延时时间
利用示波器来测定延时程序执行时间。方法如下:编写一个实现延时的函数,在该函数的开始置某个I/O口线如P10为高电平,在函数的最后清P10为低电平。在主程序中循环调用该延时函数,通过示波器测量P10引脚上的高电平时间即可确定延时函数的执行时间。方法如下:
sbit T_point = P1^0;
void Dly1ms(void) {
unsigned int i,j;
while (1) {
T_point = 1;
for(i=0;i<2;i++){
for(j=0;j<124;j++){;}
}
T_point = 0;
for(i=0;i<1;i++){
for(j=0;j<124;j++){;}
}
}
}
void main (void) {
Dly1ms();
}
把P10接入示波器,运行上面的程序,可以看到P10输出的波形为周期是3 ms的方波。其中,高电平为2 ms,低电平为1 ms,即for循环结构“for(j=0;j<124;j++) {;}”的执行时间为1 ms。通过改变循环次数,可得到不同时间的延时。当然,也可以不用for循环而用别的语句实现延时。这里讨论的只是确定延时的方法。
24 使用反汇编工具计算延时时间
用Keil C51中的反汇编工具计算延时时间,在反汇编窗口中可用源程序和汇编程序的混合代码或汇编代码显示目标应用程序。为了说明这种方法,还使用“for (i=0;i<DlyT;i++) {;}”。在程序中加入这一循环结构,首先选择build taget,然后单击start/stop debug session按钮进入程序调试窗口,最后打开Disassembly window,找出与这部分循环结构相对应的汇编代码,具体如下:
C:0x000FE4CLRA//1T
C:0x0010FEMOVR6,A//1T
C:0x0011EEMOVA,R6//1T
C:0x0012C3CLRC//1T
C:0x00139FSUBBA,DlyT //1T
C:0x00145003JNCC:0019//2T
C:0x00160E INCR6//1T
C:0x001780F8SJMPC:0011//2T
可以看出,0x000F~0x0017一共8条语句,分析语句可以发现并不是每条语句都执行DlyT次。核心循环只有0x0011~0x0017共6条语句,总共8个机器周期,第1次循环先执行“CLR A”和“MOV R6,A”两条语句,需要2个机器周期,每循环1次需要8个机器周期,但最后1次循环需要5个机器周期。DlyT次核心循环语句消耗(2+DlyT×8+5)个机器周期,当系统采用12 MHz时,精度为7 μs。
当采用while (DlyT--)循环体时,DlyT的值存放在R7中。相对应的汇编代码如下:
C:0x000FAE07MOVR6, R7//1T
C:0x00111F DECR7//1T
C:0x0012EE MOVA,R6//1T
C:0x001370FAJNZC:000F//2T
循环语句执行的时间为(DlyT+1)×5个机器周期,即这种循环结构的延时精度为5 μs。
通过实验发现,如将while (DlyT--)改为while (--DlyT),经过反汇编后得到如下代码:
C:0x0014DFFE DJNZR7,C:0014//2T
可以看出,这时代码只有1句,共占用2个机器周期,精度达到2 μs,循环体耗时DlyT×2个机器周期;但这时应该注意,DlyT初始值不能为0。
注意:计算时间时还应加上函数调用和函数返回各2个机器周期时间。物联网APP开发公司都有哪些
极其流行,同样也是竞争力极其大的一种商业模式。虽然国内软件开发公司都发展壮大起来了,但是各地软件开发公司的实力及资质仍然参差不齐。下面为大家介绍下近期国内软件开发公司的排名汇总。
1:华盛恒辉科技有限公司
上榜理由:华盛恒辉是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在开发、建设到运营推广领域拥有丰富经验,我们通过建立对目标客户和用户行为的分析,整合高质量设计和极其新技术,为您打造创意十足、有价值的企业品牌。
在军工领域,合作客户包括:中央军委联合参谋(原总参)、中央军委后勤保障部(原总后)、中央军委装备发展部(原总装)、装备研究所、战略支援、军事科学院、研究所、航天科工集团、中国航天科技集团、中国船舶工业集团、中国船舶重工集团、第一研究所、训练器材所、装备技术研究所等单位。
在民用领域,公司大力拓展民用市场,目前合作的客户包括中国中铁电气化局集团、中国铁道科学研究院、济南机务段、东莞轨道交通公司、京港地铁、中国国电集团、电力科学研究院、水利部、国家发改委、中信银行、华为公司等大型客户。
2:五木恒润科技有限公司
上榜理由:五木恒润拥有员工300多人,技术人员占90%以上,是一家专业的军工信息化建设服务单位,为军工单位提供完整的信息化解决方案。公司设有股东会、董事会、监事会、工会等上层机构,同时设置总经理职位,由总经理管理公司的具体事务。公司下设有研发部、质量部、市场部、财务部、人事部等机构。公司下辖成都研发中心、西安研发中心、沈阳办事处、天津办事处等分支机构。
3、浪潮
浪潮集团有限公司是国家首批认定的规划布局内的重点软件企业,中国著名的企业管理软件、分行业ERP及服务供应商,在咨询服务、IT规划、软件及解决方案等方面具有强大的优势,形成了以浪潮ERP系列产品PS、GS、GSP三大主要产品。是目前中国高端企业管理软件领跑者、中国企业管理软件技术领先者、中国最大的行业ERP与集团管理软件供应商、国内服务满意度最高的管理软件企业。
4、德格Dagle
德格智能SaaS软件管理系统自德国工业40,并且结合国内工厂行业现状而打造的一款工厂智能化信息平台管理软件,具备工厂ERP管理、SCRM客户关系管理、BPM业务流程管理、
OMS订单管理等四大企业业务信息系统,不仅满足企业对生产进行简易管理的需求,并突破局域网应用的局限性,同时使数据管理延伸到互联网与移动商务,不论是内部的管理应用还是外部的移动应用,都可以在智能SaaS软件管理系统中进行业务流程的管控。
5、Manage
高亚的产品 (8Manage) 是美国经验中国研发的企业管理软件,整个系统架构基于移动互联网和一体化管理设计而成,其源代码编写采用的是最为广泛应用的
Java / J2EE 开发语言,这样的技术优势使 8Manage
可灵活地按需进行客制化,并且非常适用于移动互联网的业务直通式处理,让用户可以随时随地通过手机apps进行实时沟通与交易。在程序流程中经常要延时一段时间后再继续往下执行,在VB中常用的有以下几种方法(因为Timer控件打乱了程序的流程所以一般不用它):
1使用Windows API函数Sleep
新建一个工程,添加一个TextBox控件和一个CommandButton控件,再将以下代码复制到代码窗口:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Command1_Click()
Text1 = "sleep begin"
Sleep 3000
Text1 = "sleep end"
End Sub
按F5执行,按下Command1按钮,程序停止执行,3秒钟内不对用户的 *** 作做出反应,并且Text1里的内容并没有发生改变。这是怎么回事呢?原来,Sleep函数功能是将调用它的进程挂起dwMilliseconds毫秒时间,在这段时间内,此进程不对用户 *** 作做出反应,程序中虽然将Text1的Text属性改成Sleep begin,但还没等完成对屏幕的更新进程就被挂起了,对用户来说程序象是死机一样。所以这种方法虽然简单,但并不适用。
2使用Timer()函数
这是用的最多的一种方法,也是在VB联机手册中所推荐的。添加一个CommandButton控件,再将以下代码添加到代码窗口中:
Private Sub Command2_Click()
Dim Savetime As Single
Text1 = "Timer begin"
Savetime = Timer '记下开始的时间
While Timer < Savetime + 5 '循环等待
DoEvents '转让控制权,以便让 *** 作系统处理其它的事件
Wend
Text1 = "Timer ok"
End Sub
这种方法虽然也很简单,但却有有一个致命缺陷,那就是Timer函数返回的是从午夜开始到现在经过的秒数。所以Timer返回的最大值也只是606024-1秒,如果从一天的23:59:58秒开始计时等待5秒,那么程序会永远地循环下去。要进行改良,就要加上判断是否又开始了新的一天,那岂不是太麻烦。下面给大家推荐另一个Windows API函数。
3使用Windows API函数timeGetTime()
timeGetTime函数没有参数,返回值是从开机到现在所经历的毫秒数,这个毫秒数是非周期性递增的,所以不会出现Timer()函数出现的问题,而且这种方法的精确性高于上一种方法。添加一个CommandButton控件,再将以下代码添加到代码窗口中:
Private Declare Function timeGetTime Lib "winmmdll" () As Long
Private Sub Command3_Click()
Dim Savetime As Double
Text1 = "timeGetTime begin"
Savetime = timeGetTime '记下开始时的时间
While timeGetTime < Savetime + 5000 '循环等待
DoEvents '转让控制权,以便让 *** 作系统处理其它的事件
Wend
Text1 = "timeGetTime end"
End Sub时钟周期:
1/时钟源,在我现在这块板子上,晶振频率是110592M,也就是时钟周期是 1/11059200秒
机器周期:
一般51单片机是12个时钟周期,我的板子也就是 12/11059200秒
单次定时最长时间:
如果是16位的计数器,16位最大值是65535,共可计数65536次。基本的常数一定要记住,还要记住8位最大值是255,共可计数256次,还要记住8位上每位代表的数值。
12 65536/11059200 = 00711 s,也就是,71 ms内的定时可以单次定时就完成。如果定时时间超过71 ms,就要循环了。
一次定时需要几次机器周期:
计算公式:定时秒数/机器周期
比如我要定时1秒, 1/(12/11059200)= 921600次,16位计数器最大可计数65536次,921600次早就益出了。我们可以每次定时10 ms,循环100次就可以定时1秒了,1 s缩小100百倍就是10 ms, 也就是每次需要计数9216次。
确实计数器初始值:
定时10 ms时,如果计数器从0开始计数,我们就不知道什么时候到了9216次。所以应该计数了9216次,16位计数器最多计数95536次,然后就溢出,一溢出TCON的TF位就会置1,我们只要经常检测TF位就可以知道什么时候完成10ms的定时了。
计算公式:计数器初始值=最大计数次数 - 需要计数次数
如果定时10 ms,计数器的初始值就是 65536 - 9216
计算计数器的高位和低位:
16位的计数器,也就是两个8位组成,8位的最大计数次数是256。所以:
计数器高位 = 初始值/256
计数器低位 = 初始值%256
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)