导航:首页 > 操作系统 > zx单片机

zx单片机

发布时间:2022-10-05 08:32:35

1. 编程:使用单片机P1口控制8个LED。显示方式:自上而下逐个点亮,再自下而上逐个点亮,如此循环

给你个简单点的
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV P1,#01111111B ;P1口低电平 对应灯亮 点亮P1.7对应的LED
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#10111111B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#11011111B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#11101111B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#11110111B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#11111011B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#11111101B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#11111110B;点亮P1.0对应LED
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#11111110B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#11111101B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#11111011B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#11110111B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#11101111B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#11011111B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#10111111B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
MOV P1,#01111111B
LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况
SJMP MAIN
;延时250ms子程序
DLY_250MS:MOV R5,#5
DLY1: MOV R6,#100
DLY0: MOV R7,#250
DLY: DJNZ R7,DLY
DJNZ R6,DLY0
DJNZ R5,DLY1
RET
;延时500ms子程序
DLY_500MS:MOV R4,#2
DLY2: LCALL DLY_250MS
DJNZ R4,DLY2
RET
END

2. 单片机用C语言写两个数码管显示0到59循环的程序在归0

#include<reg52.h>
sbit wei=P3^0;
sbit led1=P3^2;
sbit led2=P3^3;
char tt =0;
char i=0;
unsigned char code led_zx[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
void mdelay(unsigned int delaytime)
{
int c;
for(;delaytime!=0;delaytime--)
for(c=0;c!=124;c++);
}
void main()
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
while(1)
{
if ( tt==20 )
{
tt=0;
if ( wei==1 ) { i++; }
}
if ( i==59 ) { i=0; }
led2=0;
P1=(led_zx[i%10]);
led1=1;
mdelay(50);
led1=0;
P1=(led_zx[i/10]);
led2=1;
mdelay(50);
}
}
void timer0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
tt++;
}

3. 51单片机电子钟 通过按键调整时间 这块程序怎么写(方法)

ORG 0000H ;主程序入口
LJMP MAIN ;跳转到标号MAIN执行
ORG 000BH ;定时器T0中断入口
AJMP PTF0 ;跳转到标号PTF0执行
HOUR EQU 4AH ;赋值伪指令
MIN EQU 4BH
SEC EQU 4CH
BUFF EQU 4DH
;*************************************************************************************
;主程序
MAIN: MOV HOUR,#00H ;时,分,秒,标记清零
MOV MIN,#00H
MOV SEC,#00H
MOV BUFF,#00H
MOV SP,#60H ;设堆栈指针
MOV TH0,#3CH ;定时器赋初值
MOV TL0,#0B0H
MOV 40H,#14H ;设循环次数20次
MOV TMOD,#1 ;写TMOD
MOV IP,#2 ;写IP
MOV IE,#82H ;开中断
SETB TR0 ;启动定时器
LOOP: ACALL DISPLAY ;调用显示程序
JNB P3.0,FEN ;校时键按否?否,跳转到FEN
ZX: ACALL DISPLAY
JB P3.0,ZX
MOV A,HOUR ;时加1
ADD A,#1
DA A
CJNE A,#24H,BI ;时加到24时否?是,清零
CLR A
BI: MOV HOUR,A
MOV SEC,#00H ;秒清零
FEN: JNB P3.1,YY ;校分键按下否?否,跳转到YY
ZC: ACALL DISPLAY
JB P3.1,ZC
MOV A,MIN ;分加1
ADD A,#1
DA A
CJNE A,#60H,CI ;分加到60否?是,清零
CLR A
CI: MOV MIN,A
MOV SEC,#00H ;秒清零
YY: AJMP LOOP
;***************************************************************************************
;中断服务程序
PTF0: MOV TH0,#3CH ;初值重装
MOV TL0,#0B0H
CLR TR0 ;关定时器
CLR A ;清A
DJNZ 40H,XX ;1秒到否?否,跳转到XX
MOV 40H,#14H ;重写循环次数
MOV A,SEC ;秒单元加1
ADD A,#1
DA A
MOV SEC,A
CJNE A,#60H,PTF0R ;60秒到否?否,跳转到PTF0R
JMIN: MOV SEC,#00H ;秒清零
MOV A,MIN ;分单元加1
ADD A,#1
DA A
MOV MIN,A
CJNE A,#60H, PTF0R ;60分到否?否,跳转到PTF0R
MOV MIN,#00H ;分清零
JHOUR: MOV SEC,#00H ;秒清零
MOV A,HOUR ;时单元加1
ADD A,#1
DA A
MOV HOUR,A
CJNE A,#24H, PTF0R ;24时到否?否,跳转到PTF0R
MOV HOUR,#00H ;时清零
AJMP PTF0R ;跳转到PTF0R
XX: MOV R7,40H ;给小数点做标记,1和0
CJNE R7,#0AH,NEQ
EQ: NOP
AJMP PTF0R
NEQ: JC YEQ
MOV BUFF,#00H
AJMP PTF0R
YEQ: MOV BUFF,#0FFH
AJMP PTF0R
PTF0R: SETB TR0
RETI
;***************************************************************************************
;显示子程序
DISPLAY: MOV R5,BUFF ;根据标记输出带点和不带点的数字
CJNE R5,#00H,CVB ;根据标记查不同的表
MOV DPTR,#TAB1
LJMP TYU
CVB: MOV DPTR,#TAB
TYU: MOV A,MIN ;显示分钟的个位
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0h
CLR P2.4
ACALL DELAY
MOV A,MIN ;显示分钟的十位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0H
CLR P2.5
ACALL DELAY
MOV A,HOUR ;显示时钟的个位
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0H
CLR P2.6
ACALL DELAY
MOV A,HOUR ;显示时钟的十位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0H
CLR P2.7
ACALL DELAY
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;不带小数点的字型码
TAB1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH ;带小数点的字型码
;****************************************************************************************
;延时子程序
DELAY: MOV R4,#20
YAN: MOV R5,#10
SHI: DJNZ R5,SHI
DJNZ R4,YAN
RET
END

以前我的单片机课程设计,提供给你参考参考,不过只有调分和调时的。。。

4. 汇编语言单片机求大神讲解一段程序

MOV A,31H ; 让 累加器A 等于 寄存器31H内的数值
ANL A,#0FH ; 累加器A 高4位清零
ACALL ZX-SCAN ; 调用地址ZX-SCAN的子程序
MOV SBUF,A ; 将累加器A 的数值 从串口 发送出去
JNB TF,$ ; 检测 如果 TF 位为 0 ,则继续执行本指令,否则执行下一条指令
MOV A,31H ; 让 累加器A 等于 寄存器31H内的数值
ANL A,#0F0H ; 累加器A 高4位清零
ACALL ZX-SCAN ; 调用地址ZX-SCAN的子程序
MOV SBUF,A ; 将累加器A 的数值 从串口 发送出去
JNB T1,$ ; 检测 如果 T1 位为 0 ,则继续执行本指令,否则执行下一条指令
CLR T1 ; T1 位清零
MOV DPTR,#ZX-TBJ ; 让 DPTR 指向地址 ZX-TBJ 的数据表
MOVC A ,@A+DPTR ; 从数据表读一个字节到累加器A
RET ; 子程序返回

5. 单片机根据环境亮暗智能控制LED的开启和关断

不行的,没有输入检测量,怎么能让单片机控制开启和关断呢。找一个光敏传感器做输入,就可以了!传感器电路要放大的啊,在网上多找找看,很多的!

6. 怎么用C语言做单片机的精确延时

在单片机应用中,经常会遇到需要短时间延时的情况,一般都是几十到几百μs,并且需要很高的精度(比如用单片机驱动DS18B20时,误差容许的范围在十几μs以内,不然很容易出错);而某些情况下延时时间较长,用计时器往往有点小题大做。另外在特殊情况下,计时器甚至已经全部用于其他方面的定时处理,此时就只能使用软件定时了[1]。
1 C语言程序延时
Keil C51的编程语言常用的有2种: 一种是汇编语言;另一种是C 语言。用汇编语言写单片机程序时,精确时间延时是相对容易解决的。比如,用的是晶振频率为12 MHz的AT89C51,打算延时20 μs,51单片机的指令周期是晶振频率的1/12,即一个机器周期为1 μs;“MOV R0,#X”需要2个机器周期,DJNZ也需要2个机器周期,单循环延时时间t=2X+3(X为装入寄存器R0的时间常数)[2]。这样,存入R0里的数初始化为8即可,其精度可以达到1 μs。用这种方法,可以非常方便地实现512 μs以下时间的延时。如果需要更长时间,可以使用两层或更多层的嵌套,当然其精度误差会随着嵌套层的增加而成倍增加。
虽然汇编语言的机器代码生成效率很高,但可读性却并不强,复杂一点的程序就更难读懂;而C语言在大多数情况下,其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,且C 语言还可以嵌入汇编程序来解决高时效性的代码编写问题。就开发周期而言,中大型软件的编写使用C 语言的开发周期通常要比汇编语言短很多,因此研究C语言程序的精确延时性能具有重要的意义。
C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。
2 单层循环延时精度分析
下面是进行μs级延时的while程序代码。
延时函数:
void delay1(unsigned char i) {
while(i );}
主函数:
void main() {
while(1) {
delay1(i);
}
}
使用Keil C51的反汇编功能,延时函数的汇编代码如下:
C:0x00E6AE07MOVR6,0x07
C:0x00E81FDECR7
C:0x00E9EEMOVA,R6
C:0x00EA70FAJNZC:00E6
C:0x00EC22RET

图1 断点设置位置图
通过对i赋值为10,在主程序中图1所示的位置设置断点。经过测试,第1次执行到断点处的时间为457 μs,再次执行到该处的时间为531 μs,第3次执行到断点处的时间为605 μs,10次while循环的时间为74 μs,整个测试结果如图2所示。

图2 使用i--方式测试仿真结果图
通过对汇编代码分析,时间延迟t=7X+4(其中X为i的取值)。测试表明,for循环方式虽然生成的代码与用while语句不大一样,但是这两种方法的效率几乎相同。C语言中的自减方式有两种,前面都使用的是i--的方式,能不能使用--i方式来获得不同的效果呢?将前面的主函数保持不变,delay1函数修改为下面的方式:
void delay1(unsigned char i) {
while(--i);}
同样进行反汇编,得到如下结果:
C:0x00E3DFFEDJNZR7,
C:00E3C:0x00E522RET
比较发现,--i的汇编代码效率明显高于i--方式。由于只有1条语句DJNZ,执行只需要2个时钟周期, 1个时钟周期按1 μs计算,其延时精度为2 μs;另外,RET需要2个时钟周期,能够达到汇编语言代码的效率。按前面的测试条件进行测试,第1次执行到断点处的时间为437 μs,再次执行到该处的时间为465 μs,第3次执行到断点处的时间为493 μs,10次while循环的时间为28 μs,整个测试结果如图3所示。

图3 使用--i方式测试仿真结果图
调整i的取值,i取8时延时时间为24 μs,i取9时延时时间为26 μs。通过分析得出,10次循环为28 μs是由于外层循环造成的,其精度可以达到2 μs。在设计时应该考虑参数传递和RET语句执行所需要的时间周期。实验分析发现,for语句使用--i方式,同样能够达到与汇编代码相同的精度。i取不同值时延时仿真结果如图4所示。

图4 i取不同值时延时仿真结果图
3 多重嵌套下的C程序延时
在某些情况下,延时较长,仅使用单层循环方式是不能完成的。此时,只能使用多层循环方式,那么多重循环条件下,C程序的精度如何呢?下面是一个使用for语句实现1 s延时的函数。
延时函数
void delay1s(void) {
for(k=100;k>0;k--) //定时1 s
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
主函数调用延时函数代码段:
while(1) {
delay1s();
scond+=1;
}
为了直接衡量这段代码的效果,利用Keil C找出这段代码产生的汇编代码:
C:0x00B37002JNZ
C:00B7C:0x00B5150CDEC0x0C
C:0x00B7E50DMOVA,0x0D
C:0x00B9450CORLA,0x0C
C:0x00BB70DEJNZC:009B
C:0x00BDE50BMOVA,0x0B
C:0x00BF150BDEC0x0B
C:0x00C17002JNZC:00C5
C:0x00C3150ADEC0x0A
C:0x00C5E50BMOVA,0x0B
C:0x00C7450AORLA,0x0A
C:0x00C970CAJNZC:0095
C:0x00CB22RET
分析汇编代码,其他汇编代码使用的不是DJNZ跳转方式,而是DEC和JNZ语句来实现循环判断。1条JNZ指令要花费2个时钟周期,3条指令就需要6个机器周期,MOV指令和DEC指令各需要1小时钟周期,1个时钟周期按1 μs算,其精度最多达到8 μs,最后加上一条LCALL和一条RET语句,所以整个延时精度较差[4]。
利用Keil C的测试工具,在一处设置一个断点。第1次执行到中断处的时间为0.000 513 s,第2次执行到中断处的时间为1.000 922 s,时间延迟为1.000 409 s,测试结果如图5所示。对于上面的3种循环嵌套,循环次数为100×20×248=496 000,每次循环的时间约为2 μs。

图5 三重嵌套循环1 s实现时间测试结果
为获取与汇编语言延时的差距,同样进行1 s的延时,程序代码段如下:
LCALL DELY1S
INC Second
DELY1S:MOV R5,#100
D2:MOV R6,#20
D1:MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,D2
RET
通过Keil C51测试,其实际延迟时间为0.997 943 s。虽然C语言实现延时方式的汇编代码复杂度增加,但是与汇编语言实现的方式性能差距并不大。
4 总结
汇编语言在实时性方面具有较大的优越性,虽然使用Keil C51可以在C语言程序中嵌入汇编代码,但是复杂度明显提高。实验证明,只要合理地运用C语言,在延时编程方面就可以达到与汇编语言相近的精度。为了获得精确的时间延迟,可通过Keil C工具的仿真功能,调整延迟量,从而得到较理想的结果。

阅读全文

与zx单片机相关的资料

热点内容
免费不用下载网站 浏览:893
可以播放的欧美男男电影 浏览:949
ldx218舵机用单片机控制 浏览:898
河南dns服务器地址大全 浏览:775
中字四级片 浏览:769
青岛本地服务器地址 浏览:987
白鹿原小说免费阅读 浏览:356
女主姓简的小说 浏览:210
提示命令符框 浏览:354
韩剧伦理女同都有哪些 浏览:35
高黄男男小说 浏览:503
华娱小说多女主的小说 浏览:747
收了杨玉环的历史小说 浏览:878
R语音命令 浏览:290
男人最新网址你懂的 浏览:572
怎么把文件夹放在电脑顶端 浏览:532
delphi入门pdf 浏览:418
岛国片app 浏览:955
电影院维语版。 浏览:298
php订单代码 浏览:35