单片机应用程序的开发步骤

单片机应用程序的开发步骤,第1张

具体步骤如下:

1、首先,开启我们的keil软件,具体的安装步骤就不做太多的介绍了;

开启后,点击菜单栏上的Project选项,创建我们的工程,如图所示;

2、点击后,d出图中的窗口,在箭头所指的文本框中输入你的芯片型号进行查找,如果没有需要自行将芯片添加到keil软件的库下,如图所示;

3、选中芯片点击Ok即可,在左侧的文本框中,选中图中选项右键选择Add New选项,如图所示;

4、选择c的文件,输入文件名以及文件的存储目录,如图所示;

5、点击OK后,在我们添加的文本框中输入我们的程序代码,如图所示;

6、编写好代码以后,选择菜单栏上的魔法棒选项,如图所示;

7、选择Output选项,将图中箭头所指的选项,选中,点击ok,如图所示;

8、然后点击编译选项,如图所示;

编译完成后,在我们的文件夹下找到hex的文件,将其烧写到我们的芯片中即可。

#include "reg51h"

#define data_point P0

sbit EOC=P2^0;

sbit ADDA=P2^1;

sbit ADDB=P2^2;

sbit ADDC=P2^3;

sbit OE=P2^5;

sbit START=P2^6;

sbit CLK=P2^7;

sbit ALE=P2^6;

unsigned char disp[3]={0,0,0};

char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned char t0count=0;

unsigned int temp;

double sum;

unsigned char val_Integer; //整数

unsigned int val_Decimal; //小数

sbit k1 = P1^0;

sbit k2 = P1^1;

sbit k3 = P1^2;

sbit k4 = P1^3;

void delay(unsigned char ms)

{

unsigned char i;

while(ms--)

for(i=0;i<125;i++);

}

void display()

{

disp[0]=disp[0]&0x7f;

P3= disp[0];

k1 = 1;

delay(2);

k1 = 0;

P3= disp[1];

k2 = 1;

delay(2);

k2 = 0;

P3= disp[2];

k3 = 1;

delay(2);

k3 = 0;

P3= disp[3];

k4 = 1;

delay(2);

k4 = 0;

}

unsigned char ADC0808()

{

unsigned char d;

ADDC=0;

ADDB=0;

ADDA=0;

TR1=1;

ALE=1;ALE=0;

START=1;START=0;

while(EOC==0);

OE=1;

d=data_point;

OE=0;

TR1=1;

return d;

}

void covert(unsigned char x)

{

sum=x00201378;

val_Integer=(unsigned char)sum;

val_Decimal=(unsigned int)((sum-val_Integer)1000);

disp[3]=dispcode[val_Decimal%10];

disp[2]=dispcode[val_Decimal/10%10];

disp[1]=dispcode[val_Decimal/100];

disp[0]=dispcode[val_Integer];

}

void main()

{

TMOD=0x21;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

TH1=256-2;

ET0=1;

ET1=1;

EA=1;

TR0=1;

OE=0;

START=0;

EOC=1;

while(1)

{

display();

}

}

void time0() interrupt 1

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

t0count++;

if(t0count==100)

{

t0count=0;

covert(ADC0808());

}

}

void time1() interrupt 3

{

CLK=~CLK;

}

程序流程图一般是写程序之前画的,就是一个编程的思路。

按照你的情况,应该要先读懂别人写的程序是个什么意思,然后再画出来就行了。

从main函数开始看,弄懂EnableInt1是什么意思,有什么作用。然后一条条地往下列就可以了。

软件也有,不过远没有自己弄的那么好

延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器

周期指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指

令周期的区别和联系、相关指令的用法等用图解法的形式详尽的回答读者

我们知道程序设计是单片机开发最重要的工作,而程序在执行过程中常常需要完成延时的功能。例如

在交通灯的控制程序中,需要控制红灯亮的时间持续30秒,就可以通过延时程序来完成。延时程序是如何

实现的呢?下面让我们先来了解一些相关的概念。

一、机器周期和指令周期

1.机器周期是指单片机完成一个基本 *** 作所花费的时间,一般使用微秒来计量单片机的运行速度,

51 单片机的一个机器周期包括12 个时钟振荡周期,也就是说如果51 单片机采用12MHz 晶振,那么执行

一个机器周期就只需要1μs;如果采用的是6MHz 的晶振,那么执行一个机器周期就需要2 μs。

2 .指令周期是指单片机执行一条指令所需要的时间,一般利用单片机的机器周期来计量指令周期。

在51 单片机里有单周期指令(执行这条指令只需一个机器周期),双周期指令(执行这条指令只需要两个

机器周期),四周期指令(执行这条指令需要四个机器周期)。除了乘、除两条指令是四周期指令,其余均

为单周期或双周期指令。也就是说,如果51 单片机采用的是12MHz 晶振,那么它执行一条指令一般只需

1~2 微秒的时间;如果采用的是6MH 晶振,执行一条指令一般就需2~4 微秒的时间。

现在的单片机有很多种型号,但在每个型号的单片机器件手册中都会详细说明执行各种指令所需的机

器周期,了解以上概念后,那么可以依据单片机器件手册中的指令执行周期和单片机所用晶振频率来完成

需要精确延时时间的延时程序。

二、延时指令

在单片机编程里面并没有真正的延时指令,从上面的概念中我们知道单片机每执行一条指令都需要一

定的时间,所以要达到延时的效果,只须让单片机不断地执行没有具体实际意义的指令,从而达到了延时

的效果。

1.数据传送指令 MOV

数据传送指令功能是将数据从一个地方复制、拷贝到另一个地方。

如:MOV R7,#80H   ;将数据80H 送到寄存器R7,这时寄存器R7 里面存放着80H,就单这条

指令而言并没有任何实际意义,而执行该指令则需要一个机器周期。

2.空 *** 作指令 NOP

空 *** 作指令功能只是让单片机执行没有意义的 *** 作,消耗一个机器周期。

3.循环转移指令 DJNZ

循环转移指令功能是将第一个数进行减1 并判断是否为0,不为0 则转移到指定地点;为0 则往下执行。

如:DJNZ R7,KK ;将寄存器R7 的内容减1 并判断寄存器R7 里的内容减完1 后是否为0,如果

不为0 则转移到地址标号为KK 的地方;如果为0 则执行下一条指令。这条指令需要2 个机器周期。

利用以上三条指令的组合就可以比较精确地编写出所需要的延时程序。

三、1 秒延时子程序、流程图及时间计算 (以单片机晶振为12MHz 为例,1 个机器周期需要1μs)

了解了以上的内容,现在让我们来看看

程序总共所需时间:1+10+2560+330240+660480+5120+20+2=998433 μs≈1S

在这里运行这段程序共需998433 μs,还差1567μs 才达到1S 的,所以想要达到完美的1S 延时,需

要在返回指令RET 前再添加一些指令让它把1567μs 的延时完成。有兴趣的读者可以自己试着添加完成。

最后补充一点,编写程序时一般将延时程序编写成独立的子程序,而所谓子程序也就是一个实现某个功能

的小模块。这样在主程序中就可以方便地反复调用编写好的延时子程序。

小提示:循环转移指令(DJNZ )除了可以给定地址标号让其跳转外,还可以将地址标号改成$,这样

程序就跳回本指令执行。例如:

DJNZ R7,$ ;R7 内容减1 不为0,则再次执行本指令;为0 则往下执行,当R7 的值改为10

时,则执行完该条程序所需的时间为210=20 μs。

51单片机汇编延时程序算法详解

将以12MHZ晶振为例,详细讲解MCS-51单片机中汇编程序延时的精确算法。

指令周期、机器周期与时钟周期

指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。

时钟周期:也称为振荡周期,一个时钟周期 =晶振的倒数。

MCS-51单片机的一个机器周期=6个状态周期=12个时钟周期。

MCS-51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12(1/12000000)=1μs。

程序分析

例1 50ms 延时子程序:

DEL:MOV R7,#200 ①

DEL1:MOV R6,#125 ②

DEL2:DJNZ R6,DEL2 ③

DJNZ R7,DEL1 ④

RET ⑤

精确延时时间为:1+(1200)+(2125200)+(2200)+2

=(2125+3)200+3 ⑥

=50603μs

≈50ms

由⑥整理出公式(只限上述写法)延时时间=(2内循环+3)外循环+3 ⑦

详解:DEL这个子程序共有五条指令,现在分别就 每一条指令 被执行的次数和所耗时间进行分析。

第一句:MOV R7,#200 在整个子程序中只被执行一次,且为单周期指令,所以耗时1μs

第二句:MOV R6,#125 从②看到④只要R7-1不为0,就会返回到这句,共执行了R7次,共耗时200μs

第三句:DJNZ R6,DEL2 只要R6-1不为0,就反复执行此句(内循环R6次),又受外循环R7控制,所以共执行R6R7次,因是双周期指令,所以耗时2R6R7μs。

例2 1秒延时子程序:

DEL:MOV R7,#10 ①

DEL1:MOV R6,#200 ②

DEL2:MOV R5,#248 ③

DJNZ R5,$ ④

DJNZ R6,DEL2 ⑤

DJNZ R7,DEL1 ⑥

RET ⑦

对每条指令进行计算得出精确延时时间为:

1+(110)+(120010)+(224820010)+(220010)+(210)+2

=[(2248+3)200+3]10+3 ⑧

=998033μs≈1s

由⑧整理得:延时时间=[(2第一层循环+3)第二层循环+3]第三层循环+3 ⑨

此式适用三层循环以内的程序,也验证了例1中式⑦(第三层循环相当于1)的成立。

注意,要实现较长时间的延时,一般采用多重循环,有时会在程式序里加入NOP指令,这时公式⑨不再适用,下面举例分析。

例3仍以1秒延时为例

DEL:MOV R7,#10 1指令周期1

DEL1:MOV R6,#0FFH 1指令周期10

DEL2:MOV R5,#80H 1指令周期25510=2550

KONG:NOP 1指令周期12825510=326400

DJNZ R5,$ 2指令周期212825510=652800

DJNZ R6,DEL2 2指令周期225510=5110

DJNZ R7,DEL1 2指令周期210=20

RET 2

延时时间=1+10+2550+326400+652800+5110+20+2 =986893μs约为1s

整理得:延时时间=[(3第一层循环+3)第二层循环+3]第三层循环+3 ⑩

结论:针对初学者的困惑,对汇编程序的延时算法进行了分步讲解,并就几种不同写法分别总结出相应的计算公式,只要仔细阅读例1中的详解,并用例2、例3来加深理解,一定会掌握各种类型程序的算法并加以运用。

单片机延时子程序

1)延时为:20ms 晶振12M

1+(1+2248+2)4+1+1+1=20000US=20MS

用汇编优点就是精确

缺点就是算有点复杂

DELAY20MS:

MOV R7,#4

D1:

MOV R6,#248

DJNZ R6,$

DJNZ R7,D1

NOP

NOP

RET

2)一些通过计算51汇编指令得出的软延时子程序

;

;延时10uS

;

time10us:               mov     r5,#05h                 ;11us

djnz    r5,$

ret

;

;延时50uS

;

time50us:               mov     r5,#19h                 ;51us

djnz    r5,$

ret

;

;延时100uS

;

time100us:              mov     r5,#31h                 ;996us

djnz    r5,$

ret

;

;延时200uS

;

time200us:              mov     r5,#64h                 ;201us

djnz    r5,$

ret

;

;延时250uS

;

time250us:              mov     r5,#7ch                 ;2496us

djnz    r5,$

ret

;

;延时350uS

;

time350us:              mov     r5,#0afh                 ;351us

time350us_1:            djnz    r5,time350us_1

ret

;

;延时500uS

;

time500us:              mov     r5,#0fah                 ;501us

time500us_1:            djnz    r5,time500us_1

ret

;

;延时1mS

;

time1ms:                mov     r5,#0fah                ;1001us

time1ms_1:              nop

nop

djnz    r5,time1ms_1

ret

;

;延时25mS

;

time2_5ms:              mov     r5,#05h          ;2496ms

time2_5ms_1:            mov     r6,#0f8h         ;497us

djnz    r6,$

djnz    r5,time2_5ms_1

ret

;

;延时10mS

;

time10ms:               mov    r5,#14h         ;10262ms

time10ms_1:             mov    r6,#0ffh        ;511us

djnz   r6,$

djnz   r5,time10ms_1

ret

;

;延时50mS

;

time50ms:               mov    r5,#63h         ;49996ms

time50ms_1:             mov    r6,#0fbh        ;503us

djnz   r6,$

djnz   r5,time50ms_1

ret

;

;延时100mS

;

time100ms:              mov     r5,#0c3h        ;100036ms

time100ms_1:            mov     r6,#0ffh        ;511us

djnz    r6,$

djnz    r5,time100ms_1

ret

;

;延时200mS

;

time200ms:              mov     r5,#02h         ;250351ms

time200ms_1:            mov     r6,#0f4h        ;125173ms

time200ms_2:            mov     r7,#0ffh        ;511us

djnz    r7,$

djnz    r6,time200ms_2

djnz    r5,time200ms_1

ret

;

;延时500mS

;

time500ms:              mov    r5,#04h         ;500701ms

time500ms_1:            mov    r6,#0f4h        ;125173ms

time500ms_2:            mov    r7,#0ffh        ;511us

djnz   r7,$

djnz   r6,time500ms_2

djnz   r5,time500ms_1

ret

;

;延时1S

;

time1s:                 mov    r5,#08h         ;1001401ms

time1s_1:               mov    r6,#0f4h        ;125173ms

time1s_2:               mov    r7,#0ffh        ;511us

djnz   r7,$

djnz   r6,time1s_2

djnz   r5,time1s_1

ret

12M晶振 机器周期为1US  NOP为单周期指令 DJNZ为双周期指令.

3)

;;晶振12MHZ,延时1秒

DELAY:MOV   72H,#100

LOOP3:MOV   71H,#100

LOOP1:MOV   70H,#47

LOOP0:DJNZ   70H,LOOP0

NOP

DJNZ   71H,LOOP1

MOV   70H,#46

LOOP2:DJNZ   70H,LOOP2

NOP

DJNZ   72H,LOOP3

MOV   70H,#48

LOOP4:DJNZ   70H,LOOP4

4);延时1分钟子程序,F=6MHz

;程序已测过,延时时间60,000,0000uS

delay60s:mov r3,#228

mov r2,#253

mov r1,#219

loop1:   djnz r1,$

djnz r2,loop1

djnz r3,loop1

nop

ret

5)计算机反复执行一段程序以达到延时的目的称为软件延时,单片机程序中经常需要短时间的延时,但是相当一部分人对延时程序很模糊,对延时程序的算法不够了解,在这里我以12MHz晶振和两个经典延时子程序为例,详细分析单片机汇编延时程序。

何为时钟周期、机器周期、和指令周期?

时钟周期:也就是振荡周期,以12MHz的时钟脉冲为例,那时钟周期就为(1/12000000)s=(1/12)us;

机器周期:1个机器周期=6个状态周期=12个时钟周期=1us;

指令周期:CPU执行一条指令所需要的时间称为指令周期,指令周期是以机器周期为单位的,不同的指令所需的机器周期不一定相同,可参考51单片机指令速查表。

由上可得:CPU执行一条单周期指令,需要1us;执行一条双周期指令需要2us。

下面是具体的延时子程序分析:

01s延时子程序(12MHz晶振):

MOV R7,#200   ;单周期指令(1us)

D1:     MOV R6,#250   ;单周期指令(1us)

DJNZ R6,$      ;双周期指令(2us)//该指令自身执行R6次

DJNZ R7,D1     ;双周期指令(2us)//D1执行R7次

RET            ;双周期指令(2us)

T=1+(1+2R6+2)R7+2

=100603us

≈01s

05s延时子程序(12MHz晶振):

MOV R7,#5     ;单周期指令(1us)

D1:     MOV R6,#200   ;单周期指令(1us)

D2:     MOV R5,#250   ;单周期指令(1us

DJNZ R5,$      ;双周期指令(2us)//该指令自身执行R5次

DJNZ R6,D2     ;双周期指令(2us)//D2执行R6次

DJNZ R7,D1     ;双周期指令(2us)//D1执行R7次

RET            ;双周期指令(2us)

T=1+[1+(1+2R5+2)R6+2]R7+2

=503018us

≈05s

6) 51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。

ORG        0                   ;程序从0地址开始

START:      MOV      A,#0FEH     ;让ACC的内容为11111110

LOOP:         MOV      P2,A            ;让P2口输出ACC的内容

RR          A                  ;让ACC的内容左移

CALL     DELAY       ;调用延时子程序

LJMP     LOOP          ;跳到LOOP处执行

;01秒延时子程序(12MHz晶振)===================

DELAY:      MOV      R7,#200      ;R7寄存器加载200次数

D1:               MOV      R6,#250      ;R6寄存器加载250次数

DJNZ     R6,$             ;本行执行R6次

DJNZ     R7,D1          ;D1循环执行R7次

RET                            ;返回主程序

END                           ;结束程序

其实,画流程图一点用都没有,只能是浪费时间。如果是一个大的项目,画个程序结构图倒是有必要,有利于团队分工和程序的结构化更合理。而对于一个单片机一般的小程序,不必画。画流程图是毕业设计中为了占篇幅凑内容,或者一些教材为了凑内容而画的。

控制系统各部件的初始化和实现各功能子程序的调用。根据道客巴巴官网查询。单片机程序不是从零开始,而是先对已有的相关程序进行阅读分析。分析程序是设计、修改、优化、维护的重要步骤。因此,掌握单片机程序的分析方法是非常必要的。头文件,变量声明,函数声明,子函数,主函数这几部分组成,头文件其实就是一种声明,将单片机中的一些常用的符号变量进行定义声明,对一些特殊功能寄存器进行声明,对一些关健字进行定义,比如我们常用的P0口,在写程序的时候你就不用在去定义这个符号,不用把它的字节地址给这个符号了。

以上就是关于单片机应用程序的开发步骤全部的内容,包括:单片机应用程序的开发步骤、单片机程序 急求流程图 ;1、0809的片选信号CS0809接CS0。 ;2、电位器的输出信号AN0接0809的ADIN0。 ;3、EO、大神来帮忙~~~~~下面这个单片机代码的流程图怎么画有没有生成流程图的软件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9337519.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存