单片机编程实例大全(c51单片机编程实例讲解)
大家好,今天小编来为大家解答单片机编程实例大全这个问题,c51单片机编程实例讲解很多人还不知道,现在让我们一起来看看吧!
51单片机编程求指导。。。
嘿嘿楼上的老兄给出的程序也不对呀看上去挺工整的,错误好几出啊,是得不到正确结果的。
其实算法很简单,只要熟悉一下单片机的加法指令和循环移位指令,自己就可以编写出来。
1算法:
就是使用指针连续对20H开始的连续4个单字节二进制数相加,结果存入31H单元,要考虑进位,(进位部分存入31H单元)
求平均值就是对和除4,可以使用循环右移指令每移一次相当于除2总共2次就行了。
2楼上的错误:使用指令 ADD A,31H求的和在累加器A里,并没有存入31H
使用指令 MOV A,31H;低位送A
RRC A;带进位循环右移完成一次除2
同样没有将结果回送给31H单元(保存)
呵呵满意就选满意回答(想要正确程序可以发消息给我)
单片机编程题
定时器在12MHz的时钟时,每个机器周期(1us)+1,工作模式1时(16位模式)最大计数值为65536,所以定时时间最大在65.536ms,达不到500ms的要求!你可以设置50ms定时中断一次,在中断程序中计数够10次,让灯循环一次即可。
1、计算计数初值X:
由于晶振为12 MHz,所以机器周期Tcy为50 ms。所以:
X=65536-50000=15536=3CB0H
即应将3CH送入TH1中,B0H送入TL1中
2、求T0的方式控制字TMOD:
M1M0=01,GATE=0,C/T=0,可取方式控制字为10H;
3、程序:
ORG 0000H
LJMP MAIN;跳转到主程序
ORG 001BH;T1的中断入口地址
LJMP DVT1;转向中断服务程序
ORG 0100H
MAIN:
MOV A,#00000001H;设定显示初值,共阴极接法
MOV R0,#00H;记录定时次数的寄存器
MOV TMOD,#10H;置T0工作于方式1
MOV TH1,#3CH;装入计数初值
MOV TL1,#0B0H
SETB ET1;T0开中断
SETB EA;CPU开中断
SETB TR1;启动T0
SJMP$;等待中断
DVT0:
INC R0;每中断一次(50ms)加1
CJNE R0,#10,EXIT;不够10次即未到500ms退出
MOV P1,A;亮灯
RL A; A的值左移,准备下一次灯的状态
MOV R0,#00H;清除计数值,重新计数
EXIT:
MOV TH0,#0D8H;重新装入计数值
MOV TL0,#0F0H
RETI;中断返回
end
求教几道单片机编程题
此题如下:设系统时钟频率谓12MHZ编程实现从p1.1输出周期1s的方波。
注:用T1计数实现。T1工作于计数方式时,计数脉冲通过T1(p3.5)输入。T0定时到对T1(p3.5)取反一次,则T1(p3.5)每20ms产生一个计数脉冲,那么定时500ms只需2次。设T1工作于方式2,T0工作于方式1,定时方式;则这时方式控制字为61H.定时计数器T0,T1都采用中断方式工作。
程序如下:
ORG
000H
LJMP
MAIN
ORG
000BH
MOV
TH0,#0D8H
MOV
TL0,#0F0H
CPL
P3.5
RETI
ORG
001BH
CPL
P1.1
RETI
ORG
0100H
MAIN:
MOV
TMOD,#61H
MOV
TH0,#0D8H
MOV
TL0,#0F0H
MOV
R2,#00H
MOV
TH1,#0E7H
MOV
TL1,#0E7H
SETB
EA
SETB
ETO
SETB
ET1
SETB
TR0
SETB
TR1
SJMP
$
END
有一点觉得很奇怪:它是通过对T1(p3.5)取反计数的,但是每取反两次不就又变回原来的值了吗,到头来哪儿起到计数作用了,还有就是R2到底起到什么作用了。本人初学,问题可能较简单,莫见笑
单片机编程实例大全和c51单片机编程实例讲解的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!