51单片机pwm控制舵机程序 单片机舵机编程教学(5篇)_第1页
51单片机pwm控制舵机程序 单片机舵机编程教学(5篇)_第2页
51单片机pwm控制舵机程序 单片机舵机编程教学(5篇)_第3页
51单片机pwm控制舵机程序 单片机舵机编程教学(5篇)_第4页
51单片机pwm控制舵机程序 单片机舵机编程教学(5篇)_第5页
已阅读5页,还剩25页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——51单片机pwm控制舵机程序单片机舵机编程教学(5篇)在日常的学习、工作、生活中,确定对各类范文都很熟悉吧。那么我们该如何写一篇较为完美的范文呢?下面我给大家整理了一些优秀范文,希望能够帮助到大家,我们一起来看一看吧。

51单片机pwm控制舵机程序单片机舵机编程教学篇一

同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。

对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。由于这是实际项目中总结出来的经验,学校里面学不到的东西。

以下假设你懂c语言,由于纯粹的c语言描述,所以和处理器平台无关,你可以在mcs-51,avr,pic,甚至是arm平台上面测试这个程序性能。当然,我自己也是在多个项目用过,效果十分好的。

好了,工程人员的习惯,废话就应当少说,开始吧。以下我以avr的mega8作为平台讲解,没有其它原因,由于我手头上只有avr的板子而已没有51的。用51也可以,只是芯片初始化部分不同,还有寄放器名字不同而已。核心算法:

unsignedchartrg;unsignedcharcont;voidkeyread(void){unsignedcharreaddata=pinb^0xff;//1trg=readdata//2cont=readdata;//3}完了。有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!下面是程序解释:

trg(triger)代表的是触发,cont(continue)代表的是连续按下。

1:读portb的端口数据,取反,然后送到readdata临时变量里面保存起来。2:算法1,用来计算触发变量的。一个位与操作,一个异或操作,我想学过c语言都应当懂吧?trg为全局变量,其它程序可以直接引用。3:算法2,用来计算连续变量。

看到这里,有种“知其然,不知其所以然〞的感觉吧?代码很简单,但是它终究是怎么样实现我们的目的的呢?好,下面就让我们绕开云雾看青天吧。

我们最常用的按键接法如下:avr是有内部上拉功能的,但是为了说明问题,我是特意用外部上拉电阻。那么,按键没有按下的时候,读端口数据为1,假使按键按下,那么端口读到0。下面就看看具体几种状况之下,这算法是怎么一回事。

(1)没有按键的时候

端口为0xff,readdata读端口并且取反,很显然,就是0x00了。

trg=readdata(初始状态下,cont也是为0的)很简单的数学计算,由于readdata为0,则它和任何数“相与〞,结果也是为0的。

cont=readdata;保存cont其实就是等于readdata,为0;结果就是:

readdata=0;trg=0;cont=0;

(2)第一次pb0按下的状况

端口数据为0xfe,readdata读端口并且取反,很显然,就是0x01了。trg=readdata由于这是第一次按下,所以cont是上次的值,应为为0。那么这个式子的值也不难算,也就是trg=0x01由于这是连续按下,所以cont是上次的值,应为为0x01。那么这个式子就变成了trg=0x01//执行蜂鸣器处理函数}}怎么样?够和谐不?记得前面解释说trg的精粹是什么?精粹就是只会出现一次。所以你按下按键的话,trg//模式寄放器加1,当然,这里只是演示,你可以执行你想

//执行的任何代码}if(cont//计时if(cnt_plus>100)//20ms*100=2s假使时间到{func();//你需要的执行的程序}}}不知道各位感觉如何?我觉得还是挺简单的完成了任务,当然,作为演示用代码。

应用3:点触型按键和开关型按键的混合使用

点触形按键估计用的最多,特别是单片机。开关型其实也很常见,例如家里的电灯,那些按下就不松开,除非关。这是两种按键形式的处理原理也没啥特别,但是你有没有想过,假使一个系统里面这两种按键是怎么处理的?我想起了我以前的处理,分开两个十分类似的处理程序,现在看起来真的是笨的不行了,但是也没有方法啊,结构决定了程序。不过现在好了,用上面介绍的方法,很轻松就可以搞定。

原理么?可能你也会想到,对于点触开关,依照上面的方法处理一次按下和长按,对于开关型,我们只需要处理cont就ok了,为什么?很简单嘛,把它当成是一个长按键,这样就找到了共同点,屏蔽了所有的细节。程序就不给了,完全就是应用2的内容,在这里提为了就是说明原理~~

好了,这个好用的按键处理算是说完了。可能会有朋友会问,为什么不说延时消抖问题?哈哈,被看穿了。果真不能偷懒。下面谈谈这个问题,顺便也就十分简单的谈谈我自己用时间片轮方法,以及是如何消抖的。

延时消抖的方法是十分传统,也就是第一次判断有按键,延时一定的时间(一般习惯是20ms)再读端口,假使两次读到的数据一样,说明白是真正的按键,而不是抖动,则进入按键处理程序。

当然,不要跟我说你delay(20)那样去死循环去,真是那样的话,我衷心的建议你先放下手上所有的东西,好好的去了解一下操作系统的分时工作原理,大约知道思想就可以,不需要详细看原理,否则你永远逃不出“菜鸟〞这个圈子。当然我也是菜鸟。我的意思是,真正的单片机入门,是从学会处理多任务开始的,这个也是学校程序跟公司程序的最大区别。当然,本文不是专门说这个的,所以也不献丑了。

我的主程序架构是这样的:

volatileunsignedcharintrcnt;voidinterrupthandle()//中断服务程序{intrcnt++;//1ms中断1次,可变}voidmain(void){sysinit();while(1)//每20ms执行一次大循环{keyread();//将每个子程序都扫描一遍keyproc();func1();funt2();„

while(1){if(intrcnt>20)//一直在等,直到20ms时间到{intrcnt=“0〞;break;//返回主循环}}}}貌似扯远了,回到我们方才的问题,也就是怎么做按键消抖处理。我们将读按键的程序放在了主循环,也就是说,每20ms我们会执行一次keyread()函数来得到新的trg和cont值。好了,下面是我的消抖部分:很简单

基本架构如上,我自己比较喜欢的,一直在用。当然,和这个协同,每个子程序必需执行时间不长,更加不能死循环,一般采用有限状态机的方法来实现,具体参考其它资料咯。懂得基本原理之后,至于怎么用就大家渐渐思考了,我想也难不到聪明的工程师们。例如还有一些处理,怎么判断按键释放?很简单,trg和cont都为0则确定已经释放了。

这个需要有定时(按键间隔)调用函数,完成去抖,区别单次和长按,好的思路。我想矩阵键盘也可以处理,只有键盘返回的码是唯一的,把pinb换成getkey之类的函数。我想这个可能用来分析脉冲信号,譬如红外遥控信号

最简单矩阵键盘扫描程序

这是站长初学者写的最简单、最详细、效率最高的矩阵键盘扫描程序,只用了四条常用命令(mov/送数、jb/高电平转移、jmp/直接转移、ret/子程序返回),保证初学者一看就懂!本程序已经在本站电子试验板上验证通过,占用cpu时间少,效率高,被选作单片机的测试程序!

矩阵按键扫描程序是一种节省io口的方法,按键数目越多节省io口就越可观,本程序的思路跟书上一样:先判断某一列(行)是否有按键按下,再判断该行(列)是那一只键按下。但是,在程序的写法上,站长采用了最简单的方法,使得程序效率最高。

本程序中,假使检测到某键按下了,就不再检测其它的按键,这完全能满足绝大多数需要,又能节省大量的cpu时间。另外,本人认为键盘用延时程序来消除抖动,完全是浪费时间。试想,假使不用中断执行(用中断执行需要更多的硬件资源)的方法来扫描键盘,每秒钟扫描20-100次,每次都要延时10-20ms的话,我们的单片机还有多少时间做正事呢?

其实,延时的这段时间,cpu可以做其它的事呀。所以,本键盘扫描程序的前面后面都可以参与少少代码,既可以达到完美的消抖动效果,又可以扩展其它的功能(例如按键封锁、按键长按等按键功能复用!)字串2

本键盘扫描子程序名叫key,每次要扫描时用callkey调用即可。以下子程序内容:

key:movp0,#00001111b;上四位和下四位分别为行和列,所以送出高低电压检查有没有按键按下

jmpk10;跳到k10处开始扫描,这里可以改成其它条件转移指令来决定本次扫描是否要继续,例如减1为0转移或者位为1或0才转移,这主要用来增加功能,确认上一按键功能是否完成?是否相当于经过了延时?是否要封锁键盘?

goend:jmpkend;假使上面判断本次不执行键盘扫描程序,则马上转到程序尾部,不要浪费cpu的时间

k10:jbp0.0,k20;扫描正式开始,先检查列1四个键是否有键按下,假使没有,则跳到k20检查列2k11:movp0,#11101111b;列1有键按下时,p0.0变低,终究是那一个键按下?现在分别输出各行低电平

jbp0.0,k12;该行的键不按下时,p0.0为高电平,跳到到k12,检查其它的行movr1,#1;假使正好是这行的键按下,将寄放器r0写下1,表示1号键按下了k12:movp0,#11011111bjbp0.0,k13movr1,#2;假使正好是这行的键按下,将寄放器r0写下2,表示2号键按下了k13:movp0,#10111111bjbp0.0,k14movr1,#3;假使正好是这行的键按下,将寄放器r0写下3,表示3号键按下了字串3k14:movp0,#01111111bjbp0.0,kend;假使现在四个键都没有按下,可能按键松开或干扰,退出扫描(以后一致)movr1,#4假使正好是这行的键按下,将寄放器r0写下4,表示4号键按下了jmpkend;已经找到按下的键,跳到结尾吧

k20:jbp0.1,k30;列2检查为高电平再检查列3、4

k21:movp0,#11101111b;列2有健按下时,p0.0会变低,终究是那一行的键按下呢?分别输出行的低电平

jbp0.1,k22;该行的键不按下时p0.0为高电平,跳到到k22,检查另外三行

movr1,#5;假使正好是这行的键按下,将寄放器r0写下5,表示5号键按下了(以后一致,不再重复了)

k22:movp0,#11011111bjbp0.1,k23movr1,#6k23:movp0,#10111111bjbp0.1,k24movr1,#7k24:movp0,#01111111bjbp0.1,kendmovr1,#8jmpkend;已经找到按下的键,跳到结尾吧(以后一致,不要重复了)

k30:jbp0.2,k40k31:movp0,#11101111bjbp0.2,k32movr1,#9k32:movp0,#11011111bjbp0.2,k33movr1,#10k33:movp0,#10111111bjbp0.2,k34movr1,#11k34:movp0,#01111111bjbp0.2,kend字串6

movr1,#12jmpkend

k40:jbp0.3,kendk41:movp0,#11101111bjbp0.3,k42movr1,#13k42:movp0,#11011111bjbp0.3,k43movr1,#14k43:movp0,#10111111bjbp0.3,k44movr1,#15k44:movp0,#01111111bjbp0.3,kendmovr1,#16kend:ret

键盘扫描终止了,寄放器r1的值就直接表示了是那个键按下的,根据不同的键值去执行不同的程序,从而实现了十六个矩阵键盘扫描,同样原理,最多可以识别255个按键的矩阵扫描。

我们可以每次键盘扫描开始时检查r0的值是否为0,只有在为0才扫描键盘,不为0就证明刚刚扫描过键值,相应的按键工作还没有完成。但是必需记得,每个按键命令执行完成后,要给r0写上0,表示可以扫描键盘。

本键盘扫描程序的优点在于:不用专门的按键延时程序,提高了cpu效率,也不用中断来扫描键盘,节省了硬件资源。另外,本键盘扫描程序,每次扫描占用cpu时最短,不管有键按下或者无键按下都可以在很短的时间完成一次扫描。

还有,本程序只使用几条最常用的汇编命令,mov/jb/jmp/ret,而这几条命令是最常用、最易懂、最好学的命令!有的键盘扫描程序还用与呀、或呀、移位呀、查表呀,我都还没有看懂。字串5

当然,以上只是站长初学单片机的一点个人见解,欢迎广大单片机爱好者指正,希望大家将自己最认可的键盘扫描程序公布出来,让大家一起共享!最终,祝愿大家学习进步!工作顺利!

说明:本站数显fm无线发射板中虽然不是用矩阵扫描,但是按键消抖动原理和上面一致,按键功能复用原理也和上面一致,用起来感觉很好!在键盘的10ms延时过程中,cpu刚好可以去做几件事并在10ms左右做完。所以,产品中凡是要用到按键扫描的,都可以让cpu去做别的事情,键盘延时消抖动唯一的好处就是,程序写起来会便利一点。

经典的矩阵键盘扫描程序

键盘是单片机常用输入设备,在按键数量较多时,为了节省i/o口等单片机资源,一般采取扫描的方式来识别终究是哪一个键被按下。即通过确定被按下的键处在哪一行哪一列来确定该键的位置,获取键值以启动相应的功能程序。

4*4矩阵键盘的结构如图1(实物参考见万用板矩阵键盘制作技巧)。在本例中,矩阵键盘的四列依次接到单片机的p1.0~p1.3,四行依次接到单片机的p1.4~p1.7;同时,将列线上拉,通过10k电阻接电源。

图1查找哪个按键被按下的方法为:一个一个地查找。

先第一行输出0,检查列线是否非全高;

否则其次行输出0,检查列线是否非全高;

否则第三行输出0,检查列线是否非全高;

假使某行输出0时,查到列线非全高,则该行有按键按下;

根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。下面是具体程序:

voidcheck_key(void){unsignedcharrow,col,tmp1,tmp2;tmp1=0x10;//tmp1用来设置p1口的输出,取反后使p1.4~p1.7中有一个为0for(row=0;rowsbita=p0^0;#defineucharunsignedchar#defineuintunsignedintvoiddelay(uintz){uintx,y;for(x=z;x>0;x--)0;y--);}

voiddelayus2x(unsignedchart){

while(--t);}voiddelay750us(){delayus2x(245);delayus2x(122);}voiddelay1500us(){

delayus2x(245);

delayus2x(245);

delayus2x(245);}voiddelay2300us(){

delayus2x(245);

delayus2x(245);

delayus2x(245);

delayus2x(245);

delayus2x(147);

}voidmain()

//a=~a和delay顺序不能反{while(1){

uinti=50;while(--i)

//中

{

a=1;

delay1500us();

a=0;

delay(20);

}

i=50;

while(--i)

{

a=1;

delay2300us();

a=0;

delay(20);

}

i=50;

while(--i)

{

a=1;

delay750us();

a=0;

delay(20);

}

}

}

//左

//右

51单片机pwm控制舵机程序单片机舵机编程教学篇三

secondequ40h

;给内存ram空间中40h单元起名secondminuteequ41h

;给内存ram空间中41h单元起名minutehourequ42h

;给内存ram空间中42h单元起名hoursecondgeweiequ43h

;给43h单元起名secondgewei存秒的个位secondshiweiequ44h

;给44h单元起名secondshiwei存秒的十位minutegeweiequ45h

;给45h单元起名minutegewei存分的个位minuteshiweiequ46h

;给46h单元起名minuteshiwei存分的十位hourgeweiequ47h

;给47h单元起名hourgewei存小时的个位hourshiweiequ48h

;给48h单元起名hourshiwei存小时的十位org0000h

;复位时程序此后开始sjmpstart

;跳到start进行初始化org000bh

;定时器0中断入口ajmptimer0

;跳转到timer0处

org0030h

;初始化程序从30h开始;初始化startstart:

movsecond,#0

;给秒存储单元second赋初始值0movminute,#0

;给分存储单元minute赋初始值0movhour,#12

;给小时存储单元hour赋初始值12movdptr,#tab

;给数据指针赋值,将dptr指向tab数据表头处mov30h,#0

;给30h单元赋初始值0(用于计20次的50ms中断)movth0,#3ch

;给计数容器的高8位th0赋初始值3chmovtl0,#0b0h

;给计数容器的低8位tl0赋初始值b0hmovtmod,#00000001b

;c/t位设置为0,m1m0设置位10,即模式1定时movtcon,#00010000b

;tr0设置为1,即启动定时器0开始工作setbet0

;ie中的et0位设置为1,开定制器中断0setbea

;ie中的ea位设置为1,开总中断;主程序mainmain:callkey

;调按键子程序keycallprocess

;调数据处理子程序processcalldisplay

;调显示子程序displaysjmpmain

;跳转到main标号处;按键子程序key调时key:movp1,#0feh

;行扫描lcalldelay

;jnbp1.4,hourjia

;p1.4引脚假使是低电平就跳到hourjia处

jnbp1.5,hourjian

;p1.5引脚假使是低电平就跳到hourjian处jnbp1.6,minutejia

;p1.6引脚假使是低电平就跳到mimutejia处jnbp1.7,minutejian

;p1.7引脚假使是低电平就跳到mimutejian处fanhui:ret

;子程序返回(假使没有按键按下)

hourjia:calldelay

;调延时程序目的是跳过按键抖动期(去抖)jbp1.4,fanhui

;p1.4假使是高电平就跳到fanhui处(没键按)jnbp1.4,$

;假使p1.4是低电平就停在当前位置等键释放movr4,hourcjner4,#23,a1

;判断时数字是否为23ajmpa2

a1:inchour

;把小时位加1movsecond,#0

;小时进位,秒归0

ret

a2:movhour,#0

;小时数为23时加一为0

movsecond,#0

;小时进位,秒归0

ret

;子程序返回

hourjian:calldelay

;调延时程序目的是跳过按键抖动期(去抖)jbp1.5,fanhui

jnbp1.5,$

movr5,hourcjner5,#0,a3

ajmpa4a3:dechour

movsecond,#0

reta4:movhour,#23

movsecond,#0ret

minutejia:calldelay

jbp1.6,fanhui

jnbp1.6,$

movr6,minute

cjner6,#59,a5

ajmpa6a5:incminute

movsecond,#0

reta6:movsecond,#0

movminute,#0

movr4,hourcjner4,#23,a10

movhour,#0

reta10:inchour

ret

minutejian:calldelay

jbp1.7,fanhui

jnbp1.7,$

movr7,minutecjner7,#0,a7

ajmpa8a7:decminute

;p1.5假使是高电平就跳到fanhui处(没键按)

;假使p1.5是低电平就停在当前位置等键释放

;判断时数字是否为23

;把小时位减1

;小时数为0时减一为23

;子程序返回

;调延时程序目的是跳过按键抖动期(去抖)

;p1.6假使是高电平就跳到fanhui处(没键按)

;假使p1.6是低电平就停在当前位置等键释放

;判断分钟数是否为59

;把分钟位加1

;给秒存储单元second赋初始值0

;分钟数为59则分钟归0

;判断时数字是否为23

;23时增1归0

;分钟数为59自增1后小时增1

;子程序返回

;调延时程序目的是跳过按键抖动期(去抖)

;p1.7假使是高电平就跳到fanhui处(没键按)

;假使p1.7是低电平就停在当前位置等键释放

;判断分钟数是否为0

;分钟不为0把分钟位减1

movsecond,#0

ret

a8:movminute,#59

;分钟数为0时减一为59movr4,hourcjner4,#0,a9

;判断时钟数是否为0movhour,#23

;时钟数为0减1为23movsecond,#0ret

a9:dechour

;时钟数不为0则减1movsecond,#0

ret

;子程序返回;处理子程序processprocess:mova,second

;把second中的秒值拷贝给amovb,#10

;给寄放器b赋值10divab

;a除以b,结果存入a中,余数存入b中movsecondshiwei,a

;结果即秒的十位数拷贝给secondshiweimovsecondgewei,b

;余数即秒的个位拷贝给secondgeweimova,minute

;把minute中的分值拷贝给amovb,#10

;给寄放器b赋值10divab

;a除以b,结果存入a中,余数存入b中movminuteshiwei,a

;结果即分的十位拷贝给minuteshiweimovminutegewei,b

;余数即分的个位拷贝给minutegeweimova,hour

;把hour中的小时值拷贝给amovb,#10

;给寄放器b赋值10divab

;a除以b,结果存入a中,余数存入b中movhourshiwei,a

;结果即小时的十位拷贝给hourshiweimovhourgewei,b

;余数即小时的个位拷贝给hourgeweiret

;子程序终止返回到主程序;显示子程序displaydisplay:mova,hourshiwei

;小时的十位拷贝给amovca,@a+dptr

;到a+dprt这个数对应的地方找显示段码拷贝给amovp0,a

;把显示段码(小时的十位)送到p0clrp2.0

;将p2.0置低电平,对应的三极管导通calldelay

;调延时(让显示小时十位的数码管持续亮一段时间)setbp2.0

;将p2.0置高电平,对应三极管截止,对应数码管灭mova,hourgewei

;小时的个位拷贝给amovca,@a+dptr

;到a+dprt这个数对应的地方找显示段码拷贝给amovp0,a

;把显示段码(小时的个位)送到p0clrp2.1

;将p2.1置低电平,对应的三极管导通

calldelay

;调延时(让显示小时个位的数码管持续亮一段时间)setbp2.1movp0,#7fhclrp2.1calldelaysetbp2.1

;将p2.1置高电平,对应三极管截止,对应数码管灭mova,minuteshiwei

;分钟的十位拷贝给amovca,@a+dptr

;到a+dprt这个数对应的地方找显示段码拷贝给amovp0,a

;把显示段码(分钟的十位)送到p0clrp2.2

;将p2.2置低电平,对应的三极管导通calldelay

;调延时(让显示分钟十位的数码管持续亮一段时间)setbp2.2

;将p2.2置高电平,对应三极管截止,对应数码管灭mova,minutegewei

;分钟的个位拷贝给amovca,@a+dptr

;到a+dprt这个数对应的地方找显示段码拷贝给amovp0,a

;把显示段码(分钟的个位)送到p0clrp2.3

;将p2.3置低电平,对应的三极管导通

calldelay

;调延时(让显示分钟个位的数码管持续亮一段时间)setbp2.3

;将p2.3置高电平,对应三极管截止,对应数码管灭

movp0,#7fhclrp2.3calldelaysetbp2.3

mova,secondshiwei

;秒的十位拷贝给amovca,@a+dptr

;到a+dprt这个数对应的地方找显示段码拷贝给amovp0,a

;把显示段码(秒钟的十位)送到p0clrp2.4

;将p2.4置低电平,对应的三极管导通calldelay

;调延时(让显示秒钟十位的数码管持续亮一段时间)setbp2.4

;将p2.4置高电平,对应三极管截止,对应数码管灭mova,secondgewei

;秒的个位拷贝给amovca,@a+dptr

;到a+dprt这个数对应的地方找显示段码拷贝给amovp0,a

;把显示段码(秒钟的个位)送到p0clrp2.5

;将p2.5置低电平,对应的三极管导通

calldelay

;调延时(让显示秒钟个位的数码管持续亮一段时间)setbp2.5

;将p2.5置高电平,对应三极管截止,对应数码管灭ret

;显示子程序终止返回主程序;中断服务子程序timer0:movr3,a

;把a中的数据送入r3保护起来inc30h

;30h单元中的数加1mova,30h

;30h单元中的数据拷贝给acjnea,#20,jixu

;a中的数据与20比较不相等就跳转到jixu处mov30h,#0

;(假使30h单元计满20了)给30h赋值0incsecond

;把second中的秒钟数加1mova,second

;把second中的数据拷贝给acjnea,#60,jixu

;a中的数据与60比较不相等就跳转到jixu处movsecond,#0

;给秒second赋值0incminute

;把minute中的分钟数加1mova,minute

;把minute中的数据拷贝给acjnea,#60,jixu

;a中的数据与60比较不相等就跳转到jixu处movminute,#0

;给分钟minute赋值0inchour

;把hour中的小时数据加1mova,hour

;把hour中的数据拷贝给acjnea,#24,jixu

;a中的数据与24比较不相等就跳转到jixu处movhour,#0

;给小时hour赋值0jixu:mova,r3

;把方才送入r3中的数据还给amovth0,#3ch

;给计数容器的高8位th0赋初始值3chmovtl0,#0b0h

;给计数容器的低8位tl0赋初始值b0hreti

;中断子程序返回主程序;延时子程序delay:movr0,#50

;给r0赋值50d2:movr1,#10

;给r1赋值10d1:djnzr1,d1

;r1减1不等于0跳到d1处djnzr0,d2

;r0减1不等于0跳到d2处

ret

;延时子程序终止返回调用该程序的下一条;下面的数据表中存储的是显示段码(共阳)tab:db0c0h,0f9h,0a4h,0b0h,99h

;从tab处开始存储0、1、2、3、4

db92h,82h,0f8h,80h,90h

;5、6、7、8、9对应的显示段码end

;程序终止

51单片机pwm控制舵机程序单片机舵机编程教学篇四

#include#defineucharunsignedchar#defineuintunsignedintucharcodetable[]=“iloveyou!〞;ucharcodetable1[]=“2023:06:14〞;sbitlcden=p3^5;sbitlcdrs=p3^4;

voiddelayms(uintz){uintx,y;for(x=z;x>0;x--)

for(y=110;y>0;y--);}

voidwrite_com(ucharcom){lcdrs=0;p0=com;delayms(5);lcden=0;}

voidwrite_data(uchardate){lcdrs=1;p0=date;delayms(5);lcden=1;delayms(5);lcden=0;}

voidinit(){lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}

voidmain()

//定义使能端、命令选择端

//延时函数

//写入命令函数

//写入数据//初始化lcd

{

}init();write_com(0x80);for(num=0;num

//数码管段选接口sbitw1=p2^0;

//数码管位选接口sbitw2=p2^1;

//数码管位选接口sbitw3=p2^2;

//数码管位选接口sbitw4=p2^3;

//数码管位选接口sbittrig=p0^5;

//测距模块trig接口sbitecho=p3^2;

//测距模块echo接口sbittest=p3^1;

//测试灯接口sbitk=p3^4;

//测距按键接口sbitfind=p3^5;

//查询历史数据按键接口sbitout=p3^6;

//退出历史查询按键接口sbitfind_light=p2^4;

//历史数据查询指示灯(绿灯)sbitwhithout_light=p2^5;

//历史数据查询完毕指示灯(红灯)sbitwarn=p2^6;bitsucceed_flag;

//测量成功标志位uinttimel=0,timeh=0;

//接收时间数据中间变量ucharcodetemp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论