EDN首页   博客首页

最新日志

发表于:2007-4-13 20:14:49
标签:无标签

0

最近有点迷失目标了

又很久没有来BLOG了,说实在的,最近确实有点乱.在别人眼里看来我挺忙的,整天见不到人.的确,我和我的班级已经脱节了,甚至有很多人很久都没有见到了.

       下午的时候忽然间想反省一下自己,总觉的自己挺没有归属感的.去年十一的时候加入团队开始和大家一起闯事业,可到现在为止,一无所有,正如静庭说的:没有任何收益的日子,到底我们能够容忍多久?以前觉的无所谓,今天开始反思了.明年的这个时候,我就毕业了.虽说目前为了团队的发展,我准备读研.但到底这条路是否适合我,我到底能够给大家带来什么价值,别人不知道,我自己也不知道.迷茫中,失落中……

       明天BLUEFOX就要开会了,具体讨论我们比赛的细节部分,确实也不能再拖了,我们已经浪费了很多时间。

系统分类: 生活点滴   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(532)
发表于:2007-3-2 19:42:18
标签:无标签

1

用单片机来做门铃?

其实单片机的功能是很强大的,而这里,我倒很愿意同各位朋友一起分享一个单片机来作门铃的试验程序。一般的单片机学习板上都有嗡鸣器(也就是我们常说的喇叭),所以利用它来模拟门铃的功能其实挺简单的。

废话少说,下面就进入主题:声音是由振动所产生的,而要发出“抑扬顿挫”的声音,就需要改变驱动信号的频率。现在假设喇叭的驱动信号线接口是P1.1,那么当你以100次每秒的速度来改变P1.1的电平高低和你以1000次每秒的速度改变P1.1的电平状态所产生的效果显然是不一样的。(当然前者是“男低音”,后者是“女高音”)

我用的是AT89S52芯片,22.1184MHz的晶振,用延迟子程序来控制高音,低音,静音的延迟时间,利用中断来驱动喇叭发音。具体设计为:高音为1KHz,低音为600Hz,且高音的持续时间为0.6S,低音的持续时间为1S,静音的持续时间为1.2S。嗡鸣器接口为P3.7,具体参考程序如下:

ORG 0000H                     ;从地址0000开始执行

JMP START                     ;跳转到START

ORG 0BH                      ;TIMER0 的中断矢量

JMP TIMER_0                  ;跳转到TIMER0

START :

MOV IE , #10000010B            ;打开TIMER0 的开关

MOV TMOD , #00000001          ;设置TIMER0的计时方式MODEL1

MOV SP ,#70                    ;移开堆栈

LOOP:

MOV R1 , #252                  ;设置定时值

MOV R0,#91                    ;

CALL LOAD                    ;调用装载TIMER0的子程序

MOV R5,#6                     ;设定延迟时间

CALL DELAY                   ;调用延迟子程序

CLR TR0                       ;关闭TIMER0

MOV R1,#249                   ;设定TIMER0的值

MOV R0,#242                   ;

CALL LOAD                    ;调用装载子程序

SETB TR0                      ;打开TIMER0

MOV R5,#10                    ;设定延迟时间

CALL DELAY                   ;调用延迟子程序

CLR TR0                       ;关闭TIMER0

MOV R5,#12                    ;设定延迟时间

CALL DELAY                   ;调用延迟子程序

JMP LOOP                      ;跳转到LOOP处形成循环

//******************以下为延迟子程序(基准为0.1S***************//

DELAY:

MOV R4,#2                     ;

D2: MOV R7 ,#200               ;

D1: MOV R6,#250                ;

DJNZ R6,$                      ;

DJNZ R7,D1                     ;

DJNZ R4,D2                     ;

DJNZ R5,DELAY                 ;

RET                            ;

//***************以下为TIMER0的装载子程序********************//

LOAD:

MOV A,R1                       ;

MOV TH0,A                      ;

MOV A,R0                       ;

MOV TL0,A                      ;

SETB TR0                       ;

RET                            ;

//**************以下为TIMER0的中断服务子程序**************//

TIMER_0:

CLR TR0                        ;

CALL LOAD                     ;

CPL P3.7                         ;

SETB TR0                        ;

RETI                            ;

END                            ;

 

 

 

系统分类: 单片机   |    用户分类: 无分类    |    来源: 无分类

评论(3) | 阅读(904)
发表于:2007-2-21 0:13:44
标签:无标签

0

生活随想

        很久没有写东西了,以前都是些日记的,不过,如今大伙都流行写博客。为了不让自己落伍,我也得改改“陋习”了,呵呵

     最近一直很郁闷,说不上为什么?总感觉很烦,做事情没有激情。主要是自己在情感方面没有处理好吧……话得从大一说起:高中的时候认识了一个女孩子,或许是那个时候学校管理的比较严格吧,一直没有谈。后来到了大学,原本打算放弃的,终有一天发现自己还是割舍不下,于是便大胆向她吐露了心声。结果很自然,她成了我的初恋女友。刚开始的时候,或许是因为新鲜吧,大家都挺开心的。经常通电话(我们不在同一座城市读书),偶尔也会产生一些小误会,但事隔不久就一切烟消云淡了。总体来说还算比较稳定吧,直到后来有一天我告诉她自己打算去看她,可以想象,她很开心。我自然也很乐意了,毕竟很久没有见面了。但就在这件事发生后的第二天凌晨,她忽然发来个短信说:“我们分手吧,不要问我为什么,对不起,再见……”,早上起床后看到消息时,我几乎要奔溃了,赶紧往她宿舍打电话———占线,打手机——关机!整个一个上午,都是这个样子。直到晚上的时候,才无意间接了我的电话。当时的我快急疯了,使劲问为什么,她就是不肯告诉我。最终透漏了这样一个消息给我:我以前就有个男朋友,现在身边又有一个,但那个人不是你。而且我和以前的那个人也依然有联系。现在身边这个男生,他比你强多了!我很后悔当初没有心狠一点,怎么会答应和你来往呢?说实话,当时确实有些伤心,我以为她是在说气话,也就没有多在意。但后来怎么想都不对劲,为什么没有给我一个合理的解释?直到现在也没有!还有更可气的:在那之后,我打过2,3次电话给她。至今仍清楚地记得,最后一次她是这么说的:“先生,麻烦你以后不要再给我打电话了,你这样做是在浪费你的金钱,更重要的是你浪费了我很多时间!”从那以后我断绝了一起同她之间的联系,QQ后再也没有用过,直到去年9月,为了比赛时传资料方便,不得不重新申请一个。手机也是一换再换,后来干脆不用了。电子邮箱也废弃了,好像在那以后再也没有登陆过。不是冷血,我认为来往了这么久竟然得到这么一个连电话都不能打的结果!真的是伤透了心……,但后来又想明白了,这种女孩子,真的值得么???我敢肯定的是从那以后再也没有同她联系过,甚至到现在为止,我当初的好朋友都不敢向我提起关于她的任何事。我自己也根本没有兴趣去了解!我觉得她不配我那样待她!她也不值得……

  前些日子,又得罪了一个好朋友(暂时这么称呼吧),其实她暗恋我快两年了。但说不上为什么,我觉得她人是挺不错的,但我们之间只能做好朋友,不可能再向前逾越半步!也难得她一个女孩子拐弯抹角的提示了很多次,但每次都被我委婉地回绝了。其实,在大学里,我也有自己感觉还不错的人,但仅仅是感觉不错,至今连人家的姓名都不知道。不过,如果见了面应该可以认出来。去年见面的机会多一些,经常可以在上课的时候碰到,后来也没有要她的联系方式,以至于都快淡忘了。今年1月份还见了一次,清楚地记得当时望着她笑了笑,感觉她还是那么苗条,皮肤依然那么白皙,不过好像瘦了…… 。或许我真的该大胆问她要联系方式,但又莫名其妙地不原意去要。或许是因为初恋的打击太大了吧?我不想破坏自己心里难得的那么一点美好,呵呵,人有时候就是一个奇怪的动物。

 

 

系统分类: 生活点滴   |    用户分类: 无分类    |    来源: 原创

评论(2) | 阅读(839)
发表于:2007-2-15 17:04:20
标签:无标签

6

单片机实现交通灯的一些感想

       上午别人拿给我一个程序,关于单片机模拟实现城市交通灯的,也可以称的上是MCU中一个很经典的程序吧。朋友写了很久终于搞定的,而且用KEIL生成了.HEX文件,但当烧到片子里的时候出向了问题:有时候无缘无故地不能执行!下面就把他的程序贴出来,大伙可以讨论讨论。芯片是AT89S52,22.1184MHz,整体图片:,也就是32个I/O口都接了一个LED,并利用它们来模拟交通灯。具体构思为:

P1口的低四位             东西方向的红灯

P1口的高四位             东西方向的绿灯

P3                     东西方向的黄灯

P0口的低四位             南北方向的红灯

P0口的高四位             南北方向的绿灯

P2                     南北方向的黄灯

 

他的程序是:

 

ORG 0000H                ;从地址0开始执行程序
LJMP START               ;跳转到START处
START: MOV P1,#0FFH      ;关闭P1口的所有LED
MOV P2,#0FFH             ;关闭P2口的所有LED
MOV P3,#0FFH             ;关闭P3口的所有LED
MOV P0,#0FFH             ;关闭P0口的所有LED
LOOP:
LCALL STATUS_1           ;调用STATUS-1子程序
LCALL STATUS_2           ;调用STATUS-2子程序
LCALL STATUS_3           ;调用STATUS-3子程序
LCALL STATUS_4           ;调用STATUS-4子程序
LJMP LOOP                ;跳转到LOOP处形成一个循环
//**************以下为STATUS-1的模块***************//
STATUS_1:
MOV R0,#5                ;将5赋给R0
LOOP_1:MOV A,#00H        ;将0赋给A
MOV P3,A                 ;将A中的数值赋给P3口
MOV P2,A                 ;将A中的数值赋给P2口
LCALL DELAY_5            ;调用DELAY-5延迟子程序
CPL A                    ;将A中的数值取反
MOV P3,A                 ;将A中的数值赋给P3口
MOV P2,A                 ;将A中的数值赋给P2口
LCALL DELAY_5            ;调用DELAY-5延迟子程序
DJNZ R0,LOOP_1           ;跳回LOOP-1处,循环5次
RET                      ;返回
//***************以下是STATUS-2的模块***************//
STATUS_2:
MOV P1,#0FH              ;P1口的高4位亮,即绿灯亮
MOV P0,#0F0H             ;P0口的低4位亮,即红灯亮
LCALL DELAY_30           ;调用DELAY-30程序
RET                      ;返回
//***************以下是STATUS-3的模块*******************//
STATUS_3:
MOV R1,#5                ;将5赋给R1
LOOP_2:MOV A,#00H        ;将0赋给A
MOV P3,A                 ;将A中的数值赋给P3口
MOV P2,A                 ;将A中的数值赋给P2口
LCALL DELAY_5            ;调用DELAY-5子程序
CPL A                    ;将A中的数值取反
MOV P3,A                 ;将A中的数值赋给P3口
MOV P2,A                 ;将A中的数值赋给P2口
LCALL DELAY_5            ;调用DELAY-5子程序
DJNZ R1,LOOP_2           ;跳回LOOP-2处,循环5次
RET                      ;返回
//****************以下是STSTUS-4的模块****************//
STATUS_4:
MOV P1,#0F0H             ;P1口的低4位亮,即红灯亮
MOV P0,#0FH              ;P0口的高4位亮,即绿灯亮
LCALL DELAY_30           ;调用DELAY-30子程序
RET                      ;返回
//****************以下是DELAY-5模块******************//
DELAY_5:
MOV R2,#5                ;
LOOP_3:MOV R3,#184       ;
LOOP_4:MOV R4,#200       ;
DJNZ R4,$                ;
DJNZ R3,LOOP_4           ;
DJNZ R2,LOOP_3           ;
RET                      ;
//****************以下是DELAY-30模块****************** //
DELAY_30:
MOV R5,#6                ;
LOOP_6:MOV R6,#247       ;
LOOP_5:MOV R7,#249       ;
DJNZ R7,$                ;
DJNZ R6,LOOP_5           ;
DJNZ R5,LOOP_6           ;
RET                      ;
//**************结束****************  //
END

 

其实,说真的,朋友做事很认真,程序写的很工整,让人看起来很舒服。但美中不足的是,这个程序是不能用的。

 

我修改后的程序:

 

ORG 0000H                ;从地址0开始执行程序

LJMP START               ;跳转到START

START: MOV P1,#0FFH      ;关闭P1口的所有LED

MOV P2,#0FFH             ;关闭P2口的所有LED

MOV P3,#0FFH             ;关闭P3口的所有LED

MOV P0,#0FFH             ;关闭P0口的所有LED

NOP

NOP

LCALL DELAY_5           ;调用延迟子程序,准备主程序的运行

LOOP:

NOP

NOP

LCALL STATUS_1           ;调用STATUS-1子程序

NOP

NOP

LCALL STATUS_2           ;调用STATUS-2子程序

NOP

NOP

LCALL STATUS_3           ;调用STATUS-3子程序

NOP

NOP

LCALL STATUS_4           ;调用STATUS-4子程序

NOP

NOP

LJMP LOOP                ;跳转到LOOP处形成一个循环

//**************以下为STATUS-1的模块***************//

STATUS_1:

MOV P0,  #0FFH           ;关闭P0

MOV P1, #0FFH             ;关闭P1

MOV R0,#5                ;5赋给R0

LOOP_1:MOV A,#00H        ;0赋给A

MOV P3,A                 ;A中的数值赋给P3

MOV P2,A                 ;A中的数值赋给P2

NOP

NOP

LCALL DELAY_5            ;调用DELAY-5延迟子程序

CPL A                    ;A中的数值取反

MOV P3,A                 ;A中的数值赋给P3

MOV P2,A                 ;A中的数值赋给P2

NOP

NOP

LCALL DELAY_5            ;调用DELAY-5延迟子程序

DJNZ R0,LOOP_1           ;跳回LOOP-1处,循环5

RET                      ;返回

//***************以下是STATUS-2的模块***************//

STATUS_2:

MOV P1,#0FH              ;P1口的高4位亮,即绿灯亮

MOV P0,#0F0H             ;P0口的低4位亮,即红灯亮

NOP

NOP

LCALL DELAY_30           ;调用DELAY-30程序

RET                      ;返回

//***************以下是STATUS-3的模块*******************//

STATUS_3:

MOV P0, #0FFH              ;关闭P0

MOV P1, #0FFH             ;关闭P1

MOV R1,#5                ;5赋给R1

LOOP_2:MOV A,#00H        ;0赋给A

MOV P3,A                 ;A中的数值赋给P3

MOV P2,A                 ;A中的数值赋给P2

NOP

NOP

LCALL DELAY_5            ;调用DELAY-5子程序

CPL A                    ;A中的数值取反

MOV P3,A                 ;A中的数值赋给P3

MOV P2,A                 ;A中的数值赋给P2

NOP

NOP

LCALL DELAY_5            ;调用DELAY-5子程序

DJNZ R1,LOOP_2           ;跳回LOOP-2处,循环5

RET                      ;返回

//****************以下是STSTUS-4的模块****************//

STATUS_4:

MOV P1,#0F0H             ;P1口的低4位亮,即红灯亮

MOV P0,#0FH              ;P0口的高4位亮,即绿灯亮

NOP

NOP

LCALL DELAY_30           ;调用DELAY-30子程序

RET                      ;返回

//****************以下是DELAY-5模块******************//

DELAY_5:

MOV R2,#12                ;

LOOP_3:MOV R3,#191       ;

LOOP_4:MOV R4,#200       ;

DJNZ R4,$                ;

DJNZ R3,LOOP_4           ;

DJNZ R2,LOOP_3           ;

RET                      ;

//****************以下是DELAY-30模块****************** //

DELAY_30:

MOV R5,#75                ;

LOOP_6:MOV R6,#247       ;

LOOP_5:MOV R7,#249       ;

DJNZ R7,$                ;

DJNZ R6,LOOP_5           ;

DJNZ R5,LOOP_6           ;

RET                      ;

//**************结束****************  //

END

 

其中的红色部分是我修改的地方,可能有朋友要问了,你不就写了三个字母么?有什么了不起!呵呵,好像也对,但如果拿到那三个字母你再看看?程序还能正常运行么?其实,当初我在学习单片机的时候也对NOP很不以为然,但又来慢慢才意识到INTRL不是吃白饭的!人家总共就造了111个指令,怎么可能弄一个没用的上去呢?从指令的运行来讲:NOP这条指令是没有任何含义的,它唯一的作用是消耗时间,但从保护程序的正确执行来讲,它却是一个大功臣!去搜一搜很多别人写好的程序,总会发现在LCALL,JB,JNB,JC,JNC等指令的前后有它们的身影。为什么呢?

 

首先需要明确的是:在单片机中,无论是程序还是数字,反映到物理设备上,他们仅仅是一串高低电平而已!

其次还得从指令的格式说起,一般来说汇编语言是单字节指令的,换个话说:有的指令是双字节指令,甚至三字节指令的。当执行单字节指令的时候,指令的格式为:操作码,;而双字节指令则为:操作码,操作数;三字节指令的格式为:操作码,操作数,操作数,操作数;当程序执行单字节指令的时候,PC(program counter)可以保证程序正确地执行,即:先取操作码,后取操作数。而当程序执行到双字节或三字节指令的时候,有时候就会误将第二个操作数当成操作码(注意前面红色部分),从而就出现了程序跑飞的发生。而单字节指令NOP的使用恰好可以保证