一,装备问题:实践烧片时单片机的装备字与仿真的时分是不是相同?烧写时是否装备正确?
二,资源问题:单片机的ROM、RAM巨细与仿真器的ROM、RAM巨细是不相同的!
三,驱动才能问题:一般仿真器的驱动才能比单片机要强;能够分两步查看,一是分别用仿真器与单片机时对应IO口波形进行比照,二是当仿真器与外设衔接与不衔接时波形的比照;
要进行基本要素剖析:单片机供电正常?起振没有?复位电路正常?芯片损坏?
【单片机上电不运转状况的剖析】
1.单片机是没有运转,仍是运转不正确?
2.假如是没有运转,检测单片机的基本参数是否现已满意<作业电压要在芯片的引脚处丈量><复位引脚的复位曲线怎么><晶振是否现已起振><芯片损坏,或许部分功用损坏>。
3.假如是运转不正确,检测<用了看门狗,没有处理好,芯片上电后处于不断的复位状况,看起来就象没有没有作业起来><是否进入了ISP状况><对单片机写入对一切的IO口以1秒取反一次的程序进行测验>
【单片机调试办法】
用LED进行状况指示,用串口进行数据指示,比用其它外设指示更牢靠;
参加断点,烧写时是在不同的句子后边参加WHILE(1);
分模块调试,把每个小功用先调试经过,再进行组合。
Keil C自身便是编译与仿真一体的,当不要外部数据时很便利,当要外部输入时(比如用定时器作计数器用)它供给几个调试输入用的窗口可用它们来摸拟输入,一起Keil C自身供给一种调试函数用来装备摸拟外部输入的功用,这我在学习时看的一本书上讲过如用定时器作外部事情计数,调试函数由自己根据需求按特定的格局来修正再按KEIL C的要求调入即可。学习时可用这种办法,做产品时最好是用仿真器调试。下面我给出我曾经试过的用定时器作外部事情计数时摸拟外部输入的调试函数,并写出Keil C调用的过程如下:
1、编写如下信号函数:
single void t0_singal(void)
{
while(1)
{
PORT3|=0x10;//pull INT0(P3.4) high again
PORT3&=~0x10;//pull INT0(P3.4) low and generate interrupt
PORT3|=0x10;//pull INT0(P3.4) high again
twatch(CLOCK);//wait for 1 second
}
}
2、在DEBUG状况下单击DEBUG菜单在下拉菜单中单击“Function Editor(Open Ini File)… "选项, 弹出新屏暗地,将“翻开”窗口封闭,这时屏上有Function Edito窗;
3、在Function Editor窗中输入上面的函数;
4、保存(留意:扩展名为.ini),编译该程序,成功后封闭Function Editor窗口;
5、履行用户程序(有必要接连履行);
6、在屏幕左下脚的指令窗口中,键入t0_singl()后(有必要回车)妈可向P3.4源源不断地供给脉冲信号。
咱们运用Keil C调试某体系时堆集的一些经历
1、由于Keil C对中文支撑不太好,因而会呈现显现的光标与光标实践地点不一致的现象,这会对修正中文注释形成影响。在Windows2000下面,咱们能够把字体设置为Courier,这样就能够显现正常。
2、当运用有片外内存的MCU(如W77E58,它有1K片外内存)的时分,肯定要设置标志位,而且编译方法要挑选大形式,不然会犯错。
3、当运用Keil C盯梢程序运转状况的时分,要把引起Warning的句子屏蔽,不然有或许盯梢句子的时分会犯错。
4、在调用数组的时分,Keil C是首先把数组Load进内存。假如要在C中运用长数组的时分,咱们能够运用code关键字,这样就完成了汇编的DB的功用,Keil C是不会把标志code的数组Load入内存的,它会直接读取Rom。
5、当编程涉及到有关通讯,时序是很重要的。拉高管脚的履行速度远远比查看管脚电平的要快。
6、在等候管脚电平改变的时分,咱们需求设置好超时处理,不然程序就会由于一个没有估计的过错而死锁。
7、能用C言语完成的当地,尽量不要用汇编,尤其在算法的完成,用汇编是不流畅难明。
8、程序的几个参数数组所占篇幅很大,其间液晶布景数组最长,有四千个Byte,因而把那些初始化数组都放在别的一个C文件,在主文件运用运用关键字extern界说,这样就不会对主文件的编写形成搅扰。
9、一切函数之间的相关性越低越有利于今后功用的扩展。
10、6.20版在编译带code关键字的数组时,编译经过可是单片机运转结果是过错的,改用6.14版后正常。