之前我也尝试着焊一个单片机最小系统,结果电脑死活检测不到我焊的设备。又因为严重缺乏硬件调试的经验,单片机的自制之旅就暂时搁浅了。proteus在自制的期间就装好了,可是不会用,也就没有发现它的强大之处。
用了proteus,就可以省下买硬件的钱,对于入门级的爱好者来说,首先要搞清楚一些原理,对芯片和外设没有要求,所以使用proteus元件库中的器件就可以开始做仿真实验了,和在真板子上没什么区别,还省去了买编程器的钱。我用的是proteus 7。下面给张截图。
而keil uversion是一个很好的嵌入式开发工具软件,我用的是uversion4。可以和proteus连接调试,我暂时还不会。尝试了用keil写了汇编程序,C语言程序,C语言内嵌汇编程序,然后烧到proteus里看效果。这样单片机开发的流程就大概有数了。
1)确定需求。单片机的主要就是功能点,以及实现的难点。需要什么资源,硬件资源,软件资源,人力资源。
2)设计。
2.1)硬件设计。用什么硬件,实现什么样的功能;什么功能用硬件实现,什么功能用软件实现;PCB的设计。
2.2)软件设计。能否复用以前的模块,软件的架构,模块的功能正交性等等。
3)编码。实现需求中的功能点。
4)测试。
4.1)仿真测试。这步是很重要的,发现问题越早越有利。尤其是大型的工程,没有强大的仿真会损失很多金钱的!
4.2)真机测试。用来发现仿真没法发现的问题
5)维护。出货后的产品服务。
软件开发的大体流程都是如此,对与用proteus和keil入门单片机而言,流程可以简化为:
1)分析实验要求
2)用proteus搭建仿真电路环境,也就是一个模拟的开发板。
3)脑子里设计一下程序的结构,可以画画流程图,状态流图和数据流图。用keil编写程序。
4)编译成功后,烧到proteus里看运行的效果是否符合实验的要求。不符合的话就再去修改程序,直到模拟到想要的结果。
目前为止的程序,我都是用内嵌汇编语言编写的,一则可以锻炼汇编语言的编程能力,二则可以熟悉单片机芯片的指令,三则可以熟悉如何用软件来控制硬件的运转(其实就是读写各种硬件的各种状态、数据寄存器)。
下面的是今天花了一个下午调试出的交通灯程序:
1/*
2*trafficleds,red,yellow,greensequentlylightsandloop.
3*redlightsfor2mins,yellowlightsfor1mins,greenlightsfor3mins.
4*/
5#pragmaasm
6ORG0000H;
7ajmp ASM_ENTRY;
8ORG 000BH;timer0interruptvectoraddress
9ajmp TIME0;jumptorealtimerprogram
10ORG 30H;
11ASM_ENTRY:
12;setbcy;
13mov p1,#11111101B;lightyellowledforinitial
14;mov p1,#00H ;
15mov30H,#200;firstsoftwaretimer,50ms*200=10s
16mov31H,#1;secondsoftwaretimer,10sforstartredlight.After10sdelaywillredlightson.
17movr7,#04H;pretentpreviousgreenlighton.setgreenlightstatebitr7.2
18movtmod,#01H;timer/counter0worksinmode1
19movth0,#3CH;
20mov tl0,#0B0H;immediatenumber0x3CB0H=15536,taking50000(50ms)tooverflow
21setb ea;enableinterrupt
22setb et0;enabletimer/counter0interrupt
23setb tr0;timer/counter0begintorun
24LOOP: ajmp LOOP;doanythingyouwant
25TIME0:push acc;protectaccvalue
26push psw;protectpswvalue
27dec30H;
28mova,30H;
29jz TNEXT;is10spassed?
30ajmp TRET;
31TNEXT:
32mov30H,#200;restorecounterfor10s
33dec31H;secondtimerbeginstocount
34mova,31H;
35cjne a,#0,TRET;iscurrenttrafficlightexhausteditstime?
36mova,r7;asmallstatemachine
37jbcacc.2,RED;green->red
38jbcacc.0,YELLOW;red->yellow
39jbcacc.1,GREEN;yellow->green
40RED:
41movp1,#11111110B;lightredon
42movr7,#01H;setredlightstatebitr7.0
43mov31H,#2;50ms*200*12=120s=2min
44ajmp TRET;
45YELLOW:
46movp1,#11111101B;lightyellowon
47movr7,#02H;setyellowlightstatebitr7.1
48mov31H,#1;50ms*200*6=60s=1min
49ajmp TRET;
50GREEN:
51movp1,#11111011B;lightgreenon
52movr7,#04H;setgreenlightstatebitr7.2
53mov31H,#3;50ms*200*18=180s=3min
54TRET:
55movth0,#3CH;
56mov tl0,#0B0H;resettimerconstant
57poppsw;
58pop acc;
59reti;
60#pragmaendasm
看到交通灯在proteus动起来的那一刻真的很让人兴奋!而且省去了硬件的各种问题。
proteus还有很多强大的功能,比如各种虚拟的仪表,不然买个便宜的示波器至少要几百块钱。如果能最大限度的发挥proteus的作用,可以为我们省去很多硬件的开销。
所以,本人建议想学单片机但不知如何入门的人用proteus和keil这两个强大的工具,采用模拟仿真的方式入门,可以迅速的进入状态。还有一点,应该结合芯片手册去学习单片机,对不了解的原理还可以从网上找高手的理解。