收藏 分享(赏)

单片机课程笔记.doc

上传人:精品资料 文档编号:11163163 上传时间:2020-02-10 格式:DOC 页数:41 大小:1.30MB
下载 相关 举报
单片机课程笔记.doc_第1页
第1页 / 共41页
单片机课程笔记.doc_第2页
第2页 / 共41页
单片机课程笔记.doc_第3页
第3页 / 共41页
单片机课程笔记.doc_第4页
第4页 / 共41页
单片机课程笔记.doc_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、注意:本课件为上课笔记的一个整理,其中难免存在错误,请读者不吝赐教,如有问题请发送 E-mail 到 。本文根据教学的情况,随时进行修改和完善,所以欢迎同学随时注意本文档在课件中的更新情况。单片机基础知识单片机的外部结构: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(PI

2、N19) ;(频率为主频的 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

3、给出了 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 表示给变量 TMOD 的低四位赋值 0x5,而不改变 TMOD 的高四位。6、 While( 1

4、 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是;第一章 单片机最小应用系统:单片机最小系统的硬件原理接线图:1、 接电源:VCC(PIN40 ) 、GND (PIN20) 。加接退耦电容 0.1uF2、 接晶体:X1(PIN18) 、X2(PIN19) 。注意标出晶体频率(选用 12MHz) ,还有辅助电容 30pF3、 接复位:RES(PIN9 ) 。接上电复位电路,以及手动复位电路,分析复位工作原理4、 接配置:EA(PIN31) 。说明原因。具体接法如下图所示:第二章 基本 I/O 口的应用。例 1:用 P1 口输出一倍频方波。#include /reg52.h

5、为包含 51 资源的库文件void main ( void )while (1=1)+P1; /使 P1 口加一完成一倍频方波,注意 : P0 的每个引脚要输出高电平时,必须外接上拉电阻(如 4K7)至 VCC 电源。例 2:用 P1 口输出一倍频方波,要求能用万用表测出方波。其实,只需要在上面的程序中添加延时程序即可。#include void main ( void )unsigned int i,j;while (1=1)+P1;for (i=0;ivoid main ( void )unsigned char m,n; /定义两个中间变量完成 交换过程unsigned int i,j;

6、while (1)n = 0;+m;n|=(m1) /将第 4 位的值送至第 3 位 n|=(m3) /将第 5 位的值送至第 2 位 n|=(m5) /将第 6 位的值送至第 1 位 n|=(m7) /将第 7 位的值送至第 0 位 P1 = n;for(i=0;iCode unsigned char Seg7Code16= /用十六进数作为数组下标,可直接取得对应的七段编码字节/ 0 1 2 3 4 5 6 7 8 9 A b C d E F0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x3

7、9, 0x5e, 0x79, 0x71;void main ( void )unsigned int i;while (1)P2 |= 0x0f; /消隐,让数码管开始处于不亮的状态 P0 = LedCode1; /将“1”的代码送出P2 /选中第一个数码管for(i=0;i,描述可用函数,如下:#ifndef _ LedDriver_H _ /防止重复引用该文档,如果没有定义过符号 _KEY_H_,则编译下面语句#define _ LedDriver_H _ /只要引用过一次,即 #include ,则定义符号 _KEY_H_void LedPrint ( unsigned char Dat

8、 ) /数据缓冲区间,完成移位功能void LedWork ( void ) /送数到显示数码管#endif然后,定义函数体文档 LedDriver.C,如下:#include #include “LedDriver.h”Code unsigned char LedCode16= /Code 是表示这个数组的存储空间0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71;unsigned char DisBuf4;void LedPrint (unsigned

9、char Dat)DisBuf0 = DisBuf1; /每次用后一个数冲掉前一个数,便于扩展显示位数DisBuf1 = DisBuf2;DisBuf2 = DisBuf3;DisBuf3 = Dat;void LedWork ( void )static unsigned char i = 0; /static 表示静态变量,指变量的赋值只在第一次定义的时候赋P2 |= 0x0f;P0 = LedCodeDisBufi;Switch( i ) /选择数据送到哪个管子case 0: P2_0 = 0; break;case 1: P2_1 = 0; break;case 2: P2_2 = 0

10、; break;case 3: P2_3 = 0; break;if (+i=4) i = 0; /判断四位数是否都已经送完for (m=0;m#include “LedDriver.h”void mian ( void )LedPrint( 1 ); /调用函数,把想显示的数据送如缓存LedPrint( 2 );LedPrint( 3 );LedPrint( 4 );While( 1 )LedWork( );下面介绍一个例子供大家参考。显示“12345678”P1 端口接 8 联共阴数码管 SLED8 的段极:P1.7 接段 h,,P1.0 接段 aP2 端口接 8 联共阴数码管 SLED8

11、 的段极:P2.7 接左边的共阴极,P2.0 接右边的共阴极方案说明:晶振频率 fosc=12MHz,数码管采用动态刷新方式显示,在 1ms 定时断服务程序中实现#include unsigned char DisBuf8; /全局显示缓冲区,DisBuf0 对应右 SLED,DisBuf7对应左 SLED,void DisplayBrush( void ) code unsigned char cathode8=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; /阴极控制码code unsigned char Seg7Code16= /用十六进数作为数组下标,

12、可直接取得对应的七段编码字节0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;static unsigned char i=0; / (0i7) 循环刷新显示,由于是静态变量,此赋值只做一次。P2 = 0xff; /显示消隐,以免下一段码值显示在前一支 SLEDP1 = Seg7Code DisBufi ; /从显示缓冲区取出原始数据,查表变为七段码后送出显示P2 = cathode i ; /将对应阴极置低,显示if( +i = 8 ) i=0; /指向下一个数码管和相应数据void

13、 Timer0IntRoute( void ) interrupt 1TL0 = -1000; /由于 TL0 只有 8bits,所以将(-1000 )低 8 位赋给 TL0TH0 = (-1000)8; /取(-1000)的高 8 位赋给 TH0,重新定时 1msDisplayBrush();void Timer0Init( void )TMOD=(TMOD /初始化,定时器 T0,工作方式 1TL0 = -1000; /定时 1msTH0 = (-1000)8;TR0 = 1; /允许 T0 开始计数ET0 = 1; /允许 T0 计数溢出时产生中断请求void Display( unsi

14、gned char index, unsigned char dataValue )DisBuf index = dataValue;void main( void )unsigned char i;for( i=0; i#include “KeyDriver.h”char Kbhit ( void )P1 = 0xf0;if (P1 = = 0xf0) return ( 0 );else return ( 1 );unsigned char getch ( void )unsigned char X,Y,Z;P1 = 0xf0;X = P1;P1 = 0x0f;Y = P1;Z =X | Y

15、;switch ( Z )case 0xee: return ( 0 );case 0xde: return ( 1 );case 0xbe: return ( 2 );case 0x7e: return ( 3 );case 0xed: return ( 4 );case 0xdd: return ( 5 );case 0xbd: return ( 6 );case 0x7d: return ( 7 );case 0xeb: return ( 8 );case 0xdb: return ( 9 );case 0xbb: return ( 10 );case 0x7b: return ( 11

16、 );case 0xe7: return ( 12 );case 0xd7: return ( 13 );case 0xb7: return ( 14 );case 0x77: return ( 15 );按键显示程序如下:#include #include “LedDriver.h”#include “KeyDriver.h”void main ( void )unsigned char i;for (i=1;i,描述可用函数,如下:#ifndef _KEY_H_ /防止重复引用该文档,如果没有定义过符号 _KEY_H_,则编译下面语句#define _KEY_H_ /只要引用过一次,即 #

17、include ,则定义符号 _KEY_H_unsigned char keyHit( void ); /如果按键,则返回非,否则返回unsigned char keyGet( void ); /读取按键值,如果没有按键则等待到按键为止void keyPut( unsigned char ucKeyVal ); /保存按键值 ucKeyVal 到按键缓冲队列末void keyBack( unsigned char ucKeyVal ); /退回键值 ucKeyVal 到按键缓冲队列首#endifP1.0(0xE)P1.1(0xD)P1.2(0xB)P1.3(0x7)P1.4(E) P1.5(D

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

19、gned 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; /读位置加,超出队列则循环回初始位置return( retV

20、al );void keyPut( unsigned char ucKeyVal ) KeyBuf KeyBufWp = ucKeyVal; /键值存入数组if( +KeyBufWp = KeyBufSize ) KeyBufWp=0; /存入位置加,超出队列则循环回初始位置/*由于某种原因,读出的按键,没有用,但其它任务要用该按键,但传送又不方便。此时可以退回按键队列。就如取错了信件,有必要退回一样*/void keyBack( unsigned char ucKeyVal )/*如果 KeyBufRp=0; 减 1 后则为 FFH,大于 KeyBufSize,即从数组头退回到数组尾。或者由

21、于干扰使得 KeyBufRp 超出队列位置,也要调整回到正常位置,*/if( -KeyBufRp = KeyBufSize ) KeyBufRp=KeyBufSize-1; KeyBuf KeyBufRp = ucKeyVal; /回存键值#include #include “KEY.H”unsigned char keyScan( void ) /返回 0 表示无按键,或无效按键,其它值为按键编码值 code unsigned char keyCode16=/0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0x

22、D, 0xE, 0xF 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 0 ; unsigned char x, y, retVal;P1=0x0f; /低四位输入,高四位输出 0x=P1 /P1 输入后,清高四位,作为 X 值P1=0xf0; /高四位输入,低四位输出 0y=(P1 4) /P1 输入后移位到低四位,并清高四位,作为 Y 值retVal = keyCodex*4 + keyCodey; /根据本公式倒算按键编码if( retVal=0 ) return(0); else return( retVal-4 );/比如按键1 ,得 X=0

23、x7,Y=0x7,算得 retVal= 5,所以返回函数值 1。/双如按键7 ,得 X=0xb,Y=0xd,算得 retVal=11,所以返回函数值 7。void main( void )TMOD = (TMOD /不改变 T1 的工作方式,T0 为定时器方式 1TL0 = -20000; /计数周期为 20000 个主频脉,自动取低 8 位TH0 = (-20000)8; /右移 8 位,实际上是取高 8 位TR0=1; /允许 T0 开始计数ET0=1; /允许 T0 计数溢出时产生中断请求EA=1; /允许 CPU 响应中断请求while( 1 ) /永远为真,即死循环if( keyHi

24、t() != 0 ) /如果队列中有按键P2=Seg7Code keyGet() ; /从队列中取出按键值,并显示在数码管上void timer0int( void ) interrupt 1 /20ms;T0 的中断号为 1 static unsigned char sts=0;TL0 = -20000; /方式 1 为软件重载TH0 = (-20000)8; /右移 8 位,实际上是取高 8 位P1_0 = 1; /作为输入引脚,必须先输出高电平switch( sts )case 0: if( keyScan()!=0 ) sts=1; break; /按键则转入状态 1case 1:if

25、( keyScan()=0 ) sts=0; /假按错,或干扰,回状态 0else sts=2; keyPut( keyScan() ); /确实按键,键值入队列,并转状态 2break;case 2: if(keyScan()=0 ) sts=3; break; /如果松键,则转状态 3case 3:if( keyScan()!=0 ) sts=2; /假松键,回状态 2else sts=0; /真松键,回状态 0,等待下一次按键过程第五章 中断系统应用对于 51 系列单片机的中断资源在本课件中就不再多加描述 ,同学们可以参考书上的一些资料,主要在这里是介绍它的应用。序号 中断源 中断控制位

26、(允许否) 优先控制位 中断状态 其他0 X0 EX0 PX0 IE0 INT01 Timer0 ET0 PT0 TF0 T02 X1 EX1 PX1 IE1 INT13 Timer1 ET1 PT1 TF1 T14 UART ES PS RXD/TXD RI/TI5 Timer2 ET2 PT2 TF2 T2EA完成以下程序设计(初始化):要求:1、将串口中断的级别设置为最高;2、INT0 工作于边沿模式,INT1 工作于电平模式,这两个中断都是从外部输入;3、允许 T1 定时器中断。#include void main ( void )EA = 0;PS = 1; PT1 = 0; PT0

27、 = 0; PX0 = 0; PX1 = 0; /设置串口的中断级别最高INT1 = 1; INT0 = 1; /设置外部输入中断IT0 = 1; IT1 = 0; /设置 INT0 工作于边沿模式,INT1 工作于电平模式ET1 = 1; /允许定时器 1 中断EX0 = 1; EX1 = 1; /允许外部中断 0、1 工作ES = 1; /允许串口中断EA = 1; /开中断while ( 1 );下面的程序为中断的具体应用,主要是针对 T2 定时器的中断。#include void main( void )EA = 0; /disable interrupt for systemC_T2

28、 = 0; /timeCP_RL2 = 0; /ReloadRCAP2L = -1000; /low 8 bitsRCAP2H = (-1000)8; /high 8 bitsTL2 = RCAP2L; /first load to T2TH2 = RCAP2H;TR2 = 1; /start countET2 = 1; /enable Timer2 interruptEA = 1; /open interrupt for systemwhile( 1 );void Timer2Int( void ) interrupt 5TF2 = 0;P1 = 0xff;下面的程序是将按键和显示放在中断服

29、务程序中进行处理。程序内容为上课时的例子 test2。clock.h 文件编写如下:#ifndef _clock_h_#define _clock_h_#define SysClock 3686400struct sClockunsigned char flag;unsigned long second; /232 seconds for 136 yearsunsigned int ms;void ClockOpen( void );struct sClock * ClockGet( void );/void ClockSet( struct sClock *ptr );void ClockC

30、all( void );extern struct sClock gClock;#endifclock.c 文件编写如下:#include #include “clock.h“#include “LedDriver.h“#include “KeyDriver.h“void ClockCall_ms( void )LedTimeCall();KeyTimeCall();void ClockOpen( void ) /初始化 Timer2 产生 1ms 定时中断gClock.ms=0;gClock.second=0;CP_RL2 = 0; /重载模式C_T2 = 0; /定时器方式RCAP2H =

31、 (-(SysClock/1000) 8; /重载值高 8 位RCAP2L = (-(SysClock/1000) /重载值低 8 位TR2 = 1; /允许定时计数ET2 = 1; /允许 Timer2 中断 void T2int( void ) interrupt 5TF2 = 0; /clear interrupt status ClockCall_ms();KeyDriver.h 文件编写如下:#ifndef _KeyDriver_H_#define _KeyDriver_H_#define KeyBufSize 4char kbhit( void );char getch( void

32、 );void KeyBufIn( char dat );void KeyTimeCall( void );#endifKeyDriver.c 文件编写如下:#include #include “KeyDriver.h“unsigned char KeyBufWp=0;unsigned char KeyBufRp=0;unsigned char KeyBufKeyBufSize;char kbhit( void ) return( KeyBufWp - KeyBufRp ); char getch( void )char ret;ret = KeyBuf KeyBufRp ;if( +KeyB

33、ufRp = KeyBufSize ) KeyBufRp=0;return( ret );void KeyBufIn( char dat )KeyBuf KeyBufWp = dat;if( +KeyBufWp = KeyBufSize ) KeyBufWp=0;void KeyTimeCall( void )code char KeyCode=/* 0 1 2 3 4 5 6 7 8 9 AB C DE F */ 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, /0 0xf

34、f,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, /10xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, /2 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, /30xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0x

35、ff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, /4 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, /5 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, /6 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x0F, 0xff,0xff,0xff,0x0B, 0xff,0x07,0x03,0xff,

36、 /70xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, /8 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, /9 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, /A 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,

37、0x0E, 0xff,0xff,0xff,0x0A, 0xff,0x06,0x02,0xff, /B 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, /C 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x0D, 0xff,0xff,0xff,0x09, 0xff,0x05,0x01,0xff, /D 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x0C, 0xff,0xff,0xff,0x08, 0xff,0x04,0x

38、00,0xff, /E 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff /F ;unsigned char KeyScan;static unsigned char KeyScanCode=0;static unsigned char sts=0;static unsigned char ms=20;if( -ms ) return;ms=20;P1=0x0f;KeyScan=P1;P1=0xf0;KeyScan|=P1;switch( sts )case 0:if( KeyS

39、can != 0xff ) /可能有按键 sts=1; KeyScanCode=KeyScan; break;case 1:if( KeyScanCode = KeyScan ) /去抖后确为键按下sts = 2;KeyBufIn( KeyCode KeyScan ); /返回键值else /否则认为是干扰,重新检测sts = 0;break;case 2:if( KeyScanCode != KeyScan ) /检测松开按键if( KeyScan = 0xff ) sts=3;break;/按键超过 1 秒认为是连续按键/其后每 0.2 秒一次键,直到松开为止/要处理组合按键(即 0.1

40、秒后确认读键,保证所有组合键到位/还可能保持不松开全部按键的情况下,转换按其它键组合/case 3:if( KeyScan = 0xff ) sts=0; /去抖后确为松开按键else sts=2; /是干扰break;LedDriver.h 文件编写如下:#ifndef _LedDriver_H_#define _LedDriver_H_/*显示数据为一个字节,由两部分组成,高三位为属性,低五位为值BIT7:为小数点BIT6:为闪烁位BIT5:保留*/#define CharAtr_POINT 0x80#define CharAtr_FLASH 0x40#define Char_0 0#de

41、fine Char_1 1#define Char_2 2#define Char_3 3#define Char_4 4#define Char_5 5#define Char_6 6#define Char_7 7#define Char_8 8#define Char_9 9#define Char_a 10#define Char_b 11#define Char_c 12#define Char_d 13#define Char_e 14#define Char_f 15#define Char_N 16 /singned -#define Char_H 17#define Char

42、_L 18#define Char_P 19#define Char_o 20extern unsigned char DisBuf;#define LedPutchar(bitN, Dat ) DisBufbitN=Dat;void LedPrint(unsigned char);void LedTimeCall( void );#endifLedDriver.c 文件编写如下:#include #include “LedDriver.h“code unsigned char LedHexCode=/0 1 2 3 4 5 6 70x3f, 0x06, 0x5b, 0x4f, 0x66, 0

43、x6d, 0x7d, 0x07, /8 9 a b c d e f0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71,/- H L P o0x40, 0x76, 0x38, 0x73, 0x5c,;unsigned char DisBuf4;void LedPrint( unsigned char dat )DisBuf0 = DisBuf1; DisBuf1 = DisBuf2; DisBuf2 = DisBuf3; DisBuf3 = dat; void LedTimeCall( void )static unsigned char index=0

44、;P2 |= 0x0f;P0 = LedHexCode DisBufindex ;P2 void main( void ) /一个工程项目必须有一个 main 函数,并且只能有一个 main 函数char keyVal=0;EA = 0;ClockOpen();LedPrint(Char_6);LedPrint(Char_o);LedPrint(Char_o);LedPrint(Char_d);EA = 1;while( 1 )if( kbhit() ) /如果有键按下返回非 0 值keyVal=getch(); /K1-K16 返回的键值分别为 0-15LedPrint( keyVal );

45、/*1. 参考任一个显不方式的模块,增加一种显示方式对应键 K4,左右两排发光二极管交替亮灭2. 每个按键 Ki(i=1.16)对应一个发光二极管 LEDi,按相应的键 Ki,则对应的灯 LEDi 亮,再按,则灭,交替工作。3. 你现在可以做一下十字路的交通灯管制系统了,做产品就这么容量 =下面的程序是 test3。只有主程序部分于上面的 test2 有不同,现将 main.c 写在下面供大家参考。#include /该头文档描述单片机所有特殊功能寄存器的称名,程序中可直接使用,比喻P1#include “LedDriver.h“#include “KeyDriver.h“#include “

46、clock.h“unsigned char function=0;void main( void ) /一个工程项目必须有一个 main 函数,并且只能有一个 main 函数char keyVal=0;if( INT0=0 ) function=1;if( INT1=0 ) function=2;if( T0=0 ) function=3;if( T1=0 ) function=4;EA = 0;ClockOpen();LedPrint(Char_6);LedPrint(Char_o);LedPrint(Char_o);LedPrint(Char_d);EA = 1;switch( function )case 0:while( 1 )if( kbhit() ) /如果有键按下返回非 0 值keyVal=getch(); /K1-K16 返回的键值分别为 0-15LedPrint( keyVal );case 1:while( 1 )unsigned int old, new;unsigned char minute, second;new = ClockGet()-se

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报