EDN首页   博客首页

最新日志

发表于:2008-10-12 16:52:34
标签:无标签

0

修改文件夹属性的DOS命令

系统中毒或不当操作后,一些文件和文件夹变成了隐藏属性,甚至还变成了系统属性(隐藏属性灰色无法修改),有时在工具→文件夹选项→查看里面选择显示所有文件和文件夹也无效,致使无法查看文件及文件夹。这时可以按下面方法进行修改:

1:解决在查看里无法设置显示所有文件和文件夹的问题

开始→运行→REGEDIT打开注册表,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL下将CheckedValue的值改为1(值为0时,在“查看”里显示,是显示不出隐藏文件的)。再重新到“查看”中设置显示隐藏文件和文件夹。



2:修改文件或文件夹的隐藏属性和系统属性

开始→运行→cmd打开命令提示符,键入:attrib [你要改的文件夹或文件名] -s -h,回车即可(-s 表示去掉系统属性,-h表示去掉隐藏属性)。例:文件aaa.txt在e:盘里,是隐藏属性。打开命令提示符界面后,键入命令attrib e:\aaa.txt -s -h就可以修改成功了。注意哟:如果你所修改的文件或文件夹名中有空格的话,就要把文件或文件夹的名上加上双引号""哦。例:文件夹Program Files在c:盘里,要修改的话要这样键入命令attrib c:\"Program Files" -s -h(或attrib "c:\Program Files" -s -h)才可以修改成功哦。







Attrib命令详解:

attrib命令:显示、设置或删除指派给文件或目录的只读、存档、系统以及隐藏属性。如果在不含参数的情况下使用,则 attrib 命令会显示当前目录中所有文件的属性。

语法: attrib [Drive:\Path\FileName] [+r/-r] [+a/-a] [+s/-s] [+h/-h] [/s] [/d]

参数说明:

+r 设置只读文件属性。

-r 去掉只读文件属性。

+a 设置存档属性。

-a 去掉存档属性。

+s 设置系统文件属性。

-s 去掉系统文件属性。

+h 设置隐藏文件属性。

-h 去掉隐藏文件属性。

Drive:\Path\FileName 指定要显示或更改其属性的目录、文件或文件组的位置和名称。可以在FileName参数中使用通配符(?和*)来显示或更改一组文件的属性。如果文件或文件夹名称中含有空格,可以使用英文的双引号("")将其引括起来,如:Drive:\Path\"File Name"或"Drive:\Path\File Name"。

/s 将attrib和任意命令行选项应用到当前目录及其所有子目录中的匹配文件。

/d 将attrib和任意命令行选项应用到目录。

/? 在命令提示符下显示帮助。

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类: 无分类    |    来源: 转贴

评论(0) | 阅读(64)
发表于:2008-4-29 21:56:18
标签:无标签

0

代理服务器端口分配一览表

代理服务器端口分配一览表

                                     

端口

服 务

说 明

0

Reserved

通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描,使用IP地址为0.0.0.0,设置ACK位并在以太网层广播。

1

tcpmux

显示有人在寻找SGI Irix机器。Irix是实现tcpmux的主要提供者,默认情况下tcpmux在这种系统中被打开。Irix机器在发布时含有几个默认的无密码帐户,如:IP/GUEST UUCP/NUUCP/DEMOS/TUTOR/DIAG/OUTOFBOX等。许多管理员在安装后忘记删除这些帐户。因此HACKER在INTERNET上搜索tcpmux并利用这些帐户。

7

Echo

能看到许多人搜索Fraggle放大器时,发送到X.X.X.0和X.X.X.255的信息。

19

Character

Generator 这是一种仅仅发送字符的服务。UDP版本将会在收到UDP包后回应含有垃圾字符的包。TCP连接时会发送含有垃圾字符的数据流直到连接关闭。HACKER利用IP欺骗可以发动DoS攻击。伪造两个chargen服务器之间的UDP包。同样Fraggle DoS攻击向目标地址的这个端口广播一个带有伪造受害者IP的数据包,受害者为了回应这些数据而过载。

21

FTP

FTP服务器所开放的端口,用于上传、下载。最常见的攻击者用于寻找打开anonymous的FTP服务器的方法。这些服务器带有可读写的目录。木马Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口。

22

Ssh

PcAnywhere建立的TCP和这一端口的连接可能是为了寻找ssh。这一服务有许多弱点,如果配置成特定的模式,许多使用RSAREF库的版本就会有不少的漏洞存在。

23

Telnet

远程登录,入侵者在搜索远程登录UNIX的服务。大多数情况下扫描这一端口是为了找到机器运行的操作系统。还有使用其他技术,入侵者也会找到密码。木马Tiny Telnet Server就开放这个端口。

25

SMTP

SMTP服务:器所开放的端口,用于发送邮件。入侵者寻找SMTP服务器是为了传递他们的SPAM。入侵者的帐户被关闭,他们需要连接到高带宽的E-MAIL服务器上,将简单的信息传递到不同的地址。木马Antigen、Email Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放这个端口。

31

MSG

Authentication 木马Master Paradise、Hackers Paradise开放此端口。

42

WINS

Replication WINS复制

53

Domain

Name Server(DNS) DNS服务:器所开放的端口,入侵者可能是试图进行区域传递(TCP),欺骗DNS(UDP)或隐藏其他的通信。因此防火墙常常过滤或记录此端口。

67

Bootstrap

Protocol Server 通过DSL和Cable modem的防火墙常会看见大量发送到广播地址255.255.255.255的数据。这些机器在向DHCP服务器请求一个地址。HACKER常进入它们,分配一个地址把自己作为局部路由器而发起大量中间人(man-in-middle)攻击。客户端向68端口广播请求配置,服务器向67端口广播回应请求。这种回应使用广播是因为客户端还不知道可以发送的IP地址。

69

Trival

File Transfer 许多服务器与bootp一起提供这项服务,便于从系统下载启动代码。但是它们常常由于错误配置而使入侵者能从系统中窃取任何文件。它们也可用于系统写入文件。

79

Finger

Server入侵者用于获得用户信息,查询操作系统,探测已知的缓冲区溢出错误,回应从自己机器到其他机器Finger扫描。

80

HTTP

用于网页浏览。木马Executor开放此端口。

99

Metagram

Relay后门程序ncx99开放此端口。

102

Message

transfer agent(MTA)-X.400 over TCP/IP消息传输代理。

109

Post

Office Protocol -Version3 POP3服务:器开放此端口,用于接收邮件,客户端访问服务器端的邮件服务。POP3服务有许多公认的弱点。关于用户名和密码交换缓冲区溢出的弱点至少有20个,这意味着入侵者可以在真正登陆前进入系统。成功登陆后还有其他缓冲区溢出错误。

110

SUN公司的RPC服务所有端口

常见RPC服务:有rpc.mountd、NFS、rpc.statd、rpc.csmd、rpc.ttybd、amd等

113

Authentication

Service这是一个许多计算机上运行的协议,用于鉴别TCP连接的用户。使用标准的这种服务可以获得许多计算机的信息。但是它可作为许多服务:的记录器,尤其是FTP、POP、IMAP、SMTP和IRC等服务。通常如果有许多客户通过防火墙访问这些服务,将会看到许多这个端口的连接请求。记住,如果阻断这个端口客户端会感觉到在防火墙另一边与E-MAIL服务器的缓慢连接。许多防火墙支持TCP连接的阻断过程中发回RST。这将会停止缓慢的连接。

119

Network

News Transfer ProtocolNEWS新闻组传输协议,承载USENET通信。这个端口的连接通常是人们在寻找USENET服务器。多数ISP限制,只有他们的客户才能访问他们的新闻组服务器。打开新闻组服务器将允许发/读任何人的帖子,访问被限制的新闻组服务器,匿名发帖或发送SPAM。

135

Location

ServiceMicrosoft在这个端口运行DCE RPC end-point mapper为它的DCOM服务:。这与UNIX 111端口的功能很相似。使用DCOM和RPC的服务利用计算机上的end-point mapper注册它们的位置。远端客户连接到计算机时,它们查找end-point mapper找到服务的位置。HACKER扫描计算机的这个端口:是为了找到这个计算机上运行Exchange Server吗?什么版本?还有些DOS攻击直接针对这个端口。

137、138、139

NETBIOS

Name Service其中137、138是UDP端口,当通过网上邻居传输文件时用这个端口。而139端口,通过这个端口进入的连接试图获得NetBIOS/SMB服务。这个协议被用于windows文件和打印机共享和SAMBA。还有WINS Regisrtation也用它。

143

Interim

Mail Access Protocol v2和POP3的安全问题一样,许多IMAP服务器存在有缓冲区溢出漏洞。记住:一种LINUX蠕虫(admv0rm)会通过这个端口繁殖,因此许多这个端口的扫描来自不知情的已经被感染的用户。当REDHAT在他们的LINUX发布版本中默认允许IMAP后,这些漏洞变的很流行。这一端口还被用于IMAP2,但并不流行。

161

SNMP

SNMP允许远程管理设备。所有配置和运行信息的储存在数据库中,通过SNMP可获得这些信息。许多管理员的错误配置将被暴露在Internet。Cackers将试图使用默认的密码public、private访问系统。他们可能会试验所有可能的组合。SNMP包可能会被错误的指向用户的网络。

177

X

Display Manager Control Protocol许多入侵者通过它访问X-windows操作台,它同时需要打开6000端口。

389

LDAP、ILS

轻型目录访问协议和NetMeeting Internet Locator Server共用这一端口。

443

Https

网页浏览端口,能提供加密和通过安全端口传输的另一种HTTP。

456

[NULL]

木马HACKERS PARADISE开放此端口。

513

Login,remote

login是从使用cable modem或DSL登陆到子网中的UNIX计算机发出的广播。这些人为入侵者进入他们的系统提供了信息。

544

[NULL]

kerberos kshell

548

Macintosh,File

Services(AFP/IP) Macintosh,文件服务。

553

CORBA

IIOP (UDP) 使用cablemodem、DSL或VLAN将会看到这个端口的广播。CORBA是一种面向对象的RPC系统。入侵者可以利用这些信息进入系统。

555

DSF

木马PhAse1.0、Stealth Spy、IniKiller开放此端口。

568

Membership

DPA成员资格DPA。

569

Membership

MSN成员资格MSN。

635

mountd

Linux的mountd Bug。这是扫描的一个流行BUG。大多数对这个端口的扫描是基于UDP的,但是基于TCP的mountd有所增加(mountd同时运行于两个端口)。记住mountd可运行于任何端口(到底是哪个端口,需要在端口111做portmap查询),只是Linux默认端口是635,就像NFS通常运行于2049端口。

636

LDAP

SSL(Secure Sockets layer)

666

Doom

Id Software木马Attack FTP、Satanz Backdoor开放此端口

993

IMAP

SSL(Secure Sockets layer)

1001

[NULL]

木马Silencer、WebEx开放1001端口。

1011

[NULL]

木马Doly Trojan开放1011端口。

1024

Reserved

它是动态端口的开始,许多程序并不在乎用哪个端口连接网络,它们请求系统为它们分配下一个闲置端口。基于这一点分配从端口1024开始。这就是说第一个向系统发出请求的会分配到1024端口。你可以重启机器,打开Telnet,再打开一个窗口运行natstat -a将会看到Telnet被分配1024端口。还有SQL session也用此端口和5000端口。

1025、1033

1025:network

blackjack/1033:[NULL]木马netspy开放这2个端口。

1080

SOCKS

这一协议以通道方式穿过防火墙,允许防火墙后面的人通过一个IP地址访问INTERNET。理论上它应该只允许内部的通信向外到达INTERNET。但是由于错误的配置,它会允许位于防火墙外部的攻击穿过防火墙。WinGate常会发生这种错误,在加入IRC聊天室时常会看到这种情况。

1170

[NULL]

木马Streaming Audio Trojan、Psyber Stream Server、Voice开放此端口。

1234、1243、6711、6776

[NULL]

木马SubSeven2.0、Ultors Trojan开放1234、6776端口。木马SubSeven1.0/1.9开放1243、6711、6776端口。

1245

[NULL]

木马Vodoo开放此端口。

1433

SQL

Microsoft的SQL服务开放的端口。

1492

stone-design-1

木马FTP99CMP开放此端口。

1500

RPC

client fixed port session queries RPC客户固定端口会话查询

1503

NetMeeting

T.120 NetMeeting T.120

1524

ingress

许多攻击脚本将安装一个后门SHELL于这个端口,尤其是针对SUN系统中Sendmail和RPC服务漏洞的脚本。如果刚安装了防火墙就看到在这个端口上的连接企图,很可能是上述原因。可以试试Telnet到用户的计算机上的这个端口,看看它是否会给你一个SHELL。连接到600/pcserver也存在这个问题。

1600

issd

木马Shivka-Burka开放此端口。

1720

NetMeeting

NetMeeting H.233 call Setup。

1731

NetMeeting

Audio Call Control NetMeeting音频调用控制。

1807

[NULL]

木马SpySender开放此端口。

1981

[NULL]

木马ShockRave开放此端口。

1999

cisco

identification port 木马BackDoor开放此端口。

2000

[NULL]

木马GirlFriend 1.3、Millenium 1.0开放此端口。

2001

[NULL]

木马Millenium 1.0、Trojan Cow开放此端口。

2023

xinuexpansion

4木马Pass Ripper开放此端口。

2049

NFS

NFS程序常运行于这个端口。通常需要访问Portmapper查询这个服务运行于哪个端口。

2115

[NULL]

木马Bugs开放此端口。

2140、3150

[NULL]

木马Deep Throat 1.0/3.0开放此端口。

2500

RPC

client using a fixed port session replication应用固定端口会话复制的RPC客户

2583

[NULL]

木马Wincrash 2.0开放此端口。

2801

[NULL]

木马Phineas Phucker开放此端口。

3024、4092

[NULL]

木马WinCrash开放此端口。

3128

squid

这是squid HTTP代理服务器的默认端口。攻击者扫描这个端口是为了搜寻一个代理服务器而匿名访问Internet。也会看到搜索其他代理服务器的端口8000、8001、8080、8888。扫描这个端口的另一个原因是用户正在进入聊天室。其他用户也会检验这个端口以确定用户的机器是否支持代理。

3129

[NULL]

木马Master Paradise开放此端口。

3150

[NULL]

木马The Invasor开放此端口。

3210、4321

[NULL]

木马SchoolBus开放此端口。

3333

dec-notes

木马Prosiak开放此端口。

3389

超级终端

WINDOWS 2000终端开放此端口。

3700

[NULL]

木马Portal of Doom开放此端口。

3996、4060

[NULL]

木马RemoteAnything开放此端口。

4000

QQ客户端

腾讯QQ客户端开放此端口。

4092

[NULL]

木马WinCrash开放此端口。

4590

[NULL]

木马ICQTrojan开放此端口。

5000、5001、5321、50505

[NULL]

木马blazer5开放5000端口。木马Sockets deroie开放5000、5001、5321、50505端口。

5400、5401、5402

[NULL]

木马Blade unner开放此端口。

5550

[NULL]

木马xtcp开放此端口。

5569

[NULL]

木马Robo-Hack开放此端口。

5632

pcAnywere

有时会看到很多这个端口的扫描,这依赖于用户所在的位置。当用户打开pcAnywere时,它会自动扫描局域网C类网以寻找可能的代理(这里的代理是指agent而不是proxy)。入侵者也会寻找开放这种服务的计算机。,所以应该查看这种扫描的源地址。一些搜寻pcAnywere的扫描包常含端口22的UDP数据包。

5742

[NULL]

木马WinCrash1.03开放此端口。

6400

[NULL]

木马The tHing开放此端口。

6670、6671

[NULL]

木马Deep Throat开放6670端口。而Deep Throat 3.0开放6671端口。

6883

[NULL]

木马DeltaSource开放此端口。

6969

[NULL]

木马Gatecrasher、Priority开放此端口。

6970

RealAudio

RealAudio客户将从服务器的6970-7170的UDP端口接收音频数据流。这是由TCP-7070端口外向控制连接设置的。

7000

[NULL]

木马Remote Grab开放此端口。

7300、7301、7306、7307、7308

[NULL]

木马NetMonitor开放此端口。另外NetSpy1.0也开放7306端口。

7323

[NULL]

Sygate服务器端。

7626

[NULL]

木马Giscier开放此端口。

7789

[NULL]

木马ICKiller开放此端口。

8000

OICQ

腾讯QQ服务:器端开放此端口。

8010

Wingate

Wingate代理开放此端口。

8080

代理端口

WWW代理开放此端口。

9400、9401、9402

[NULL]

木马Incommand 1.0开放此端口。

9872、9873、9874、9875、10067、10167

[NULL]

木马Portal of Doom开放此端口。

9989

[NULL]

木马iNi-Killer开放此端口。

11000

[NULL]

木马SennaSpy开放此端口。

11223

[NULL]

木马Progenic trojan开放此端口。

12076、61466

[NULL]

木马Telecommando开放此端口。

12223

[NULL]

木马Hack99 KeyLogger开放此端口。

12345、12346

[NULL]

木马NetBus1.60/1.70、GabanBus开放此端口。

12361

[NULL]

木马Whack-a-mole开放此端口。

13223

PowWow

PowWow是Tribal Voice的聊天程序。它允许用户在此端口打开私人聊天的连接。这一程序对于建立连接非常具有攻击性。它会驻扎在这个TCP端口等回应。造成类似心跳间隔的连接请求。如果一个拨号用户从另一个聊天者手中继承了IP地址就会发生好象有很多不同的人在测试这个端口的情况。这一协议使用OPNG作为其连接请求的前4个字节。

16969

[NULL]

木马Priority开放此端口。

17027

Conducent

这是一个外向连接。这是由于公司内部有人安装了带有Conducent"adbot"的共享软件。Conducent"adbot"是为共享软件显示广告服务的。使用这种服务的一种流行的软件是Pkware。

19191

[NULL]

木马蓝色火焰开放此端口。

20000、20001

[NULL]

木马Millennium开放此端口。

20034

[NULL]

木马NetBus Pro开放此端口。

21554

[NULL]

木马GirlFriend开放此端口。

22222

[NULL]

木马Prosiak开放此端口。

23456

[NULL]

木马Evil FTP、Ugly FTP开放此端口。

26274、47262

[NULL]

木马Delta开放此端口。

27374

[NULL]

木马Subseven 2.1开放此端口。

30100

[NULL]

木马NetSphere开放此端口。

30303

[NULL]

木马Socket23开放此端口。

30999

[NULL]

木马Kuang开放此端口。

31337、31338

[NULL]

木马BO(Back Orifice)开放此端口。另外木马DeepBO也开放31338端口。

31339

[NULL]

木马NetSpy DK开放此端口。

31666

[NULL]

木马BOWhack开放此端口。

33333

[NULL]

木马Prosiak开放此端口。

34324

[NULL]

木马Tiny Telnet Server、BigGluck、TN开放此端口。

40412

[NULL]

木马The Spy开放此端口。

40421、40422、40423、40426

[NULL]

木马Masters Paradise开放此端口。

43210、54321

[NULL]

木马SchoolBus 1.0/2.0开放此端口。

44445

[NULL]

木马Happypig开放此端口。

50766

[NULL]

木马Fore开放此端口。

53001

[NULL]

木马Remote Windows Shutdown开放此端口。

65000

[NULL]

木马Devil 1.03开放此端口。

88

Kerberos

krb5。另外TCP的88端口也是这个用途。

137

SQL

Named Pipes encryption over other protocols name lookup(其他协议名称查找上的SQL命名管道加密技术)和SQL RPC encryption over other protocols name lookup(其他协议名称查找上的SQL RPC加密技术)和Wins NetBT name service(WINS NetBT名称服务)和Wins Proxy都用这个端口。

161

Simple

Network Management Protocol(SMTP)(简单网络管理协议)

162

SNMP

Trap(SNMP陷阱)

445

Common

Internet File System(CIFS)(公共Internet文件系统)

464

Kerberos

kpasswd(v5)。另外TCP的464端口也是这个用途。

500

Internet

Key Exchange(IKE)(Internet密钥交换)

1645、1812

Remot

Authentication Dial-In User Service(RADIUS)authentication(Routing and Remote Access)(远程认证拨号用户服务)

1646、1813

RADIUS

accounting(Routing and Remote Access)(RADIUS记帐(路由和远程访问))

1701

Layer

Two Tunneling Protocol(L2TP)(第2层隧道协议)

1801、3527

Microsoft

Message Queue Server(Microsoft消息队列服务器)。还有TCP的135、1801、2101、2103、2105也是同样的用途。

2504

Network

Load Balancing(网络平衡负荷)

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类: 无分类    |    来源: 整理

评论(0) | 阅读(122)
发表于:2008-4-15 21:39:57
标签:无标签

1

Quartus II 中的Warning(zt)

 

以下内容转载自EDACN

1.Found clock-sensitive change during active clock edge at time <time> on register "<name>"
原因:vector source file中时钟敏感信号(如:数据,允许端,清零,同步加载等)在时钟的边缘同时变化。而时钟敏感信号是不能在时钟边沿变化的。其后果为导致结果不正确。
措施:编辑vector source file

2.Verilog HDL assignment warning at <location>: truncated value with size <number> to match size of target (<number>

原因:在HDL设计中对目标的位数进行了设定,如:reg[4:0] a;而默认为32位,将位数裁定到合适的大小
措施:如果结果正确,无须加以修正,如果不想看到这个警告,可以改变设定的位数

3.All reachable assignments to data_out(10) assign '0', register removed by optimization
原因:经过综合器优化后,输出端口已经不起作用了

4.Following 9 pins have nothing, GND, or VCC driving datain port -- changes to this connectivity may change fitting results
原因:第9脚,空或接地或接上了电源
措施:有时候定义了输出端口,但输出端直接赋‘0’,便会被接地,赋‘1’接电源。如果你的设计中这些端口就是这样用的,那便可以不理会这些warning

5.Found pins functioning as undefined clocks and/or memory enables
原因:是你作为时钟的PIN没有约束信息。可以对相应的PIN做一下设定就行了。主要是指你的某些管脚在电路当中起到了时钟管脚的作用,比如flip-flop的clk管脚,而此管脚没有时钟约束,因此QuartusII把“clk”作为未定义的时钟。
措施:如果clk不是时钟,可以加“not clock”的约束;如果是,可以在clock setting当中加入;在某些对时钟要求不很高的情况下,可以忽略此警告或在这里修改:Assignments>Timing analysis settings...>Individual clocks...>...

6.Timing characteristics of device EPM570T144C5 are preliminary
原因:因为MAXII 是比較新的元件在 QuartusII 中的時序并不是正式版的,要等 Service Pack
措施:只影响 Quartus 的 Waveform

7.Warning: Clock latency analysis for PLL offsets is supported for the current device family, but is not enabled
措施:将setting中的timing Requirements&Option-->More Timing Setting-->setting-->Enable Clock Latency中的on改成OFF

8.Found clock high time violation at 14.8 ns on register "|counter|lpm_counter:count1_rtl_0|dffs[11]"
原因:违反了steup/hold时间,应该是后仿真,看看波形设置是否和时钟沿符合steup/hold时间
措施:在中间加个寄存器可能可以解决问题

9.warning: circuit may not operate.detected 46 non-operational paths clocked by clock clk44 with clock skew larger than data delay
原因:时钟抖动大于数据延时,当时钟很快,而if等类的层次过多就会出现这种问题,但这个问题多是在器件的最高频率中才会出现
措施:setting-->timing Requirements&Options-->Default required fmax 改小一些,如改到50MHZ

10.Design contains <number> input pin(s) that do not drive logic
原因:输入引脚没有驱动逻辑(驱动其他引脚),所有的输入引脚需要有输入逻辑
措施:如果这种情况是故意的,无须理会,如果非故意,输入逻辑驱动.

11.Warning:Found clock high time violation at 8.9ns on node 'TEST3.CLK'
原因:FF中输入的PLS的保持时间过短
措施:在FF中设置较高的时钟频率

12.Warning: Found 10 node(s) in clock paths which may be acting as ripple and/or gated clocks -- node(s) analyzed as buffer(s) resulting in clock skew
原因:如果你用的 CPLD 只有一组全局时钟时,用全局时钟分频产生的另一个时钟在布线中当作信号处理,不能保证低的时钟歪斜(SKEW)。会造成在这个时钟上工作的时序电路不可靠,甚至每次布线产生的问题都不一样。
措施:如果用有两组以上全局时钟的 FPGA 芯片,可以把第二个全局时钟作为另一个时钟用,可以解决这个问题。

13.Critical Warning: Timing requirements were not met. See Report window for details.
原因:时序要求未满足,
措施:双击Compilation Report-->Time Analyzer-->红色部分(如clock setup:'clk'等)-->左键单击list path,查看fmax的SLACK REPORT再根据提示解决,有可能是程序的算法问题

14.Can't achieve minimum setup and hold requirement <text> along <number> path(s). See Report window for details.
原因:时序分析发现一定数量的路径违背了最小的建立和保持时间,与时钟歪斜有关,一般是由于多时钟引起的
措施:利用Compilation Report-->Time Analyzer-->红色部分(如clock hold:'clk'等),在slack中观察是hold time为负值还是setup time 为负值,然后在:Assignment-->Assignment Editor-->To中增加时钟名(from node finder),Assignment Name中增加
和多时钟有关的Multicycle 和Multicycle Hold选项,如hold time为负,可使Multicycle hold的值>multicycle,如设为2和1。

15: Can't analyze file -- file E://quartusii/*/*.v is missing
原因:试图编译一个不存在的文件,该文件可能被改名或者删除了
措施:不管他,没什么影响

16.Warning: Can't find signal in vector source file for input pin |whole|clk10m
原因:因为你的波形仿真文件( vector source file )中并没有把所有的输入信号(input pin)加进去,对于每一个输入都需要有激励源的

17.Error: Can't name logic function scfifo0 of instance "inst" -- function has same name as current design file
原因:模块的名字和project的名字重名了
措施:把两个名字之一改一下,一般改模块的名字

18.Warning: Using design file lpm_fifo0.v, which is not specified as a design file for the current project, but contains definitions for 1 design units and 1 entities in project Info: Found entity 1: lpm_fifo0
原因:模块不是在本项目生成的,而是直接copy了别的项目的原理图和源程序而生成的,而不是用QUARTUS将文件添加进本项目
措施:无须理会,不影响使用

19.Timing characteristics of device <name> are preliminary
原因:目前版本的QuartusII只对该器件提供初步的时序特征分析
措施:如果坚持用目前的器件,无须理会该警告。关于进一步的时序特征分析会在后续版本的Quartus得到完善。

20.Timing Analysis does not support the analysis of latches as synchronous elements for the currently selected device family
原因:用analyze_latches_as_synchronous_elements setting可以让Quaruts II来分析同步锁存,但目前的器件不支持这个特性
措施:无须理会。时序分析可能将锁存器分析成回路。但并不一定分析正确。其后果可能会导致显示提醒用户:改变设计来消除锁      存器

21.Warning:Found xx output pins without output pin load capacitance assignment(网友:gucheng82提供)
原因:没有给输出管教指定负载电容
措施:该功能用于估算TCO和功耗,可以不理会,也可以在Assignment Editor中为相应的输出管脚指定负载电容,以消除警告

22.Warning: Found 6 node(s) in clock paths which may be acting as ripple and/or gated clocks -- node(s) analyzed as buffer(s) resulting in clock skew

原因:使用了行波时钟或门控时钟,把触发器的输出当时钟用就会报行波时钟,将组合逻辑的输出当时钟用就会报门控时钟
措施:不要把触发器的输出当时钟,不要将组合逻辑的输出当时钟,如果本身如此设计,则无须理会该警告

23.Warning (10268): Verilog HDL information at lcd7106.v(63): Always Construct contains both blocking and non-blocking assignments
原因: 一个always模块中同时有阻塞和非阻塞的赋值

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(238)
发表于:2008-4-15 10:22:16
标签:无标签

1

在QuartusII中编译VHDL的package

在QuartusII中编译VHDLpackage(ZT)

在网上down的源码有些时候要自己来编译,用Quartus来编译VHDL的源码,当有package的时候,不能像在ISE中那样直接用work.packagename.all就可以把package包含进去,用quartus会出现一个错误说找不到这个package。解决这个问题可以使用user library,在当前项目中新建一个目录,起名比方说叫my_lib,然后把要编译的package放进去,然后在Assignments中settings(ctrl + shift + E)左边User Libraries,在右边的library name中添加刚才建的目录即my_lib,然后选左边的files把package文件添加到工程里面。在工程中要引用这个package就可以这样写,在需要引用这个package的文件头添加
 library my_lib;
 use my_lib.packagename.all;
,执行编译就可以了。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(1) | 阅读(235)
发表于:2008-1-8 11:29:23
标签:数字示波器使用  

0

数字示波器使用

数字示波器因具有波形触发、存储、显示、测量、波形数据分析处理等独特优点,其使用日益普及。由于数字示波器与模拟示波器之间存在较大的性能差异,如果使用不当,会产生较大的测量误差,从而影响测试任务。

 

a.区分模拟带宽和数字实时带宽

 

  带宽是示波器最重要的指标之一。模拟示波器的带宽是一个固定的值,而数字示波器的带宽有模拟带宽和数字实时带宽两种。数字示波器对重复信号采用顺序采样或随机采样技术所能达到的最高带宽为示波器的数字实时带宽,数字实时带宽与最高数字化频率和波形重建技术因子K相关(数字实时带宽=最高数字化速率/K),一般并不作为一项指标直接给出。从两种带宽的定义可以看出,模拟带宽只适合重复周期信号的测量,而数字实时带宽则同时适合重复信号和单次信号的测量。厂家声称示波器的带宽能达到多少兆,实际上指的是模拟带宽,数字实时带宽是要低于这个值的。例如说TEK公司的TES520B的带宽为500MHz,实际上是指其模拟带宽为500MHz,而最高数字实时带宽只能达到400MHz远低于模拟带宽。所以在测量单次信号时,一定要参考数字示波器的数字实时带宽,否则会给测量带来意想不到的误差。

 

b.有关采样速率

 

  采样速率也称为数字化速率,是指单位时间内,对模拟输入信号的采样次数,常以MS/s表示。采样速率是数字示波器的一项重要指标。

 

  1.如果采样速率不够,容易出现混迭现象

 

  如果示波器的输人信号为一个100KHz的正弦信号,示波器显示的信号频率却是50KHz,这是怎么回事呢?这是因为示波器的采样速率太慢,产生了混迭现象。混迭就是屏幕上显示的波形频率低于信号的实际频率,或者即使示波器上的触发指示灯已经亮了,而显示的波形仍不稳定。混迭的产生如图1所示。那么,对于一个未知频率的波形,如何判断所显示的波形是否已经产生混迭呢?可以通过慢慢改变扫速t/div到较快的时基档,看波形的频率参数是否急剧改变,如果是,说明波形混迭已经发生;或者晃动的波形在某个较快的时基档稳定下来,也说明波形混迭已经发生。根据奈奎斯特定理,采样速率至少高于信号高频成分的2倍才不会发生混迭,如一个500MHz的信号,至少需要1GS/s的采样速率。有如下几种方法可以简单地防止混迭发生:
  ·调整扫速;
  ·采用自动设置(Autoset);
  ·试着将收集方式切换到包络方式或峰值检测方式,因为包络方式是在多个收集记录中寻找极值,而峰值检测方式则是在单个收集记录中寻找最大最小值,这两种方法都能检测到较快的信号变化。

 

  ·如果示波器有Insta Vu采集方式,可以选用,因为这种方式采集波形速度快,用这种方法显示的波形类似于用模拟示波器显示的波形。

 

  2.采样速率与t/div的关系

 

  每台数字示波器的最大采样速率是一个定值。但是,在任意一个扫描时间t/div,采样速率fs由下式给出:
      fs=N/(t/div)       N为每格采样点
  当采样点数N为一定值时,fs与t/div成反比,扫速越大,采样速率越低。下面是TDS520B的一组扫速与采样速率的数据:
表1扫速与采样速率
t/div(ns)1252550100200fs(GS/s)502510210.50.25
  综上所述,使用数字示波器时,为了避免混迭,扫速档最好置于扫速较快的位置。如果想要捕捉到瞬息即逝的毛刺,扫速档则最好置于主扫速较慢的位置。
数字示波器的上升时间

 

  在模拟示波器中,上升时间是示波器的一项极其重要的指标。而在数字示波器中,上升时间甚至都不作为指标明确给出。由于数字示波器测量方法的原因,以致于自动测量出的上升时间不仅与采样点的位置相关,如图2中a表示上升沿恰好落在两采样点中间,这时上升时间为数字化间隔的0.8倍。图2中的b的上升沿的中部有一采样点,则同样的波形,上升时间为数字化间隔的1.6倍。另外,上升时间还与扫速有关,下面是TDS520B测量同一波形时的一组扫速与上升时间的数据:
表2扫速与上升时间
t/div(ms)502010521tr(μs)800320160803216
  由上面这组数据可以看出,虽然波形的上升时间是一个定值,而用数字示波器测量出来的结果却因为扫速不同而相差甚远。模拟示波器的上升时间与扫速无关,而数字示波器的上升时间不仅与扫速有关,还与采样点的位置有关,使用数字示波器时,我们不能象用模拟示波器那样,根据测出的时间来反推出信号的上升时间。
C. 探头是怎样工作的

 

  示波器探头不仅仅是把测试信号判定以示波器输入端的一段导线,而且是测量系统的重要组成部分。探头有很多种类型号各有其没的特性,以适应各种不同的专门工作的击破要,其中一类称为有源探头,探头内包含有源电子元件可以提供放大能力,不含有源元件的探头称为无源探头,其中只包含无源元件如电阻和电容。这种探头通常对输入信号进行衰减。
  我们将首先集中讨论通用无源探头,说明共主要技术指标以及探头对被测电路和被测信号的影响,接着简单介绍几种专用探头及其附近。

 

屏蔽

 

  探头的一个重要任务是确保只有希望观测的信号才在示波器上出现,如果我们仅仅使用一面导线来代替探头,那到它的作用就好象是一根天线,可以从无线电台、荧光灯,电机、50或60Hz的电源的交流声甚至当地业余无线电爱好者那里接收到很多不希望的干扰信号,其些这类噪声甚至还能抽向注入到被测电路中去所以我们首先需要的是屏蔽的电缆,示波器探头的屏蔽电缆通过们于探头尖端的接地线和被测电路连接,从而保证了很好的屏蔽。

 

探头带宽

 

  和示波器一们,探头也具有其允许的有限带宽。如果我们使用一台100MHz的示波器和一个100MHz的探头,那么它们组合起来的响应就小于100MHz,探头的电容和示波器的输入电容相加,这就减小了系统的带宽,加大了显示的上升时间tr见第一章1.3节上升时间。

 

使用公式

 

  tr(ns)=350/BW(MHz)

 

   如果示波器和探头各自均为100MHz带宽,其上升时间均为tr=3.5ns 。则有效系统上升时间就由下式给出:

 

   trsystem=sqr(t2rscope+t2rprobe)

 

   =sqr(3.52+3.52)ns

 

   =sqr(24.5)2ns

 

   =4.95ns

 

  根据4.95ns的系统上升时间求得,系统带宽为350/4.95MHz=70.7MHz。
   Fluke公司给所有示波器配备的探头都能使示波器保证在探头尖端获得规定的示波器带宽,从上述的计算可以看出,视觉要求探头本射的带宽要比示波器的带宽宽得多。

 

负载效应

 

  当我们进行测量时,我们常常以为测得的电压和电路中未连入示波器时是完全一样的。
  实际上,每个探头都有其输入阻抗,输入阻抗包含了电阻、电容和电感分量。由于探头引入的额外负载,所以连入探头后就会影响被测电路我以当我们分析测量结果时必须考虑探头的特性以及测试电路的阻抗。
  有些探头里没有串联的电阻,这类探头主要就由一段电缆和一个测试头构成,因此,在其工作频率范围或有用带宽之内,探头对信号没有衰减作用。这类探头称为1:1或X1探头。由于这类探头在测试点处将其自身的电容(包括电缆的电容)与示波器的输入阻抗连在了一起,所以这种探头具有负载效应。见图42。
图42 探头的等效电路

 

  当信号频率啬时,探头的容性负载效应京戏得更加显著。由于电缆的类型和长度的不同以及探头本身构造等原因,1:1探头的输入电容通常可以从大约35pF到100pF以上,这等于给被测电路施加了一个低阻抗菌素负载,具有47pF输入电容1:1探头在20MHz之下的电抗仅为169W,这就使得这个探头在此频率无法使用。

 

衰减式探头减小了负载效应

 

  我们可以在探头中增加一个和示波器输入阻抗相串联的阻抗,用这种办法就可以减小探头的负载效应。然而,这就意味着输入电压不能完全加到示波器的输入端,因为我们现在已经引入了一个分压器。
  图43给出了一处简化的探头等效电路,Rp和Rs构成了一个10:1的分压器,Rs为示波器的输入阻抗。调节补偿电容C补偿使得探头和示波器械相匹配,视觉保证了在探头的尖端获得正确的频率响应曲线,宋一来就使得这种探头的频率响应比1:1探头频率响应要宽得多。
图43 10:1探头电路图

 

    示波器的标准输入电阻为1MΩ。这就要求在探头中串联9MΩ的电阻,使得在低频时探头尖端的输入阻抗为10MΩ。

 

探头补偿

 

  一个实际的10:1探头具有几个可调的电容和电阻以便在很宽的频率范围内获得正确的频率响应,这些可调元件的大多数都是在制造探头时由工厂调好的。只有一个微调电容留给用户去调节。这个电容称为低频补偿电容,应当通过调节这个电容使得探头和与相配用的示波器匹配,使用示波器前面板上的信号输出可以很容易地进行这项调节工作,示波器的这个输出端标有"探头调节"、"校准器""CAL"或者"探头校准"等标志,并能送出一个方波输出电压。方波中包含很多频率分量。当所有这些分量都以正确的幅度送至示波器时,就能在示流器屏幕上再现方波信号。图44示出探头欠补偿,正确补偿和过补偿的影响。
图44 在2kHz方波和1MHz正弦波之下观察不同探头补偿情况的影响。

 

  可以看出,在较高的的频率下探头过补偿和欠补偿和欠被偿情况下1MHz正弦波的幅度是很不准确的。
  所以在使用的衰减探头之前一定不要忘记检查探头的补偿情况。由于一台示波器的不同输入通道的输入电容可能有小的差异,所以您应当按照示波器上要使用的通道来进行探头补偿调整工作。

 

最大输入电压
  多数通用10:1探头的构造使这些探头适合于最大输入电压为峰值400V或500V的情况下使用,所以这些探头可以用于信号电平高达数百伏的广泛的应用场合,对于需要测量更高电压的场面合,我们推荐使用电压额定值更高的100:1探头。

 

探头读出

 

  现代示波器探头都装有编码系统,使得示波器能够识别与它相连年的探头类型。从而使示波器能够高速垂直偏转指示值及所有幅度测量结果以避免发生泥淆。而如果使用不带这种识别系统的探头,则用户就不得不自己为所有波形显示和测量结果重新定樯以便反映出探头的衰减量。

 

接地引线电感

 

    图45说明探头的接地引线电感如何与探头及示波器的输入电容形成串联谐振电路。而探头的输入电阻则在谐振电路中引入阻尼。
图45 带有接地引线电感的探头等效电路

 

  像其它谐振电路一亲,如果在探头上加入阶跃电压则此谐振电路也会发生振铃现象,过大的接地引线电感还会使示波器显示的上升时间变差,图46显示出使用不同长度的接地引线时,连至示波器的快速上升沿脉冲的显示波形。
图46 接地引线对脉冲响应的影响

 

    从图中我们可以清楚的看到接地引线电感对测量结果的影响,所以一定要使探头的接地引线尽可能的短,特别是在测高频和快速上升沿的信号时尤应注意。

 

安全接地

 

  为保证电气上的安全,多数示波器都通过电源线与安全地线相连。被测信号有可能和地线具有相同的参考电位,但并非必然如此,因此在连接探头的地线时,一定要注意不要因此而把被测系统的某一部分短路。另一方面,既使被测系统和示波器的地线具有相同的参考电位,这也并不意味着可以用安全地线来作信号返回通路,这是由于安全地线连接走线很长,具有很大的引线电感,因此不适合作信号返回通路。这时一定要用探头的接地引线来作为信号的参考地线

点击此处查看原文 >>

系统分类: 测试测量   |    用户分类: 无分类    |    来源: 转贴

评论(4) | 阅读(661)
发表于:2008-1-8 11:24:54
标签:51单片机编程基础  

1

51单片机编程基础

基础知识:单片机编程基础

单片机的外部结构:

1、 DIP40双列直插;
2、 P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)
3、 电源VCC(PIN40)和地线GND(PIN20);
4、 高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)
5、 内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)
6、 程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)
7、 P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1

单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)
1、 四个8位通用I/O端口,对应引脚P0、P1、P2和P3;
2、 两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)
3、 一个串行通信接口;(SCON,SBUF)
4、 一个中断控制器;(IE,IP)

针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。教科书的160页给出了针对MCS51系列单片机的C语言扩展变量类型。

C语言编程基础:
1、 十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。
2、 如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。
3、 ++var表示对变量var先增一;var—表示对变量后减一。
4、 x |= 0x0f;表示为 x = x | 0x0f;
5、 TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。
6、 While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;}

在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)
#i nclude <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P1.3
void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
 P1_3 = 1;   //给P1_3赋值1,引脚P1.3就能输出高电平VCC
 While( 1 );  //死循环,相当 LOOP: goto LOOP;
}
注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。

在某引脚输出低电平的编程方法:(比如P2.7引脚)
#i nclude <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2.7
void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
 P2_7 = 0;   //给P2_7赋值0,引脚P2.7就能输出低电平GND
 While( 1 );  //死循环,相当 LOOP: goto LOOP;
}

在某引脚输出方波编程方法:(比如P3.1引脚)
#i nclude <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P3.1
void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
 While( 1 )  //非零表示真,如果为真则执行下面循环体的语句
 {
P3_1 = 1;  //给P3_1赋值1,引脚P3.1就能输出高电平VCC
  P3_1 = 0;  //给P3_1赋值0,引脚P3.1就能输出低电平GND
 }    //由于一直为真,所以不断输出高、低、高、低……,从而形成方波
}

将某引脚的输入电平取反后,从另一个引脚输出:( 比如 P0.4 = NOT( P1.1) )
#i nclude <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P0.4和P1.1
void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
 P1_1 = 1;   //初始化。P1.1作为输入,必须输出高电平
While( 1 )  //非零表示真,如果为真则执行下面循环体的语句
 {
if( P1_1 == 1 )  //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC
  { P0_4 = 0;  } //给P0_4赋值0,引脚P0.4就能输出低电平GND
  else     //否则P1.1输入为低电平GND
  //{ P0_4 = 0;  } //给P0_4赋值0,引脚P0.4就能输出低电平GND
  { P0_4 = 1;  } //给P0_4赋值1,引脚P0.4就能输出高电平VCC
 }    //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平
}

将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) )
#i nclude <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3
void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
 P3 = 0xff;  //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平
While( 1 )  //非零表示真,如果为真则执行下面循环体的语句
 {    //取反的方法是异或1,而不取反的方法则是异或0
P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出
 }    //由于一直为真,所以不断将P3取反输出到P2
}
注意:一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。


第一节:单数码管按键显示
单片机最小系统的硬件原理接线图:
1、 接电源:VCC(PIN40)、GND(PIN20)。加接退耦电容0.1uF
2、 接晶体:X1(PIN18)、X2(PIN19)。注意标出晶体频率(选用12MHz),还有辅助电容30pF
3、 接复位:RES(PIN9)。接上电复位电路,以及手动复位电路,分析复位工作原理
4、 接配置:EA(PIN31)。说明原因。

发光二极的控控制:单片机I/O输出
将一发光二极管LED的正极(阳极)接P1.1,LED的负极(阴极)接地GND。只要P1.1输出高电平VCC,LED就正向导通(导通时LED上的压降大于1V),有电流流过LED,至发LED发亮。实际上由于P1.1高电平输出电阻为10K,起到输出限流的作用,所以流过LED的电流小于(5V-1V)/10K = 0.4mA。只要P1.1输出低电平GND,实际小于0.3V,LED就不能导通,结果LED不亮。

开关双键的输入:输入先输出高
一个按键KEY_ON接在P1.6与GND之间,另一个按键KEY_OFF接P1.7与GND之间,按KEY_ON后LED亮,按KEY_OFF后LED灭。同时按下LED半亮,LED保持后松开键的状态,即ON亮OFF灭。
#i nclude <at89x52.h>
#define LED  P1^1   //用符号LED代替P1_1
#define KEY_ON P1^6   //用符号KEY_ON代替P1_6
#define KEY_OFF P1^7   //用符号KEY_OFF代替P1_7
void main( void )    //单片机复位后的执行入口,void表示空,无输入参数,无返回值
{
 KEY_ON = 1;  //作为输入,首先输出高,接下KEY_ON,P1.6则接地为0,否则输入为1
 KEY_OFF = 1;  //作为输入,首先输出高,接下KEY_OFF,P1.7则接地为0,否则输入为1
 While( 1 )  //永远为真,所以永远循环执行如下括号内所有语句
 {
  if( KEY_ON==0 ) LED=1; //是KEY_ON接下,所示P1.1输出高,LED亮
  if( KEY_OFF==0 ) LED=0; //是KEY_OFF接下,所示P1.1输出低,LED灭
 } //松开键后,都不给LED赋值,所以LED保持最后按键状态。
//同时按下时,LED不断亮灭,各占一半时间,交替频率很快,由于人眼惯性,看上去为半亮态
}

数码管的接法和驱动原理
一支七段数码管实际由8个发光二极管构成,其中7个组形构成数字8的七段笔画,所以称为七段数码管,而余下的1个发光二极管作为小数点。作为习惯,分别给8个发光二极管标上记号:a,b,c,d,e,f,g,h。对应8的顶上一画,按顺时针方向排,中间一画为g,小数点为h。
我们通常又将各二极与一个字节的8位对应,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7),相应8个发光二极管正好与单片机一个端口Pn的8个引脚连接,这样单片机就可以通过引脚输出高低电平控制8个发光二极的亮与灭,从而显示各种数字和符号;对应字节,引脚接法为:a(Pn.0),b(Pn.1),c(Pn.2),d(Pn.3),e(Pn.4),f(Pn.5),g(Pn.6),h(Pn.7)。
如果将8个发光二极管的负极(阴极)内接在一起,作为数码管的一个引脚,这种数码管则被称为共阴数码管,共同的引脚则称为共阴极,8个正极则为段极。否则,如果是将正极(阳极)内接在一起引出的,则称为共阳数码管,共同的引脚则称为共阳极,8个负极则为段极。
以单支共阴数码管为例,可将段极接到某端口Pn,共阴极接GND,则可编写出对应十六进制码的七段码表字节数据如右图:

16键码显示的程序
我们在P1端口接一支共阴数码管SLED,在P2、P3端口接16个按键,分别编号为KEY_0、KEY_1到KEY_F,操作时只能按一个键,按键后SLED显示对应键编号。
#i nclude <at89x52.h>
#define SLED P1
#define KEY_0 P2^0
#define KEY_1 P2^1
#define KEY_2 P2^2
#define KEY_3 P2^3
#define KEY_4 P2^4
#define KEY_5 P2^5
#define KEY_6 P2^6
#define KEY_7 P2^7
#define KEY_8 P3^0
#define KEY_9 P3^1
#define KEY_A P3^2
#define KEY_B P3^3
#define KEY_C P3^4
#define KEY_D P3^5
#define KEY_E P3^6
#define KEY_F P3^7
Code unsigned char Seg7Code[16]= //用十六进数作为数组下标,可直接取得对应的七段编码字节
// 0     1    2     3     4    5     6     7     8     9    A     b     C     d    E    F
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
void main( void )
{
 unsigned char i="0"; //作为数组下标
P2 = 0xff; //P2作为输入,初始化输出高
 P3 = 0xff; //P3作为输入,初始化输出高
 While( 1 )
 {
  if( KEY_0 == 0 ) i="0";  if( KEY_1 == 0 ) i="1";
  if( KEY_2 == 0 ) i="2";  if( KEY_3 == 0 ) i="3";
  if( KEY_4 == 0 ) i="4";  if( KEY_5 == 0 ) i="5";
  if( KEY_6 == 0 ) i="6";  if( KEY_7 == 0 ) i="7";
  if( KEY_8 == 0 ) i="8";  if( KEY_9 == 0 ) i="9";
  if( KEY_A == 0 ) i="0xA";  if( KEY_B == 0 ) i="0xB";
  if( KEY_C == 0 ) i="0xC";  if( KEY_D == 0 ) i="0xD";
  if( KEY_E == 0 ) i="0xE";  if( KEY_F == 0 ) i="0xF";
  SLED = Seg7Code[ i ]; //开始时显示0,根据i取应七段编码
}
}
第二节:双数码管可调秒表
解:只要满足题目要求,方法越简单越好。由于单片机I/O资源足够,所以双数码管可接成静态显示方式,两个共阴数码管分别接在P1(秒十位)和P2(秒个位)口,它们的共阴极都接地,安排两个按键接在P3.2(十位数调整)和P3.3(个位数调整)上,为了方便计时,选用12MHz的晶体。为了达到精确计时,选用定时器方式2,每计数250重载一次,即250us,定义一整数变量计数重载次数,这样计数4000次即为一秒。定义两个字节变量S10和S1分别计算秒十位和秒个位。编得如下程序:
#i nclude <at89x52.h>
Code unsigned char Seg7Code[16]= //用十六进数作为数组下标,可直接取得对应的七段编码字节
// 0     1    2     3     4    5     6     7     8     9    A     b     C     d    E    F
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
void main( void )
{
 unsigned int us250 = 0;
 unsigned char s10 = 0;
 unsigned char s1 = 0;
 unsigned char key10 = 0; //记忆按键状态,为1按下
 unsigned char key1 = 0;  //记忆按键状态,为1按下
 //初始化定时器 Timer0
 TMOD = (TMOD & 0xF0) | 0x02;
 TH1 = -250; //对于8位二进数来说,-250=6,也就是加250次1时为256,即为0
 TR1 = 1;
 while(1){           //----------循环1
  P1 = Seg7Code[ s10 ]; //显示秒十位
  P2 = Seg7Code[ s1 ]; //显示秒个位
  while( 1 ){         //----------循环2
   //计时处理
if( TF0 == 1 ){
    TF0 = 0;
    if( ++us250 >= 4000 ){
     us250 = 0;
     if( ++s1 >= 10 ){
      s1 = 0;
      if( ++s10 >= 6 ) s10 = 0;
     }
     break; //结束“循环2”,修改显示
    }
   }
   //按十位键处理
   P3.2 = 1;  //P3.2作为输入,先要输出高电平
   if( key10 == 1 ){ //等松键
 if( P3.2 == 1 ) key10=0;
   }
else{   //未按键
    if( P3.2 == 0 ){
     key10 = 1;
 if( ++s10 >= 6 ) s10 = 0;
     break; //结束“循环2”,修改显示
    }
   }
   //按个位键处理
   P3.3 = 1;  //P3.3作为输入,先要输出高电平
   if( key1 == 1 ) //等松键
{ if( P3.3 == 1 ) key1=0; }
   else {   //未按键
    if( P3.3 == 0 ){ key1 = 1;
 if( ++s1 >= 10 ) s1 = 0;
     break; //结束“循环2”,修改显示
    }
   }
  } //循环2’end
  }//循环1’end
}//main’end
    
第三节:十字路***通灯
如果一个单位时间为1秒,这里设定的十字路***通灯按如下方式四个步骤循环工作:
? 60个单位时间,南北红,东西绿;
? 10个单位时间,南北红,东西黄;
? 60个单位时间,南北绿,东西红;
? 10个单位时间,南北黄,东西红;
解:用P1端口的6个引脚控制交通灯,高电平灯亮,低电平灯灭。
#i nclude <at89x52.h>
//sbit用来定义一个符号位地址,方便编程,提高可读性,和可移植性
sbit SNRed =P1^0;  //南北方向红灯
sbit SNYellow =P1^1;  //南北方向黄灯
sbit SNGreen =P1^2;  //南北方向绿灯
sbit EWRed =P1^3;  //东西方向红灯
sbit EWYellow =P1^4;  //东西方向黄灯
sbit EWGreen =P1^5;  //东西方向绿灯
/* 用软件产生延时一个单位时间 */
void Delay1Unit( void )   
{
 unsigned int i, j;
 for( i="0"; i<1000; i++ )
  for( j<0; j<1000; j++ ); //通过实测,调整j循环次数,产生1ms延时
//还可以通过生成汇编程序来计算指令周期数,结合晶体频率来调整j循环次数,接近1ms
}
/* 延时n个单位时间 */
void Delay( unsigned int n ){ for( ; n!=0; n-- ) Delay1Unit(); }
void main( void )
{
 while( 1 )
 {
  SNRed=0; SNYellow="0"; SNGreen="1"; EWRed="1"; EWYellow="0"; EWGreen="0"; Delay( 60 );
  SNRed=0; SNYellow="1"; SNGreen="0"; EWRed="1"; EWYellow="0"; EWGreen="0"; Delay( 10 );
  SNRed=1; SNYellow="0"; SNGreen="0"; EWRed="0"; EWYellow="0"; EWGreen="1"; Delay( 60 );
  SNRed=1; SNYellow="0"; SNGreen="0"; EWRed="0"; EWYellow="1"; EWGreen="0"; Delay( 10 );
 }
}

第四节:数码管驱动
显示“12345678”
P1端口接8联共阴数码管SLED8的段极:P1.7接段h,…,P1.0接段a
P2端口接8联共阴数码管SLED8的段极:P2.7接左边的共阴极,…,P2.0接右边的共阴极
方案说明:晶振频率fosc=12MHz,数码管采用动态刷新方式显示,在1ms定时断服务程序中实现
#i nclude <at89x92.h>
unsigned char DisBuf[8];  //全局显示缓冲区,DisBuf[0]对应右SLED,DisBuf[7]对应左SLED,
void DisplayBrush( void )
{ code unsigned char cathode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //阴极控制码
Code unsigned char Seg7Code[16]= //用十六进数作为数组下标,可直接取得对应的七段编码字节
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
static unsigned char i="0"; // (0≤i≤7) 循环刷新显示,由于是静态变量,此赋值只做一次。
 P2 = 0xff;  //显示消隐,以免下一段码值显示在前一支SLED
 P1 = Seg7Code[ DisBuf[i] ]; //从显示缓冲区取出原始数据,查表变为七段码后送出显示
P2 = cathode[ i ];   //将对应阴极置低,显示
if( ++i >= 8 ) i="0";  //指向下一个数码管和相应数据
}
void Timer0IntRoute( void ) interrupt 1
{
 TL0 = -1000;  //由于TL0只有8bits,所以将(-1000)低8位赋给TL0
 TH0 = (-1000)>>8; //取(-1000)的高8位赋给TH0,重新定时1ms
 DisplayBrush();
}
void Timer0Init( void )
{ TMOD=(TMOD & 0xf0) | 0x01; //初始化,定时器T0,工作方式1
 TL0 = -1000; //定时1ms
 TH0 = (-1000)>>8;
 TR0 = 1;   //允许T0开始计数
 ET0 = 1;   //允许T0计数溢出时产生中断请求
}
void Display( unsigned char index, unsigned char dataValue ){ DisBuf[ index ] = dataValue; }
void main( void )
{
unsigned char i;
for( i="0"; i<8; i++ ){ Display(i, 8-i); } //DisBuf[0]为右,DisBuf[7]为左
Timer0Init();
EA = 1;   //允许CPU响应中断请求
While(1);
}
第五节:键盘驱动
指提供一些函数给任务调用,获取按键信息,或读取按键值。
定义一个头文档 <KEY.H>,描述可用函数,如下:
#ifndef _KEY_H_  //防止重复引用该文档,如果没有定义过符号 _KEY_H_,则编译下面语句
#define _KEY_H_  //只要引用过一次,即 #i nclude <key.h>,则定义符号 _KEY_H_
unsigned char keyHit( void ); //如果按键,则返回非0,否则返回0
unsigned char keyGet( void ); //读取按键值,如果没有按键则等待到按键为止
void keyPut( unsigned char ucKeyVal ); //保存按键值ucKeyVal到按键缓冲队列末
void keyBack( unsigned char ucKeyVal ); //退回键值ucKeyVal到按键缓冲队列首
#endif

定义函数体文档 KEY.C,如下:
#include “key.h”
#define KeyBufSize 16 //定义按键缓冲队列字节数
unsigned char KeyBuf[ KeyBufSize ]; //定义一个无符号字符数组作为按键缓冲队列。该队列为先进
        //先出,循环存取,下标从0到 KeyBufSize-1
unsigned char KeyBufWp="0"; //作为数组下标变量,记录存入位置
unsigned char KeyBufRp="0"; //作为数组下标变量,记录读出位置
//如果存入位置与读出位置相同,则表明队列中无按键数据
unsigned char keyHit( void )
{ if( KeyBufWp == KeyBufRp ) return( 0 ); else return( 1 ); }

unsigned char keyGet( void )
{ unsigned char retVal; //暂存读出键值
while( keyHit()==0 ); //等待按键,因为函数keyHit()的返回值为 0 表示无按键
retVal = KeyBuf[ KeyBufRp ]; //从数组中读出键值
if( ++KeyBufRp >= KeyBufSize ) KeyBufRp="0"; //读位置加1,超出队列则循环回初始位置
 return( retVal );
}

void keyPut( unsigned char ucKeyVal )
{ KeyBuf[ KeyBufWp ] = ucKeyVal; //键值存入数组
 if( ++KeyBufWp >= KeyBufSize ) KeyBufWp="0";  //存入位置加1,超出队列则循环回初始位置
}
/*****************************************************************************************
由于某种原因,读出的按键,没有用,但其它任务要用该按键,但传送又不方便。此时可以退回按键队列。就如取错了信件,有必要退回一样
******************************************************************************************/
void keyBack( unsigned char ucKeyVal )
{
/*
如果KeyBufRp=0; 减1后则为FFH,大于KeyBufSize,即从数组头退回到数组尾。或者由于干扰使得KeyBufRp超出队列位置,也要调整回到正常位置,
*/
 if( --KeyBufRp >= KeyBufSize ) KeyBufRp="KeyBufSize-1";
KeyBuf[ KeyBufRp ] = ucKeyVal; //回存键值
}
下面渐进讲解键盘物理层的驱动。
电路共同点:P2端口接一共阴数码管,共阴极接GND,P2.0接a段、P2.1接b段、…、P2.7接h段。
软件共同点:code unsigned char Seg7Code[10] 是七段数码管共阴编码表。
Code unsigned char Seg7Code[16]=
// 0     1    2     3     4    5     6     7     8     9    A     b     C     d    E    F
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

例一:P1.0接一按键到GND,键编号为‘6’,显示按键。
#i nclude <at89x52.h>
#i nclude “KEY.H”
void main( void )
{ P1_0 = 1;  //作为输入引脚,必须先输出高电平
while( 1 ) //永远为真,即死循环
 { if( P1_0 == 0 ) //如果按键,则为低电平
{ keyPut( 6 ); //保存按键编号值为按键队列
while( P1_0 == 0 ); //如果一直按着键,则不停地执行该循环,实际是等待松键
  }
if( keyHit() != 0 ) //如果队列中有按键
P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上
 }
}
例二:在例一中考虑按键20ms抖动问题。
#i nclude <at89x52.h>
#i nclude “KEY.H”
void main( void )
{ P1_0 = 1;  //作为输入引脚,必须先输出高电平
while( 1 ) //永远为真,即死循环
 { if( P1_0 == 0 ) //如果按键,则为低电平
{ delay20ms(); //延时20ms,跳过接下抖动
keyPut( 6 ); //保存按键编号值为按键队列
 while( P1_0 == 0 ); //如果一直按着键,则不停地执行该循环,实际是等待松键
delay20ms(); //延时20ms,跳过松开抖动
  }
if( keyHit() != 0 ) //如果队列中有按键
P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上
 }
}
例三:在例二中考虑干扰问题。即小于20ms的负脉冲干扰。
#i nclude <at89x52.h>
#i nclude “KEY.H”
void main( void )
{ P1_0 = 1;  //作为输入引脚,必须先输出高电平
while( 1 ) //永远为真,即死循环
 { if( P1_0 == 0 ) //如果按键,则为低电平
{ delay20ms(); //延时20ms,跳过接下抖动
 if( P1_0 == 1 ) continue; //假按键
keyPut( 6 ); //保存按键编号值为按键队列
 while( P1_0 == 0 ); //如果一直按着键,则不停地执行该循环,实际是等待松键
delay20ms(); //延时20ms,跳过松开抖动
  }
if( keyHit() != 0 ) //如果队列中有按键
P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上
 }
}
例四:状态图编程法。通过20ms周期中断,扫描按键。
/****************************************************************************************
采用晶体为12KHz时,指令周期为1ms(即主频为1KHz),这样T0工作在定时器方式2,8位自动重载。计数值为20,即可产生20ms的周期性中断,在中断服务程序中实现按键扫描
*****************************************************************************************/
#i nclude <at89x52.h>
#i nclude “KEY.H”
void main( void )

TMOD = (TMOD & 0xf0 ) | 0x02; //不改变T1的工作方式,T0为定时器方式2
TH0 = -20;     //计数周期为20个主频脉,即20ms
TL0=TH0;      //先软加载一次计数值
TR0=1;      //允许T0开始计数
ET0=1;      //允许T0计数溢出时产生中断请求
EA=1;      //允许CPU响应中断请求
while( 1 ) //永远为真,即死循环
 {
if( keyHit() != 0 ) //如果队列中有按键
P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上
 }
}
void timer0int( void ) interrupt 1 //20ms;T0的中断号为1
{ static unsigned char sts="0";
 P1_0 = 1;  //作为输入引脚,必须先输出高电平
switch( sts )
 {
  case 0: if( P1_0==0 ) sts="1"; break; //按键则转入状态1
  case 1:
if( P1_0==1 ) sts="0";  //假按错,或干扰,回状态0
else{ sts="2"; keyPut( 6 ); } //确实按键,键值入队列,并转状态2
break;
  case 2: if( P1_0==1 ) sts="3"; break; //如果松键,则转状态3
  case 3:
   if( P1_0==0 ) sts="2";  //假松键,回状态2
   else sts="0";    //真松键,回状态0,等待下一次按键过程 
 }

例五:状态图编程法。
/****************************************************************************************
如果采用晶体为12MHz时,指令周期为1us(即主频为1MHz),要产生20ms左右的计时,则计数值达到20000,T0工作必须为定时