• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

请教在单片机中如何看CPU的资源

因为在看书的时候,看到了这样一句话【单片机的案件处理子程序应该尽可能少占用CPU的运行时间,并且尽可能将键盘扫描安排在程序空余的时间,以满足实时准确响应按键请求的目的】

大家怎么看?

全部回复(30)
正序查看
倒序查看
daylight
LV.4
2
2014-02-19 20:41
单片机无系统时理论上应该是100%工作的,非要算空闲时间的话,就是所有延时程序
0
回复
matou
LV.3
3
2014-02-19 20:42
没有操作系统何来CPU 资源,除了在休眠,其他都是在全速运行
0
回复
heal
LV.3
4
2014-02-19 20:44
@matou
没有操作系统何来CPU资源,除了在休眠,其他都是在全速运行

能说详细一点吗?

0
回复
matou
LV.3
5
2014-02-19 20:45
@heal
能说详细一点吗?
空余时间就是CPU 做完了要做的事,通过延时或空循环等待任务的时间,这时候安排CPU 做别的事就不会影响其他任务
0
回复
heal
LV.3
6
2014-02-19 20:47
@matou
空余时间就是CPU做完了要做的事,通过延时或空循环等待任务的时间,这时候安排CPU做别的事就不会影响其他任务
那我怎样才能知道,什么时候CPU做完了事情,我什么时候才可以安排CPU去做其他事情,这个“什么时候”我从何得知?
0
回复
matou
LV.3
7
2014-02-19 20:48
@heal
那我怎样才能知道,什么时候CPU做完了事情,我什么时候才可以安排CPU去做其他事情,这个“什么时候”我从何得知?
单片机有没有在做事情完全是按你的程序来的啊

 

0
回复
stony_s
LV.3
8
2014-02-19 20:50
cpu一直全速运行,又不是操作系统的阿
0
回复
for_real
LV.3
9
2014-02-19 20:51
文章中的意思,我没有理解错的话,应该是尽量减少子程序的占用时间,保证键盘扫描函数能在主函数的一个运行周期内有充分的时间来响应。这种设计方式不太好
0
回复
pirate
LV.4
10
2014-02-19 20:57
@for_real
文章中的意思,我没有理解错的话,应该是尽量减少子程序的占用时间,保证键盘扫描函数能在主函数的一个运行周期内有充分的时间来响应。这种设计方式不太好
支持楼上,如果你子程序不是写成中断的话,占用时间长就会影响你继续操作。就会操作无响应,因为其他事还没干完
0
回复
for_real
LV.3
11
2014-02-19 20:59
@pirate
支持楼上,如果你子程序不是写成中断的话,占用时间长就会影响你继续操作。就会操作无响应,因为其他事还没干完
个人一直倾向于讲键盘扫描这样的函数利用中断完成响应

 

0
回复
heal
LV.3
12
2014-02-19 21:00
@for_real
个人一直倾向于讲键盘扫描这样的函数利用中断完成响应 
键盘怎么中断呢?中断是哪个呢?是外部中断吗?

 

0
回复
for_real
LV.3
13
2014-02-19 21:02
@heal
键盘怎么中断呢?中断是哪个呢?是外部中断吗? 
如果是独立键盘,用外部中断自然最好。现在不大用51了,一般用430,它是支持IO口中断的,内部也有AD,中断采样。在要求不高的应用里,我一般会用四个独立按键,使用IO口中断,或者矩阵键盘采用IO口中断,有时也会用AD键盘,用AD采样中断来完成交互.

 

0
回复
heal
LV.3
14
2014-02-19 21:03
@for_real
如果是独立键盘,用外部中断自然最好。现在不大用51了,一般用430,它是支持IO口中断的,内部也有AD,中断采样。在要求不高的应用里,我一般会用四个独立按键,使用IO口中断,或者矩阵键盘采用IO口中断,有时也会用AD键盘,用AD采样中断来完成交互. 

谢谢哈

0
回复
soap泡泡
LV.4
15
2014-02-19 21:05
普通的51单片机在12m晶振下每ms大约可以执行500条指令普通的指令,假如你的中断里的程序大于500条,而且中断发生的间隔时间小于1ms,那么单片机就只能执行中断程序不能执行其他程序
0
回复
heal
LV.3
16
2014-02-19 21:07
@soap泡泡
普通的51单片机在12m晶振下每ms大约可以执行500条指令普通的指令,假如你的中断里的程序大于500条,而且中断发生的间隔时间小于1ms,那么单片机就只能执行中断程序不能执行其他程序
程序执行 软件延迟的程序的时候,CPU在干嘛啊? 在软件延迟的那段时间里,CPU能处理其他事情吗?
0
回复
soap泡泡
LV.4
17
2014-02-19 21:10
@heal
程序执行软件延迟的程序的时候,CPU在干嘛啊?在软件延迟的那段时间里,CPU能处理其他事情吗?
软件延时时,cpu在执行软件延时程序,如果这时你还想让cpu执行别的程序,那么会影响延时时间
0
回复
2014-02-19 21:11
@heal
程序执行软件延迟的程序的时候,CPU在干嘛啊?在软件延迟的那段时间里,CPU能处理其他事情吗?
不能吧,cpu就在执行延时程序,别的它干不了
0
回复
heal
LV.3
19
2014-02-19 21:14
做了一个电子钟, 结果闹铃响放音乐的时候,数字时钟就不显示了
0
回复
soap泡泡
LV.4
20
2014-02-22 22:47
@heal
做了一个电子钟,结果闹铃响放音乐的时候,数字时钟就不显示了
程序的调度做的不好
0
回复
heal
LV.3
21
2014-02-22 22:49
@heal
做了一个电子钟,结果闹铃响放音乐的时候,数字时钟就不显示了

我是用中断实行音乐播放。设备是51单片机。

这里,我将秒表和音乐播放放在一起。运行的时候发现有很刺耳的声音(不是音乐),同时数码管不显示时钟,嗯键盘也完全没有作用。

Break2:

PUSH PSW

PUSH ACC ;保护现场

MOVTL1,#000H;赋计数初值,每10ms中断一次

MOVTH1,#0DCH

DJNZ 61H,back1 ;10毫秒未到,返回 ,61的初值为#01H

JBCounState,COUNT

JBAlarmRing1,MUSIC1

LJMP return1

COUNT:

MOV 61H,#01H ;61H存放中断次数

MOV A,#01H

ADD A,35H

MOV 35H,A

JBAlarmRing1,MUSIC1

CJNE A,#64H,back1 ;是否到达100个10毫秒,没有则返回

MOV 35H,#00H ;毫秒位清零

MOV A,#01H

ADD A,36H ;秒位加1

MOV 36H,A

CJNE A,#3CH,back1 ;60秒到了没有

MOV 36H,#00H ;秒位清零

MOV A,#01H

ADD A,37H ;小时位加1

MOV 37H,A

back1: LJMP return1 ;返回

return1:

POP ACC

POP PSW ;恢复现场

RETI ;中断返回

//delay1:

//push 07h ;2毫秒延迟

//push 06h

//MOV R7,#1EH

//DE1: MOV R6,#1FH

//D21: DJNZ R6,$

//DJNZ R7,DE1

//pop 06H

//pop 07H

//RET

;============================================================================================

0
回复
heal
LV.3
22
2014-02-22 22:49
@heal
我是用中断实行音乐播放。设备是51单片机。这里,我将秒表和音乐播放放在一起。运行的时候发现有很刺耳的声音(不是音乐),同时数码管不显示时钟,嗯键盘也完全没有作用。Break2:PUSHPSWPUSHACC;保护现场MOVTL1,#000H;赋计数初值,每10ms中断一次MOVTH1,#0DCHDJNZ61H,back1;10毫秒未到,返回,61的初值为#01HJBCounState,COUNTJBAlarmRing1,MUSIC1LJMPreturn1COUNT:MOV61H,#01H;61H存放中断次数MOVA,#01HADDA,35HMOV35H,AJBAlarmRing1,MUSIC1CJNEA,#64H,back1;是否到达100个10毫秒,没有则返回MOV35H,#00H;毫秒位清零MOVA,#01HADDA,36H;秒位加1MOV36H,ACJNEA,#3CH,back1;60秒到了没有MOV36H,#00H;秒位清零MOVA,#01HADDA,37H;小时位加1MOV37H,Aback1:LJMPreturn1;返回return1:POPACCPOPPSW;恢复现场RETI;中断返回//delay1://push07h;2毫秒延迟//push06h//MOVR7,#1EH//DE1:MOVR6,#1FH//D21:DJNZR6,$//DJNZR7,DE1//pop06H//pop07H//RET;============================================================================================

MUSIC1:

NOP

MOV DPTR,#MDAT ;表头地址送DPTR

INC62H

MOV B,#00H ;表序号清0

MUSIC1_1:

NOP

CLR A

MOVCA,@A+DPTR ;查表取代码

JZ END1_0 ;是00H,则结束

CJNEA,#0FFH,MUSIC1_5

LJMP MUSIC1_3

MUSIC1_5:

NOP

MOV 63H,A ;取音符代码送63H

INCDPTR

MOV A,B

MOVC A,@A+DPTR ;取节拍代码送64H

MOV 64H,A

MUSIC1_2:

NOP

CPL P1.6

MOV A,63H

MOV R3,A

LCALL MDEL1_0 ;最大一次是2毫秒

AJMPMUMIAO

MUSIC1_3:

NOP

//CLR TR0 ;休止100毫秒

SETBP1.6

INC DPTR

//MOVA,#7DH ;休止500毫秒

MOV A,B

MOVC A,@A+DPTR ;取节拍代码送64H

MOV 64H,A

MUMIAO:

MOVA,35H

CJNE A,#64H,MUSIC1_2_0 ;是否到达100个10毫秒,没有则MUSIC1_2_0

MOV 35H,#00H ;毫秒位清零

MOV A,#01H

ADD A,36H ;秒位加1

MOV 36H,A

CJNE A,#3CH,MUSIC1_2_0 ;60秒到了没有

MOV 36H,#00H ;秒位清零

MOV A,#01H

ADD A,37H ;小时位加1

MOV 37H,A

MUSIC1_2_0:

MOV A,64H

CJNE A,62H,MUSIC1_2 ;中断计数器(20H)=R7否?;不等,则继续循环

//LJMP MUSIC1_4

//MOV R3,A

//LCALL MDEL1_0

MUSIC1_4:

MOV 62H,#00H ;等于,则取下一代码

MOV 63H,#00H ;存入音乐音符 清零

MOV 64H,#00H ;存入音乐节拍 清零

INC DPTR

LJMP MUSIC1_1

END1_0:

NOP

SETBP1.6

CLRAlarmRing1

AJMPreturn2

MDEL1_0:

MOV R4,#02H ;延迟(2+13*R3)*1.09=

NOP

DJNZ R4,$

NOP

DJNZ R3,MDEL1_0

RET

NOP

return2:

POP ACC

POP PSW ;恢复现场

RETI ;中断返回

MDAT:

DB2DH,30H,2DH,10H,28H,40H,2DH,40H,22H,40H,24H,80H

DB2DH,30H,2DH,10H,28H,40H,2DH,40H,1EH,40H,22H,80H

DB2DH,30H,2DH,10H,16H,40H,1BH,40H,22H,40H,24H,40H,28H,40H,0FFH,10H

DB19H,30H,19H,10H,1BH,40H,22H,40H,1EH,40H,22H,80H

DB00H

0
回复
close3
LV.5
23
2014-02-22 22:53
@heal
MUSIC1:NOPMOVDPTR,#MDAT;表头地址送DPTRINC62HMOVB,#00H;表序号清0MUSIC1_1:NOPCLRAMOVCA,@A+DPTR;查表取代码JZEND1_0;是00H,则结束CJNEA,#0FFH,MUSIC1_5LJMPMUSIC1_3MUSIC1_5:NOPMOV63H,A;取音符代码送63HINCDPTRMOVA,BMOVCA,@A+DPTR;取节拍代码送64HMOV64H,AMUSIC1_2:NOPCPLP1.6MOVA,63HMOVR3,ALCALLMDEL1_0;最大一次是2毫秒AJMPMUMIAOMUSIC1_3:NOP//CLRTR0;休止100毫秒SETBP1.6INCDPTR//MOVA,#7DH;休止500毫秒MOVA,BMOVCA,@A+DPTR;取节拍代码送64HMOV64H,AMUMIAO:MOVA,35HCJNEA,#64H,MUSIC1_2_0;是否到达100个10毫秒,没有则MUSIC1_2_0MOV35H,#00H;毫秒位清零MOVA,#01HADDA,36H;秒位加1MOV36H,ACJNEA,#3CH,MUSIC1_2_0;60秒到了没有MOV36H,#00H;秒位清零MOVA,#01HADDA,37H;小时位加1MOV37H,AMUSIC1_2_0:MOVA,64HCJNEA,62H,MUSIC1_2;中断计数器(20H)=R7否?;不等,则继续循环//LJMPMUSIC1_4//MOVR3,A//LCALLMDEL1_0MUSIC1_4:MOV62H,#00H;等于,则取下一代码MOV63H,#00H;存入音乐音符清零MOV64H,#00H;存入音乐节拍清零INCDPTRLJMPMUSIC1_1END1_0:NOPSETBP1.6CLRAlarmRing1AJMPreturn2MDEL1_0:MOVR4,#02H;延迟(2+13*R3)*1.09=NOPDJNZR4,$NOPDJNZR3,MDEL1_0RETNOPreturn2:POPACCPOPPSW;恢复现场RETI;中断返回MDAT:DB2DH,30H,2DH,10H,28H,40H,2DH,40H,22H,40H,24H,80HDB2DH,30H,2DH,10H,28H,40H,2DH,40H,1EH,40H,22H,80HDB2DH,30H,2DH,10H,16H,40H,1BH,40H,22H,40H,24H,40H,28H,40H,0FFH,10HDB19H,30H,19H,10H,1BH,40H,22H,40H,1EH,40H,22H,80HDB00H
一上来就汇编?汇编可是最接近CPU的
0
回复
heal
LV.3
24
2014-02-22 22:54
@close3
一上来就汇编?汇编可是最接近CPU的
所以才难
0
回复
close3
LV.5
25
2014-02-22 23:00
@close3
一上来就汇编?汇编可是最接近CPU的
CPU是单片机里面的一个元器件,它的作用就是读取你的代码去执行
0
回复
close3
LV.5
26
2014-02-22 23:00
@close3
CPU是单片机里面的一个元器件,它的作用就是读取你的代码去执行
人脑有思考和记忆的功能,CPU就是电脑的思考功能
0
回复
close3
LV.5
27
2014-02-22 23:02
@soap泡泡
软件延时时,cpu在执行软件延时程序,如果这时你还想让cpu执行别的程序,那么会影响延时时间

同意楼上

0
回复
elio
LV.2
28
2014-02-22 23:04
@soap泡泡
普通的51单片机在12m晶振下每ms大约可以执行500条指令普通的指令,假如你的中断里的程序大于500条,而且中断发生的间隔时间小于1ms,那么单片机就只能执行中断程序不能执行其他程序
0
回复
elio
LV.2
29
2014-02-22 23:05
@heal
那我怎样才能知道,什么时候CPU做完了事情,我什么时候才可以安排CPU去做其他事情,这个“什么时候”我从何得知?

多看看书啊

0
回复
elio
LV.2
30
2014-02-22 23:06
@for_real
如果是独立键盘,用外部中断自然最好。现在不大用51了,一般用430,它是支持IO口中断的,内部也有AD,中断采样。在要求不高的应用里,我一般会用四个独立按键,使用IO口中断,或者矩阵键盘采用IO口中断,有时也会用AD键盘,用AD采样中断来完成交互. 
高手
0
回复
backin
LV.4
31
2014-02-22 23:07
@heal
做了一个电子钟,结果闹铃响放音乐的时候,数字时钟就不显示了

放出来看看啊

0
回复