① 单片机延时1ms问题
首先,不知道你的晶振频率是多少,然后不知道你使用的是哪种类型的单片机。
我根据KEILC的测试:for循环这个语句是双周期指令2个机器周期,j=0;j<33;j++。这有三步单周期指令,每次三个机器周期。。。所以时间是(3j+2) 乘以循环次数i。就是时间微秒
上述指令在12MHZ的晶振频率,AT89S52的单片机测试情况下为0.0001060秒。也就是1MS
② 单片机中定时器的初值产生1ms的定时,到底是65536-1000还是65535-1000 为什么啊急急急
定时器计数最大值为65535,再计一次则溢出,产生中断。也就是说初值设置成65535(65536-1)时,定时1个机器周期。所以正确答案是65536-1000,此时定时1000个机器周期,12M晶振1个机器周期为1微秒,1000个就是1ms啦!
③ 求一下51单片机汇编程序的解释:不太明确这段程序功能,希望哪位大侠指点下!谢谢!
这是一个8位2进制数转换成10进制显示的程序,或者叫计算器。
改变的地方是为了仿真成功。低位在右。1101B转换过来正好是13
;p3口接段码a,b,c,d,e,f,g,p2.5-7口接位码,选哪个数码管显示
a_bitequ20h;个位数存放处
b_bitequ21h;十位数存放处
org0000H
SJMPmain
ORG0030H
main:
movp0,#0ffh;初始化p0口
loop:mova,p0;将a中的十六进制数转换成10进制
movb,#10;10进制/10=10进制
divab
movb_bit,a;十位在a
mova_bit,b;个位在b
movdptr,#numtab;指定查表启始地址
mova,a_bit;取个位数
MOVCA,@A+DPTR;查个位数的7段代码
movp3,a
acalld1ms
movp2,#40h;显示个位数
acalld1ms
movp2,#0ffh;屏蔽所有显示
acalld1ms
movdptr,#numtab;指定查表启始地址
mova,b_bit;取十位数
MOVCA,@A+DPTR;查十位数的7段代码
movp3,a
calld1ms
movp2,#80h;显示十位数
acalld1ms
movp2,#0ffh;屏蔽所有显示
SJMPloop
d1ms:
MOVR2,#200
DJNZR2,$
nop
RET
numtab:DB3FH,6H,5BH,4FH,66H,6DH,7DH,7H,7FH,6FH
end
你看这句,loop:mova,p0;将a中的十六进制数转换成10进制
把p0送A才开始的转换。这可不是我加的。不知你说的fpga在哪里。当然把p0改成fpga就是你说的那个功能了。
总之理解成16进制转换成2位10进制数再显示就对了,至于16进制数是哪来的就全看在那用了吧。
④ 51里面 D1MS 地址码 机器码各是多少
地址码和机器码是产品出厂时已经设定的号码,用以区别不同的设备,就如同机器的身份号。地址码一般为7位数,机器码为16位数。数字信息机和语音信息机采用的是地址码。可手动更改数字信息机的地址码,每台机器最多可设定7个地址码,详细操作请见说明书。语音信息机最多可设7个地址码,每个地址码7位,不能手写,只能用专业写码器写码或更改。呼叫器、控制中心都有机器码,为一组16位的数码,出厂时设定,不能更改。呼叫器设定号码就是把我们需要设定的餐桌号通过软件与该呼叫器的机器码对应。地址码和机器码的作用是区别每一个呼叫器、每一个主机、每一个信息机,所以多嘴猫产品的对应关系可以任意设定,不会出现串号等现象,保证了产品质量。
⑤ 求解释单片机程序
这是一个 8位2进制数转换成10进制显示的程序,或者叫计算器。
改变的地方是为了仿真成功。低位在右。 1101B 转换过来正好是13
;p3口接段码a,b,c,d,e,f,g, p2.5-7口接位码,选哪个数码管显示
a_bit equ 20h ;个位数存放处
b_bit equ 21h ;十位数存放处
org 0000H
SJMP main
ORG 0030H
main:
mov p0,#0ffh ;初始化p0口
loop: mov a,p0 ;将a中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
mov dptr,#numtab ;指定查表启始地址
mov a,a_bit ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
mov p3,a
acall d1ms
mov p2,#40h ;显示个位数
acall d1ms
mov p2,#0ffh ;屏蔽所有显示
acall d1ms
mov dptr,#numtab ;指定查表启始地址
mov a,b_bit ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
mov p3,a
call d1ms
mov p2,#80h ;显示十位数
acall d1ms
mov p2,#0ffh ;屏蔽所有显示
SJMP loop
d1ms:
MOV R2,#200
DJNZ R2,$
nop
RET
numtab: DB 3FH,6H,5BH,4FH,66H,6DH,7DH,7H,7FH,6FH
end
你看这句, loop: mov a,p0 ;将a中的十六进制数转换成10进制
把p0 送A 才开始的转换 。 这可不是我加的。不知你说的fpga在哪里。当然把p0改成fpga就是你说的那个功能了。
总之 理解成16进制转换成2位10进制数再显示就对了, 至于16进制数是哪来的 就全看在那用了吧。
⑥ 求单片机大神,用汇编编写使动态数码管分别显示1-8,时间间隔1秒左右。
使用中断就行了啊,C语言也是这样的,编译器会把C语言转换成汇编语言。然后再转换成HEX文件。下面是在你的程序上修改的,没试过,你编译一下看看有没错误
ORG 00H
LJMP MAIN
ORG 001BH ;定时器1入口地址
LJMP TIMER1_ISR
ORG 0100H
MAIN:
MOV TMOD,#10H
MOV TL1,#0F0H
MOV TH1,#0D8H ;赋初值,定时10毫秒
SETB TR1
MOV IE,#88H
MOV R2,#20 ;R2的值可以随时修改
MOV R3,#100 ;100 * 10MS = 1S
DISP:
MOV A,R2 ;南北方向显示初值R2=20秒
MOV B,#10
DIV AB
MOV P0,A ;段选
MOV P2,#01 ;位选
ACALL D1ms ;延时
MOV P2,#00 ;清零
MOV P0,B
MOV P2,#02
ACALL D1ms
MOV P2,#00 ;清零
LJMP DISP ;这个地方就一直循环,怎样实现定时器的作用??
;*********** 定 时 1 秒 中 断 ***********
TIMER1_ISR:
MOV TL1,#0F0H
MOV TH1,#0D8H ;赋初值,定时10毫秒
PUSH ACC
PUSH PSW
DJNZ R3,TIMER1_END
MOV R3,#100
MOV A,R2
DEC R2
JNZ TIMER1_END
MOV R2,#20
TIMER1_END:
POP PSW
POP ACC
RETI
;************ 延 时 D1ms 程序***********
D1ms:
MOV R7,#02H
DL:
MOV R6,#0FFH
DL1:
DJNZ R6,DL1
DJNZ R7,DL
RET
;***************************************
END
⑦ 单片机关于定时器,定时1ms,定时器中寄存器高低位的值如何设置
你要定时 1ms 即是 1000uS,之所以是减 1000,就是认定计数器的计数脉冲周期为 1uS,
而 1uS 就是晶振(12MHz)的12分频;
这些你理解就好;
至于计数分频值是 0xfc18 还是 0xfc67 不必太在意,如果真的想得到准确的定时,则是需要通过测量以便调节分频值来得到最接近值;
⑧ 一单片机程序问题
部分程序代码:
#include "C8051F020.h" //包含C8051F020硬件信息的头文件
#include "absacc.h" //包含绝对地址访问信息的头文件
#include"math.h"
sbit LCD_EP=P2^4;
sbit LCD_RW=P2^2;
sbit LCD_RS=P2^0;
#define LCD_Data_BUS_Out P7
#define LCD_Data_BUS_In P7
#define key P5
unsigned char keyval;
int i;
typedef unsigned int uint;
code unsigned char LCD_InitialCode[]=;
unsigned char temp;
void Reset_Sources_Init() //禁止看门
{
WDTCN = 0xDE;
WDTCN = 0xAD;
}
void Port_IO_Init() //交叉开关配置
{
//P74OUT = 0xC0; //p7推挽
P2MDOUT = 0xff; //p2推挽
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; //交叉开关使能
}
void Oscillator_Init() //振荡器初始化,使用片外晶体振荡器
{
uint i = 0;
OSCXCN = 0x67; //使用片外晶体谐振器,f>6.7MHz
for (i = 0; i < 3000; i++); //Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0); //检测外部振荡器是否有效
OSCICN = 0x08; //选择外部振荡器作为系统时钟,禁止内部时钟
}
//定时器1初始化函数,定时器1作为波特率发生器
void Timer_Init()
{
CKCON = 0x10; //C/T1直接使用系统时钟作为时钟源
TCON = 0x40; //C/T1允许
TMOD = 0x20; //C/T1方式2(8位重装填计数)
TL1 = 0xFA; //C/T1波特率115200计数值
TH1 = 0xFA;
}
void Init_Device() // 设备初始化函数,在主程序中调用Init_Device()
{
Reset_Sources_Init(); //复位源初始化
Port_IO_Init(); //端口初始化
Oscillator_Init(); //时钟源初始化
Timer_Init(); //定时器1初始化
}
有东西就发出来分享啊,我就直接写下面了。
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN :
MOV SP,#60H
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV R2,#00H
MOV R3,#00
MOV R4,#00
MOV B,#00H
MOV 33H,#00H;十位
MOV 34H,#00H;个位
MOV 35H,#00H;高四位
KEYCODE EQU 35H
S0: LCALL PRESSKEY ;长调用有无按键按下
S1: LCALL DISPLAY ;长调用数字处理程序段
LJMP S0 ;返回S0
;******************* 有无按键按下
PRESSKEY:
MOV P1,#0F0H
MOV A,P1
CJNE A,#0F0H,D2
LJMP D5
D2: LCALL DELAY10MS
MOV A,P1
CJNE A,#0F0H,KEYVALUE
LJMP D5
;*********************按键键值判断
KEYVALUE:MOV 33H,#00H
mov 34H,#00H
MOV P1,#0F0H
MOV A,P1
ANL A,#0F0H ;ANL与操作
MOV B,A
MOV P1,#0FH
MOV A,P1
ANL A,#0FH ;ANL与操作
ORL A,B ;ORL或操作
MOV KEYCODE,A
MOV R3,#00
D4: MOV A,R3
MOV DPTR,#TABBLE2
MOVC A,@A+DPTR
CJNE A,KEYCODE,D3
MOV A,R3
MOV R2,A
LJMP D5
D3: INC R3
LJMP D4
D5: RET
;***********************************数字处理程序段
DISPLAY:
MOV A,R2
CJNE A,#10,CMP1
CMP1: JC LOOP2
LJMP LOOP3
LOOP2: MOV A, R2
MOV 34H,A
LJMP DISPLAY1
LOOP3: MOV B,#10
DIV AB
MOV 33H,A
MOV A,B
MOV 34H,A
LJMP DISPLAY1
;**********************************************************显示程序段
DISPLAY1:
MOV DPTR,#TABBLE1
MOV A,34H
MOVC A,@A+DPTR
MOV P2,#07FH
MOV P0,A
ACALL DELAY5MS
MOV DPTR,#TABBLE1
MOV A,33H
MOVC A,@A+DPTR
MOV P2,#0BFH
MOV P0,A
ACALL DELAY5MS
RET ;子程序返回
;*****************************************************
DELAY:
;延时子程序
MOV R5,#100
DELAY0: LCALL DELAY10MS
DJNZ R5,DELAY0
LJMP HUJK
DELAY10MS:MOV R4,#2
DELAY2 : LCALL DELAY5MS
DJNZ R4,DELAY2
LJMP HUJK
DELAY5MS:
MOV R6,#25
DELAY1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DELAY1
HUJK : RET ;子程序返回
;***************************************************
TABBLE1:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,08H
;?******************************************************
TABBLE2:
DB 0EBH,77H,7BH,7DH,0B7H,0BBH,0BDH,0D7H,0DBH,0DDH,7EH,0BEH,0DEH,0EEH,0E7H,0EDH,0FFH
;*****************************************************
END
⑨ 单片机问题
单片机P1口是有内部上拉电阻的,如果电源都正常并且单片机的程序运行也正常的话,应该是外部接口的问题。有可能地话,将引脚与外部电路断开后测一下引脚电压试试,如果正常就可以确定是外部电路的问题单片机是一门实践性很强的课程(是半软半硬的东西),所以必须是理论联系实践,我试过很多种教学法,还是觉得平凡老师创立的任务教学法的效果最好。因此本人的课程也将按找这个思路来写。 个人认为平凡单片机教程有些不足的地方,所以我也是改革的写教程了,完全按照人的认知规律来写,和平凡老师的教程在很大程度上不同。 好,下面我们开始学习了!请大家认真看! 一、什么是单片机呢? 1、和我们的计算机(电脑)差不多,大家都知道,我们的计算机(电脑)里面有 (1)CPU (2)硬盘 (3)内存 (4)主板 (5)等等。 这些东西是装在一个叫主机的里面的。好大!一个CPU大概要400块,硬盘也要500左右,内存200左右,主板500左右,这些东西加在一起大概要1600块左右。如果配上其他的,一台电脑要3000到4000左右吧。 2、但是如果把这些东西(CPU,硬盘,内存,主板)用集成块做好后,如下图所视: http://bbs.21ic.com/upfiles/img/200611/20061119213818365.jpg 3、请大家想想看这个集成块值多少钱?它可是具备了计算机的功能啊。是不是很贵啊? 不,价格并不高,从几元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只8只引脚。 4、当然,在单片机机内部,CPU,硬盘,内存,主板等等东西要改个名字了。 (1)CPU,它的名字没有改,还是叫CPU(Central Processing Unit)。它是单片机的核心部件,包括运算器和控制器。运算器既是算术逻辑单元ALU(Arithmetic logic Unit),其功能是进行算术运算和逻辑运算。控制器一般由指令寄存器、指令译码器、时序电路和控制电路组成。起作用是完成取指令、将指令译码形成各种微操作并执行指令,同时控制计算机的各个部件有条不紊地工作。 (2)“硬盘”,改了名字,叫程序存储器,也叫只读存储器。用ROM(Read only memery)表示。其作用和硬盘差不多,用来存放用户程序。特点是:掉电后不会丢失数据。 (3)“内存”,也改了名字,在单片机里叫数据存储器,也叫随机存储器。用RAM(Random Access Memery)表示。其作用是用于存放运算的中间结果,数据暂村和缓冲,标志位等。特点是:掉电后会丢失数据。 (4)“主板”,也改了名字,叫做I/O(输入输出设备)当然也包含了串行口,并行口,定时器,记时器等等。 5、以上谈到的这些东西都在哪个集成块里面。我们把集成了这些东西的集成块叫做单片机。有些外国人叫微控制单元MCU(Micro Controller Unit),也有人叫嵌入式控制器(Embedded Controller)。现在明白了什么是单片机吗? 6、我总结一下:将CPU、程序存储器、数据存储器、I/O接口电路、定时器/计数器等计算机部件集成在一块芯片上,具有独特功能的单片微型计算机称着单片机。现在总明白了什么是单片机吧! 请大家用自己的话阐述一遍什么是单片机?? 二、当我们明白了什么是单片机后,再来猜猜一般的单片机的价格吧? (1)Intel公司1980年推出的标准MCS-51内核8051现在要7到10块钱。 (2)Atmel公司的AT89c51,AT89s51,AT89c52,AT89s52一般在7块钱左右。 三、我想大家会想一个“电脑”竟然是10块钱以内?功能怎么样?有什么用啊? 我可以告诉大家,它的功能很强大,是以后电子产品的发展方向。只要具有了智能的电子产品,就少不了弹片机技术。非常有用,就业前景非常之好。那么大家一定很想学了,于是去买了本书看。 哈哈,看不懂吧,感觉好难吧?那是因为你没有掌握好学习单片机的方法。学单片机光看书是不够的,也是学不会的。学单片机是需要一些条件的了! 下一页是学习单片机需要的条件. 随着社会的发展,电子行业出现了新的技术之一单片机技术,单片机技术在各行各业都得到了广泛的应用,如果说学电子的人不学单片机技术就像我们读书不读外语一样,被人认为是老土啊。 所以我们学电子的一定要学单片机技术。那么如何学习这门技术呢?到底是难还是容易呢?这就要看你的学习方法了。 如果你闭门造车试的学习方法,肯定很难学好的。我根据我这几年的教学经验,我总结出了学单片机的相关教学方法,现在我将把我的教学过程写出来。 学单片机第一步是:建立自己的学习条件。 四、学习单片机需要什么条件? (1)一台电脑——用于编程和学习。(3000到4000块钱) (2)编程器——用于把编写好的程序写到芯片中。(100到1000快钱) (3)仿真器——主要是为了调试程序的正确性。(1000到2000块钱) (4)如果没有编程器和仿真器,也可以买个便宜的单片机实验板。如电子之城的AZ系统。也就300块钱左右。 或者是电子之城的AS系统,大概是400块钱。它集合了编程器和仿真器的所有功能。推荐买单片机实验板! (5)还要多买几块单片机芯片,如:AT89C51,AT89S51,AT89S52等等。 五、有了这些东西,如果你已经学了一点单片机知识的话,就可以做搞开发了。 下面我来谈谈单片机开发的过程,以做流水灯为例进行讲解。 (1)设计好硬件电路图 按下图把单片机的各个脚和元器件连接起来: http://bbs.21ic.com/upfiles/img/200611/20061119213942329.gif (2)在电脑上用软件(如keil c51)编写程序。 ORG 0000H LJMP START ORG 0030H START:MOV A,#0FEH LOOP:MOV P1,A LCALL DELAY RL A LJMP LOOP DELAY:MOV R7,#0FFH D1:MOV R6,#0FFH D2:DJNZ R6,D2 DJNZ R7,D1 RET END
想学习单片机应该首先学会这些东东:1>IAP(In Application Program)在应用编程 ISP(In System Program)在系统编程根本区别: IAP: 动态的,CPU CORE已经运行,自己从外面读数据,完成写入自身FLASH IAP: 静态的,实质上是由外部实现串行编程写入待.<2>答:具备在应用中编程IAP功能的单片机,其程序存储器必须是可以重复烧写编程的版本(比如FLASH)。可以用于具备远程遥控软件版本升级或者参数修改的产品项目之中(比如远程抄表、用户端电话计费等系统的远程费率参数和算法程序修改);也可以应用于具备自编程功能(免用微机和烧写器)的单片机学习机、单片机单板机、实验板、演示板、教学模块等各种学习和实验工具之中。对于处在同一个存储器空间的FLASH程序存储器,不能同时扮演“被烧写存储器”和“取指令存储器”的双重角色。为了解决这个矛盾,不同厂家的单片机采用了不同的解决方案,比如: ① 可以将FLASH程序存储器分成地址有映射关系的两个区,分别由各自的电荷泵提供烧写电压。当烧写一个区时,该区的电荷泵工作,同时执行存放在另一个区的指令。例如,SST(Silicon Storage Technology)公司利用他的SuperFlash技术研制的FlashFlex51单片机系列,各个型号片内分别带有20KB、36KB或68KB可多次编程的程序存储器。该存储器又分为主存储区和次存储区。各个型号的主存储区分别为16KB、32KB或64KB,次存储区则统一为4KB。 ② 可以将单片机的程序存储器地址空间分为ROM区和FLASH区,ROM区在出厂之前就已经固化有烧写专用程序,FLASH区作用户程序存放区,这样一来,即使在烧写FLASH的同时,也不会影响对于ROM中程序的执行。MOTOROLA公司推出的MC68HC908系列单片机中采用的就是这种解决方案。 ③ PIC16F87X系列单片机中,采用了不同的解决方案。FLASH程序存储器并不分区,在对其进行烧写并且电源自动切换到电荷泵供电时,CPU自动停顿而等待。在一个单元烧写操作完毕,FLASH工作电压自动切换到正常值时,CPU才继续执行FLASH中的烧写专用程序或用户程序。 ④ 在数据存储器RAM和程序存储器FLASH两种存储器统一编址的单片机中,还可以采用的另一种方案是,在准备修改FLASH区中的用户程序之前,先把烧写专用程序拷贝到RAM区,然后跳转到RAM区去执行该程序,实现对FLASH程序存储器的烧写操作。在烧写完成之后再跳回到FLASH存储器执行正常的用户程序。微芯公司新近推出的高性能PIC18C601/801单片机采用的就是这种解决方案。MOTOROLA公司推出的MC68HC908系列单片机的某些型号,也可以采用这种解决方案。SST89C54/58(简称89C54/58)是美国SST公司推出的多用途51系列单片机,片内集成了20 kB/36 kB的SuperFlashE'PROM程序存储器,分为BLOCK0(16kB/32kB)和BLOCKl(4kB)两块。其中,BLOCKl可以映射(Mapping)到64kB存储空间的最高端或最低端,而且,对于程序计数器来说可以是不可见的,
不知道是否能帮助你,希望你给予采纳