范文为教学中作为模范的文章,也常常用来指写作的模板。常常用于文秘写作的参考,也可以作为演讲材料编写前的参考。相信许多人会觉得范文很难写?以下是我为大家搜集的优质范文,仅供参考,一起来看看吧
;给内存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
;程序结束
超声波测距
超声波发射器向某一方向发射超声波,在发射的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。声波在空气中的传播速度为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单片机程序
#include