51单片机C语言编程基础和实例之欧阳光明创编

合集下载

51单片机C语言编程入门(详讲版)

51单片机C语言编程入门(详讲版)

中国科学技术大学业余无线电协会编目 录§1 前言 (1)§2 单片机简介 (2)2.1 数字电路简介 (2)2.2 MCS-51单片机简介 (2)2.3 Easy 51 Kit Pro简介 (5)2.4 Easy 51 Kit Pro电路功能分析 (5)§3 MCS-51单片机的C语言编程 (8)3.1 汇编语言 (8)3.2 建立你的第一个C项目 (8)3.3 生成hex文件 (12)3.4 Keil C语言 (14)3.5 单片机I/O (18)3.6 中断 (25)3.7 定时器/计数器 (27)3.8 定时器的应用举例 (29)3.9 外部中断 (34)3.10 串行通信 (38)3.11 定时器2 (43)3.12 看门狗 (47)3.13 空闲模式和掉电模式 (50)§4 MCS-51单片机C语言编程应用进阶 (51)4.1 扫描式键盘 (51)4.2 EEPROM芯片AT93C46的读写 (55)4.3 Keil C的高级使用 (63)§5 编写高质量的单片机C程序 (64)5.1 文件结构 (64)5.2 程序的版式 (66)5.3 单片机程序命名规则与变量选择 (70)5.4 表达式和基本语句 (73)5.5 函数设计 (77)5.6 单片机程序框架 (79)附图:Easy 51 Kit Pro电路图(最小系统板) (80)附图:Easy 51 Kit Pro电路图(学习板) (81)§1 前言什么是单片机,目前还没有一个确切的定义。

普通认为单片机是将CPU、RAM、ROM、定时器/计数器以及输入输出(I/O)接口电路等计算机主要部件集成在一块芯片上,这样所组成的芯片级微型计算机称为单片微型计算机(Single Chip Microcomputer)。

简称为单片微机或单片机。

利用单片机程序,可以实现对硬件系统的小型化的智能控制。

单片机C语言程序设计实训100例--基于8051+PROTEUS仿真1之欧阳治创编

单片机C语言程序设计实训100例--基于8051+PROTEUS仿真1之欧阳治创编

《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例时间2021.03.10 创作:欧阳治第 01 篇基础程序设计01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}03 8只LED左右来回点亮/* 名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/#include<reg51.h>#include<intrins.h>#define ucharunsigned char#define uintunsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){for(i=0;i<7;i++){P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81, 0x00,0x81,0xc3,0xe7,0xff,0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0x c7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0x ff,0xff,0x0f,0xf0,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff ,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0 xf7,0xfb,0xfd,0xfe,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0 ,0xe0,0xf0,0xf8,0xfc,0xfe,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7, 0xcf,0x9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81, 0x00,0x81,0xc3,0xe7,0xff,0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0x c7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0x ff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0 xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff ,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0 xe0,0xc0,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xf f,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。

51单片机20个实验,代码详细之欧阳术创编

51单片机20个实验,代码详细之欧阳术创编

第一章单片机系统板说明一、概述单片机实验开发系统是一种多功能、高配置、高品质的MCS-51单片机教学与开发设备。

适用于大学本科单片机教学、课程设计和毕业设计以及电子设计比赛。

该系统采用模块化设计思想,减小了系统面积,同时增加了可靠性,使得单片机实验开发系统能满足从简单的数字电路实验到复杂的数字系统设计实验,并能一直延伸到综合电子设计等创新性实验项目。

该系统采用集成稳压电源供电,使电源系统的稳定性大大提高,同时又具备完备的保护措施。

为适应市场上多种单片机器件的应用,该系统采用“单片机板+外围扩展板”结构,通过更换不同外围扩展板,可实验不同的单片机功能,适应了各院校不同的教学需求。

二、单片机板简介本实验系统因为自带了MCS-51单片机系统,因此没有配置其他单片机板,但可以根据教学需要随时配置。

以单片机板为母板,并且有I/O接口引出,可以很方便的完成所有实验。

因此构成单片机实验系统。

1、主要技术参数(1)MSC-51单片机板板上配有ATMEL公司的STC89C51芯片。

STC89C51资源:32个I/O口;封装DIP40。

STC89C51开发软件:KEIL C51。

2、MSC-51单片机结构(1)单片机板中央放置一块可插拔的DIP封装的STC89C51芯片。

(2)单片机板左上侧有一个串口,用于下载程序。

(3)单片机板的四周是所有I/O引脚的插孔,旁边标有I /0引脚的脚引。

(4)单片机板与各个模块配合使用时,可形成—个完整的实验系统。

三、母板简介主要技术参数(1)实验系统电源实验系统内置了集成稳压电源,使整个电源具有短路保护、过流保护功能,提高了实验的稳定性。

主板的右上角为电源总开关,当把220V交流电源线插入主板后,打开电源开关,主板得电工作。

为适用多种需要,配置了+5V,+12V,—5V电压供主板和外设需要,通过右上角的插针排和插孔输出到外设。

此外,还设有螺旋保险插孔保护实验箱。

(2)RS232接口RS232接口通过MAX232芯片实现与计算机的串行通讯,通过接口引出信号。

51单片机C语言编程实例

51单片机C语言编程实例

51单片机C语言编程实例标签: 单片机C语言实例2009-09-01 19:0651单片机C语言编程实例基础知识: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特殊功能寄存器所有端口的定义。

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

新手学C语言之入门之欧阳学文创作

新手学C语言之入门之欧阳学文创作

学习C语言(新手入门)欧阳学文年轻的小荣子阿尔法和李世石的围棋对弈让我们感受到了计算机的强大,事实上计算不仅要靠硬件设备的支持,还需要在里面运行代码(很多种,包括c),这些代码就是它的灵魂(譬如我们的思想)。

介绍几部通过在计算机里头运行代码从而创造无限可能的电影,个人觉得不错的:黑客帝国,超验骇客,创战纪,人工智能等。

正题,能编辑C语言的软件非常多,比如visual c++ 6.0/7.0,turbo c等。

理论总是离不开实践,在要学习C语言理论之前先要找到属于自己的能实现代码结果的软件。

这样说,计算机语言和人的语言的区别在于,人通过各种发音实现交流,但是计算机主要是通过电流来传达信息,所以只能用0/1来表示电流拥有的两种状态,这样最底层的计算运作就是通过一段长长的0/1代码,通过0和1的不同组合来表示文字或者信息。

C语言当然不是最底层的0/1代码,他是一个沟通的中介,比如等于号在c语言里就是两个等号“==”,这样使得我们更容易和计算机交流了,只要学会了C语言,它就能把我们的语言翻译成计算机的语言。

以下内容从简单到困难,先来学会如何运行c语言代码(用vc 6.0中文版):1.按以下步骤打开界面(以后都可以这样打开):2.一些常用的功能键:(1是compile编译的意思,就是把这些我们能看懂的符号转换成计算机代码,同时按这个键可以检查错误和验证是否能运行。

2是build,建立一个可以运行的EXE类文件,就是把这些代码弄成一个能运行的东西。

3就是run运行,只有经过查错和建立才可以按运行。

是不是很简单,自己动手一遍就会)3.输入代码并运行(里面的代码如下:——————————————#include<stdio.h>main(){int a,b,c;a=1,b=2;c=a+b;printf("%d",c);}———————————————Include的英文意思是包含、包括,顾名思义,#include<stdio.h>就是把stdio.h这个东西包含进去,其实#include< >是c语言里的一种格式,就是把什么包含进来的意思(这里是口语表达)。

C++实验代码之欧阳家百创编

C++实验代码之欧阳家百创编

实验项目一 C++程序设计初步题目欧阳家百(2021.03.07)在Visual Studio 2008平台上,用C++语言创建一个控制台应用程序,当其运行时在屏幕上显示“Hello,World!”(参考P15)实验项目二类与对象(1)有以下程序:#include <iostream>using namespace std;class Time //定义Time类{public://数据成员为公用的int hour;int minute;int sec;};int main( ){ Time t1;//定义t1为Time类对象cin>>t1.hour;//输入设定的时间cin>>t1.minute;cin>>t1.sec;cout<<t1.hour<<“:”<<t1.minute<< “:”<<t1.sec<<endl;//输出时间return 0;}改写程序,要求:①将数据成员改为私有的;②将输入和输出的功能改为由成员函数实现;③在类体内定义成员函数。

然后编译和运行程序。

请分析什么成员应指定为公用的?什么成员应指定为私有的?什么函数最好放在类中定义?什么函数最好放在类外定义?代码:/ 实验_1.cpp : 定义控制台应用程序的入口点。

#include"stdafx.h"#include<iostream>usingnamespace std;class Time //定义Time类{private://数据成员为私有的int hour;int minute;int sec;public:void Input(){cout<<"请输入时、分、秒:"<<endl;cin>>hour>>minute>>sec;}void print(){cout<<"时间为:"<<endl;cout<<hour<<":"<<minute<< ":"<<sec<<endl;}};int _tmain(int argc, _TCHAR* argv[]){Time t1;t1.Input ();t1.print ();return 0;}结果:(2)修改实验1中的学生成绩管理系统,建立类OurClass,实现班级学生信息的输入,排序和输出。

51单片机实用汇编程序库(word)之欧阳德创编

51单片机实用汇编程序库(word)之欧阳德创编

51 单片机实用程序库4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。

实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。

程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。

实际应用中例如:波形发生器。

程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0 口产生高低电平地形成方波//////////////ACALL DELAYSETB P1.0ACALL DELAY10CLR P1.0AJMP MAIN;////////////////////////////////////////////////// DELAY:MOV R1,#0FFHDJNZ R1,$RETEND五、定时器功能实例5.1 定时1 秒报警程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1次,以达到定时报警的目的。

实际应用例如:定时报警器。

程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0 入口MAIN:TFLA G EQU 34H ;时间秒标志,判是否到50 个0.2 秒,即50*0.2=1 秒MOV TMOD,#00000001B;定时器0 工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05 秒,定时20 次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0 中断允许SETB TR0 ;开定时0 运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒//////////////////////////////////////// INCC: INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;////////////////////////////////////////////////// RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05 秒,定时20 次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51 使用12M晶振,一个周期是1 微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ 的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。

51单片机C语言编程基础和实例之欧阳歌谷创编

51单片机C语言编程基础和实例之欧阳歌谷创编

基础知识:51单片机编程基础欧阳歌谷(2021.02.01)单片机的外部结构: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特殊功能寄存器所有端口的定义。

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 ); 表示无限执行该语句,即死循环。

语句后的分号表示空循环体,也就是{;}在某引脚输出方波编程方法:(比如P3.1引脚)代码注意:一个字节的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四个引脚都输出高电平。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基础知识:51单片机编程基础
欧阳光明(2021.03.07)
单片机的外部结构:
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特殊功能寄存器所有端口的定义。

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 ); 表示无限执行该语句,即死循环。

语句后的分号
表示空循环体,也就是{;}
注意:一个字节的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)。

说明原因。

14.//同时按下时,LED不断亮灭,各占一半时间,交替频率很
快,由于人眼惯性,看上去为半亮态
15.}
数码管的接法和驱动原理
一支七段数码管实际由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,则可编写出对应十六进制码的七段码表字节数据如右图:
43. }
44.//按个位键处理
45. P3.3 = 1; //P3.3作为输入,先要输出高电平
46.if( key1 == 1 ) //等松键
47.{ if( P3.3 == 1 ) key1=0; }
48.else { //未按键
49.if( P3.3 == 0 ){ key1 = 1;
50.if( ++s1 >= 10 ) s1 = 0;
51.break; //结束“循环2”,修改显示
52. }
53. }
54. } //循环2’end
55. }//循环1’end
56.}//main’end
共9页: 3
第三节:十字路口交通灯
如果一个单位时间为1秒,这里设定的十字路口交通灯按如下方式四个步骤循环工作:
60个单位时间,南北红,东西绿;
10个单位时间,南北红,东西黄;
60个单位时间,南北绿,东西红;
10个单位时间,南北黄,东西红;
解:用P1端口的6个引脚控制交通灯,高电平灯亮,低电平灯灭。

代码
1.#include <at89x5
2.h>
2.//sbit用来定义一个符号位地址,方便编程,提高可读性,和
可移植性
3.sbit SNRed =P1^0; //南北方向红灯
4.sbit SNYellow =P1^1; //南北方向黄灯
5.sbit SNGreen =P1^2; //南北方向绿灯
6.sbit EWRed =P1^3; //东西方向红灯
7.sbit EWYellow =P1^4; //东西方向黄灯
8.sbit EWGreen =P1^5; //东西方向绿灯
9./* 用软件产生延时一个单位时间 */
10.void Delay1Unit( void )
共9页: 4
第四节:数码管驱动
显示“12345678”
P1端口接8联共阴数码管SLED8的段极:P1.7接段h,…,P1.0接段a
P2端口接8联共阴数码管SLED8的段极:P2.7接左边的共阴极,…,P2.0接右边的共阴极
定义函数体文档 KEY.C,如下:
共9页: 6
第六节:低频频率计
实例目的:学时定时器、计数器、中断应用
说明:选用24MHz的晶体,主频可达2MHz。

用T1产生100us的时标,T0作信号脉冲计数器。

假设晶体频率没有误差,而且稳定不变(实际上可达万分之一);被测信号是周期性矩形波(正负脉冲宽度都不能小于0.5us),频率小于1MHz,大于1Hz。

要求测量时标1S,测量精度为0.1%。

解:从测量精度要求来看,当频率超过1KHz时,可采用1S时标内计数信号脉冲个数来测量信号频,而信号频率低于1KHz时,可以通过测量信号的周期来求出信号频率。

两种方法自动转换。

对于低于1KHz的信号,信号周期最小为1ms,也就是说超过1000us,而我们用的定时器计时脉冲周期为0.5us,如果定时多计或少计一个脉冲,误差为1us,所以相对误差为1us/1000us=0.1%。

信号周期越大,即信号频率越低,相对误差就越小。

从上面描述来看,当信号频率超过1KHz后,信号周期就少于1000us,显然采用上面的测量方法,不能达到测量精度要求,这时我们采用1S单位时间计数信号的脉冲个数,最少能计到1000个脉冲,由于信号频率不超过1MHz,而我们定时脉冲为2MHz,最差多计或少计一个信号脉冲,这样相对误差为1/1000,可见信号频率越高,相对误差越小。

信号除输入到T1(P3.5)外,还输入到INT1(P3.3)。

代码。

相关文档
最新文档