﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客--随笔分类-11 C51</title><link>http://www.cnitblog.com/dabor/category/7393.html</link><description>&lt;a href="http://www.cnitblog.com/dabor/"&gt;dabor&lt;/a&gt;　　　　　　　　　　　　　　　　　　　&lt;a href="http://www.cnitblog.com/dabor/"&gt;&lt;img src="http://www.cnitblog.com/images/cnitblog_com/dabor/2981/o_title.gif" width="258" height="52" border="0" align="top"&gt;&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 23:17:27 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 23:17:27 GMT</pubDate><ttl>60</ttl><item><title>0004-高亮发光二极管 PWM 点亮方式测试</title><link>http://www.cnitblog.com/dabor/archive/2008/08/19/48146.html</link><dc:creator>dabor</dc:creator><author>dabor</author><pubDate>Tue, 19 Aug 2008 05:33:00 GMT</pubDate><guid>http://www.cnitblog.com/dabor/archive/2008/08/19/48146.html</guid><wfw:comment>http://www.cnitblog.com/dabor/comments/48146.html</wfw:comment><comments>http://www.cnitblog.com/dabor/archive/2008/08/19/48146.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/dabor/comments/commentRss/48146.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/dabor/services/trackbacks/48146.html</trackback:ping><description><![CDATA[
		<pre>用的直径 5mm 白色高亮发光二极管。

给定满载测试电流：
D = 1(100%)	I = 15.5mA	(D: 占空比)

以下是几个频率点的测试电流：
f = 2KHZ	D = 1/8		I = 1.71mA
f = 1KHZ	D = 1/8		I = 1.79mA
f = 200HZ	D = 1/8		I = 1.84mA

目测在三个频率下的发光管亮度差不多，看来发光管亮度和频率无关，
那就尽量选低频来点亮它，在 LED 阵列扫描方式下将大幅减低 MCU 负担。

50mA 满载电流， D=1/8，测得 I=6.2mA，发光亮度还可以。
D=1/4，亮度不错。

所以，在 LED 阵列中扫描基线如果是 16 根，则 D=1/16，发光管的
亮度将大大降低。因此要想真正的“高亮”，就要尽量减少扫描基线。
</pre>
		<br />
		<br />
		<br />
<img src ="http://www.cnitblog.com/dabor/aggbug/48146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/dabor/" target="_blank">dabor</a> 2008-08-19 13:33 <a href="http://www.cnitblog.com/dabor/archive/2008/08/19/48146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>0003-自定义库函数的问题</title><link>http://www.cnitblog.com/dabor/archive/2008/07/28/47209.html</link><dc:creator>dabor</dc:creator><author>dabor</author><pubDate>Mon, 28 Jul 2008 08:14:00 GMT</pubDate><guid>http://www.cnitblog.com/dabor/archive/2008/07/28/47209.html</guid><wfw:comment>http://www.cnitblog.com/dabor/comments/47209.html</wfw:comment><comments>http://www.cnitblog.com/dabor/archive/2008/07/28/47209.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/dabor/comments/commentRss/47209.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/dabor/services/trackbacks/47209.html</trackback:ping><description><![CDATA[
		<pre>Keil 编译器不让我们随心所欲地使用自定义库函数, 因为如果你调用了一个自编写的 Delay.lib 库中的库函数, 
如 Delayms (1000); 则 Delay.lib 库中所有函数都将加入到你的程序中, 例 Delay50us 等. 而 Keil 自己的库函数
则不存在这个问题, 例如调用 STRING.H 中的 strlen 函数, 它不会把 strcmp 等函数加入到你的程序中.

不得已, 只有使用笨办法, 以尽量让自己方便程序的编写:
在 C51\INC 下建 <font color="#ff0000">delay.h</font> 文件:

#ifdef	add_Delayms
	#include	"delay\delayms.c"
#endif

#ifdef	add_Delay50us
	#include	"delay\delay50us.c"
#endif

再在这个目录下建目录 <font color="#ff0000">delay</font>, 目录里分别写各个函数的原程序:

<font color="#ff0000">delayms.c</font>:


void Delayms (unsigned int count);


/*----------------------------------------
  1mS 延时 函数

参 数:	count:	count x 1mS
----------------------------------------*/
void Delayms (unsigned int count)
{
	unsigned int	i;
	unsigned int	j;

	for (j=0; j&lt;count; j++)
		for (i=0; i&lt;124; i++);	// 根据 CPU 时钟修改 i 的循环值
}


<font color="#ff0000">delay50us.c</font>:



void Delay50us (unsigned char count);


/*----------------------------------------
  50uS 延时 函数

参 数:	count:	count x 50uS
----------------------------------------*/
void Delay50us (unsigned char count)
{
	unsigned char	i;
	unsigned char	j;

	for (j=0; j&lt;count; j++)
		for (i=0; i&lt;13; i++);	// 根据 CPU 时钟修改 i 的循环值
}
 
 
 
最后在主程序中调用:


#include	&lt;at89x52.h&gt;
#include	&lt;define.h&gt;

//--- 自编库函数 ---
#define		add_Delayms
#define		add_Delay50us

#include	&lt;delay.h&gt;


/*----------------------------------------
  主函数
----------------------------------------*/
void main (void)
{
	while (TRUE)
	{
		Delayms (1000);
		Delay50us (5);
	}
}



虽然感觉有点笨, 但还是方便了些, 如果编译时出现提示某个函数没有被使用, 只需注释掉一行就行, 例:

#include	&lt;AT89X52.H&gt;
#include	&lt;DEFINE.H&gt;

//--- 自编库函数 ---
#define		add_Delayms
<font color="#ff0000">//#define	add_Delay50us</font>

#include	&lt;DELAY.H&gt;


/*----------------------------------------
  主函数
----------------------------------------*/
void main (void)
{
	while (TRUE)
	{
		Delayms (1000);
	}
}

</pre>
<img src ="http://www.cnitblog.com/dabor/aggbug/47209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/dabor/" target="_blank">dabor</a> 2008-07-28 16:14 <a href="http://www.cnitblog.com/dabor/archive/2008/07/28/47209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>0002-LCD1602 仿真不显示的原因</title><link>http://www.cnitblog.com/dabor/archive/2008/07/22/47000.html</link><dc:creator>dabor</dc:creator><author>dabor</author><pubDate>Tue, 22 Jul 2008 03:13:00 GMT</pubDate><guid>http://www.cnitblog.com/dabor/archive/2008/07/22/47000.html</guid><wfw:comment>http://www.cnitblog.com/dabor/comments/47000.html</wfw:comment><comments>http://www.cnitblog.com/dabor/archive/2008/07/22/47000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/dabor/comments/commentRss/47000.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/dabor/services/trackbacks/47000.html</trackback:ping><description><![CDATA[
		<pre>//+++ LCD1602 在 ISIS 中仿真不显示的错误函数 +++

void LCD_CheckBusy (void)
{
	LCD_EN	= 0;
	P0	= 0xff;
	LCD_RW	= 1;
	LCD_RS	= 0;
	LCD_EN	= 1;

	//+++++++++++++++++++++++++++++++++++
	// 在 ISIS 中死等，傻等，不会有结果的！
	// 但在实际中 LCD 却能显示
	//+++++++++++++++++++++++++++++++++++
	while (P0_7 == 1)
	{
		_nop_ ();
		_nop_ ();
		_nop_ ();
	}
}

//+++ 以下是正确的函数 +++

/*-----------------------------------
  LCD1602 控制器忙检测 函数

  控制器空闲则返回
  读数据时：RS=L, RW=H, E=H, 输出：D0-D7= 数据
  D7=1: 忙；D7=0: 闲
------------------------------------*/
void LCD_CheckBusy (void)
{
	LCD_EN	= 0;
	LCD_RW	= 1;
	LCD_RS	= 0;

	while (TRUE)
	{
		P0	= 0xff;
		LCD_EN	= 1;		// +++ 要不停地检测 +++

		_nop_ ();
		_nop_ ();
		_nop_ ();
		
		if (P0_7 == 0)		// LCD 空闲则退出
		{
			LCD_EN	= 0;
			break;
		}

		LCD_EN	= 0;
	}
}


</pre>
<img src ="http://www.cnitblog.com/dabor/aggbug/47000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/dabor/" target="_blank">dabor</a> 2008-07-22 11:13 <a href="http://www.cnitblog.com/dabor/archive/2008/07/22/47000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>0001-蓝色生命灯</title><link>http://www.cnitblog.com/dabor/archive/2008/07/21/46974.html</link><dc:creator>dabor</dc:creator><author>dabor</author><pubDate>Mon, 21 Jul 2008 05:48:00 GMT</pubDate><guid>http://www.cnitblog.com/dabor/archive/2008/07/21/46974.html</guid><wfw:comment>http://www.cnitblog.com/dabor/comments/46974.html</wfw:comment><comments>http://www.cnitblog.com/dabor/archive/2008/07/21/46974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/dabor/comments/commentRss/46974.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/dabor/services/trackbacks/46974.html</trackback:ping><description><![CDATA[
		<br />经常不知道 CPU  是死机，还是所写代码有问题，干脆弄个灯来观察 CPU 是否正常。 <br /><pre>void Timer1 (void) interrupt 3		// T1 的中断号为 3
{
	static uchar numBlueLED	= 40;	// 2S (2/0.05)

	TR1	= 0;			// 停 T1
	TL1	= -50000;		// 低 8 位
	TH1	= (-50000) &gt;&gt; 8;	// 高 8 位
	TR1	= 1;			// 开 T1

	// 开蓝生命灯 5x50mS, 周期 2S
	numBlueLED--;

	if (numBlueLED == 5)
	{
		IO_BLUELED	= 0;	// 开蓝灯
	}
	else if (numBlueLED == 0)
	{
		IO_BLUELED	= 1;	// 关蓝灯
		numBlueLED	= 40;
	}
}

void main (void)
{
	//--- 定时器中断初始化 ---
	TMOD	= (TMOD &amp; 0x0f) | 0x10;	// 置T1为方式1，并且不影响 T0
	// 延时50mS的时间常数
	// 计算方法： 1 uS 1 个周期 (12M / 12) 则应置数：65536 - (50000uS/1))
	TL1	= -50000;		// 低 8 位
	TH1	= (-50000) &gt;&gt; 8;	// 高 8 位

	TR1	= 1;			// 启动 T1
	ET1	= 1;			// T1 中断允许
	EA	= 1;			// 开中断

	while (TRUE)
	{
		NC;
	}
}
</pre><br /><br /><br /><br /><img src ="http://www.cnitblog.com/dabor/aggbug/46974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/dabor/" target="_blank">dabor</a> 2008-07-21 13:48 <a href="http://www.cnitblog.com/dabor/archive/2008/07/21/46974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>