最新51单片机测距程序机器人小车(5篇)
文件格式:DOCX
时间:2023-03-21 00:00:00    小编:Darcy大发

最新51单片机测距程序机器人小车(5篇)

小编:Darcy大发

范文为教学中作为模范的文章,也常常用来指写作的模板。常常用于文秘写作的参考,也可以作为演讲材料编写前的参考。相信许多人会觉得范文很难写?以下是我为大家搜集的优质范文,仅供参考,一起来看看吧

51单片机测距程序机器人小车篇一

;给内存ram空间中40h单元起名second minute equ 41h

;给内存ram空间中41h单元起名minute hour equ 42h

;给内存ram空间中42h单元起名hour secondgewei equ 43h

;给43h单元起名secondgewei存秒的个位 secondshiwei equ 44h

;给44h单元起名secondshiwei存秒的十位 minutegewei equ 45h

;给45h单元起名minutegewei存分的个位 minuteshiwei equ 46h

;给46h单元起名minuteshiwei存分的十位 hourgewei equ 47h

;给47h单元起名hourgewei存小时的个位 hourshiwei equ 48h

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

;复位时程序从此开始 sjmp start

;跳到start进行初始化 org 000bh

;定时器 0中断入口 ajmp timer0

;跳转到timer0处

org 0030h

;初始化程序从30h开始;---------------初始化start------------------------------start:

mov second, #0

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

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

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

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

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

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

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

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

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

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

;ie中的ea位设置为1,开总中断;-----------------------主程序main-----------------------------main:call key

;调按键子程序key call process

;调数据处理子程序process call display

;调显示子程序display sjmp main

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

;行扫描 lcall delay

;jnb p1.4,hourjia

;p1.4引脚如果是低电平就跳到hourjia处

jnb p1.5,hourjian

;p1.5引脚如果是低电平就跳到hourjian处 jnb p1.6,minutejia

;p1.6引脚如果是低电平就跳到mimutejia处 jnb p1.7,minutejian

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

;子程序返回(如果没有按键按下)

hourjia:call delay

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

;p1.4如果是高电平就跳到fanhui处(没键按)jnb p1.4,$

;如果p1.4是低电平就停在当前位置等键释放 mov r4,hour cjne r4,#23,a1

;判断时数字是否为23 ajmp a2

a1:inc hour

;把小时位加1 mov second, #0

;小时进位,秒归0

ret

a2:mov hour,#0

;小时数为23时加一为0

mov second, #0

;小时进位,秒归0

ret

;子程序返回

hourjian:call delay

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

jnb p1.5,$

mov r5,hour cjne r5,#0,a3

ajmp a4 a3:dec hour

mov second, #0

ret a4:mov hour,#23

mov second, #0 ret

minutejia:call delay

jb p1.6,fanhui

jnb p1.6,$

mov r6,minute

cjne r6,#59,a5

ajmp a6 a5:inc minute

mov second, #0

ret a6:mov second, #0

mov minute, #0

mov r4,hour cjne r4,#23,a10

mov hour,#0

ret a10:inc hour

ret

minutejian:call delay

jb p1.7,fanhui

jnb p1.7,$

mov r7,minute cjne r7,#0,a7

ajmp a8 a7:dec minute

;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

mov second, #0

ret

a8:mov minute, #59

;分钟数为0时减一为59 mov r4,hour cjne r4,#0,a9

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

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

a9:dec hour

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

ret

;子程序返回;-------------------处理子程序process-----------------------process:mov a, second

;把second中的秒值拷贝给a mov b, #10

;给寄存器b赋值10 div ab

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

;结果即秒的十位数拷贝给secondshiwei mov secondgewei , b

;余数即秒的个位拷贝给secondgewei mov a, minute

;把minute中的分值拷贝给a mov b, #10

;给寄存器b赋值10 div ab

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

;结果即分的十位拷贝给minuteshiwei mov minutegewei , b

;余数即分的个位拷贝给minutegewei mov a, hour

;把hour中的小时值拷贝给a mov b, #10

;给寄存器b赋值10 div ab

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

;结果即小时的十位拷贝给hourshiwei mov hourgewei , b

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

;子程序结束返回到主程序;-----------------显示子程序display--------------display:mov a, hourshiwei

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

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

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

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

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

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

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

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

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

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

call delay

;调延时(让显示小时个位的数码管持续亮一段时间)setb p2.1 mov p0,#7fh clr p2.1 call delay setb p2.1

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

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

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

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

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

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

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

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

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

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

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

call delay

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

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

mov p0,#7fh clr p2.3 call delay setb p2.3

mov a, secondshiwei

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

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

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

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

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

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

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

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

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

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

call delay

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

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

;显示子程序结束返回主程序;--------------------中断服务子程序----------------------------timer0:mov r3, a

;把a中的数据送入r3保护起来 inc 30h

;30h单元中的数加1 mov a, 30h

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

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

;(如果30h单元计满20了)给30h赋值0 inc second

;把second中的秒钟数加1 mov a,second

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

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

;给秒second赋值0 inc minute

;把minute中的分钟数加1 mov a, minute

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

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

;给分钟minute赋值0 inc hour

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

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

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

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

;把刚才送入r3中的数据还给a mov th0,#3ch

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

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

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

;给r0赋值50 d2:mov r1, #10

;给r1赋值10 d1:djnz r1, d1

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

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

ret

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

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

db 92h ,82h ,0f8h,80h ,90h

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

;程序结束

51单片机测距程序机器人小车篇二

超声波测距

超声波发射器向某一方向发射超声波,在发射的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离s,即:s=340m/s× t / 2。这就是所谓的时间差测距法。本实验利用超声波测得的距离从串口中显示。

元器件清单:

arduino uno × 1; usb数据线 × 1 ; 杜邦线若干;

超声波传感器 × 1; 无线蓝牙模块×1;

知识要点:

pulsein():用于检测引脚输出的高低电平的脉冲宽度。pulsein(pin, value)pulsein(pin, value, timeout)pin---需要读取脉冲的引脚 value---需要读取的脉冲类型,high或low

timeout---超时时间,单位微秒,数据类型为无符号长整型。

使用方法及时序图:

1、使用arduino采用数字引脚给sr04的trig引脚至少10μs的高电平信号,触发sr04模块测距功能;

2、触发后,模块会自动发送8个40khz的超声波脉冲,并自动检测是否有信号返回。这步会由模块内部自动完成。

3、如有信号返回,echo引脚会输出高电平,高电平持续的时间就是超声波从发射到返回的时间。此时,我们能使用pulsein()函数获取到测距的结果,并计算出距被测物的实际距离。

sr04与arduino接线示意图:

arduino示例程序:

/* 功能:利用sr04超声波传感器进行测距,并用串口显示测出的距离值

// 设定sr04连接的arduino引脚 const int trigpin = 2;const int echopin = 3;float distance;void setup()

{

// 初始化串口通信及连接sr04的引脚

(9600);

pinmode(trigpin, output);

// 要检测引脚上输入的脉冲宽度,需要先设置为输入状态

pinmode(echopin, input);

ln(“ultrasonic sensor:”);}

void loop(){

// 产生一个10us的高脉冲去触发trigpin

digitalwrite(trigpin, low);

delaymicroseconds(2);

digitalwrite(trigpin, high);

delaymicroseconds(10);

digitalwrite(trigpin, low);

// 检测脉冲宽度,并计算出距离

distance = pulsein(echopin, high)/ 58.00;

(“the distance is “);

(distance);

(“cm”);

ln();

delay(1000);}

连线实物图:

下载完程序后,打开串口监视器,并将超声波传感器对向需要测量的物体,即可看到当前超声波传感器距物体的距离,如下图:

51单片机测距程序机器人小车篇三

51单片机舵机程序不用定时器:自己整理的不用定时器调舵机向左,中,右三个方向摆动的51单片机程序

#include sbit a=p0^0;#define uchar unsigned char #define uint unsigned int void delay(uint z){ uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}

猜你喜欢 网友关注 本周热点 精品推荐
精选文章
基于你的浏览为你整理资料合集
复制