目录
目录..................................................................................................................1
函数的使用和熟悉 ............................................................................................3
实例 3:用单片机控制第一个灯亮....................................................................3
实例 4:用单片机控制一个灯闪烁:认识单片机的工作频率.............................4
实例 5:将 P1 口状态分别送入P0、P2、P3 口:认识I/O口的引脚功能..........4
实例 6:使用P3 口流水点亮 8 位LED...............................................................5
实例 7:通过对P3 口地址的操作流水点亮 8 位LED .........................................6
实例 8:用不同数据类型控制灯闪烁时间 .........................................................7
实例 9:用P0 口、P1 口分别显示加法和减法运算结果 ...................................8
实例 10:用P0、P1 口显示乘法运算结果 ........................................................8
实例 11:用P1、P0 口显示除法运算结果 ........................................................9
实例 12:用自增运算控制P0 口 8 位LED流水花样...........................................9
实例 13:用P0 口显示逻辑"与"运算结果 ........................................................10
实例 14:用P0 口显示条件运算结果 ..............................................................10
实例 15:用P0 口显示按位"异或"运算结果 ....................................................10
实例 16:用P0 显示左移运算结果..................................................................10
实例 17:"万能逻辑电路"实验 ........................................................................11
实例 18:用右移运算流水点亮P1 口 8 位LED................................................11
实例 19:用if语句控制P0 口 8 位LED的流水方向...........................................12
实例 20:用swtich语句的控制P0 口 8 位LED的点亮状态...............................12
实例 21:用for语句控制蜂鸣器鸣笛次数 ........................................................13
实例 22:用while语句控制LED ......................................................................15
实例 23:用do-while语句控制P0 口 8 位LED流水点亮...................................15
实例 24:用字符型数组控制P0 口 8 位LED流水点亮 .....................................16
实例 25: 用P0 口显示字符串常量................................................................17
实例 26:用P0 口显示指针运算结果 .............................................................18
实例 27:用指针数组控制P0 口 8 位LED流水点亮.........................................18
实例 28:用数组的指针控制P0 口 8 位LED流水点亮 ...................................19
实例 29:用P0 、P1 口显示整型函数返回值.................................................20
实例 30:用有参函数控制P0 口 8 位LED流水速度.........................................20
实例 31:用数组作函数参数控制流水花样 .....................................................21
实例 32:用指针作函数参数控制P0 口 8 位LED流水点亮 ..............................22
实例 33:用函数型指针控制P1 口灯花样 .......................................................23
实例 34:用指针数组作为函数的参数显示多个字符串 ...................................24
实例 35:字符函数ctype.h应用举例 ...............................................................26
实例 36:内部函数intrins.h应用举例 ..............................................................26
实例 37:标准函数stdlib.h应用举例 ...............................................................26
实例 38:字符串函数string.h应用举例 ...........................................................27
实例 39:宏定义应用举例 2 ...........................................................................28
实例 40:宏定义应用举例 2 ...........................................................................28
1
实例 41:宏定义应用举例 3 ...........................................................................28
中断、定时器 .................................................................................................29
实例 42:用定时器T0 查询方式P2 口 8 位控制LED闪烁 ................................29
实例 43:用定时器T1 查询方式控制单片机发出 1KHz音频............................30
实例 44:将计数器T0 计数的结果送P1 口 8 位LED显示 ................................30
实例 45:用定时器T0 的中断控制 1 位LED闪烁.............................................31
实例 46:用定时器T0 的中断实现长时间定时 ................................................32
实例 47:用定时器T1 中断控制两个LED以不同周期闪烁 ..............................32
实例 48:用计数器T1 的中断控制蜂鸣器发出 1KHz音频 ...............................33
实例 49:用定时器T0 的中断实现"渴望"主题曲的播放...................................34
实例 50-1:输出 50 个矩形脉冲 .....................................................................37
实例 50-2:计数器T0 统计外部脉冲数 ...........................................................38
实例 51-2:定时器T0 的模式 2 测量正脉冲宽度.............................................38
实例 52:用定时器T0 控制输出高低宽度不同的矩形波..................................39
实例 53:用外中断 0 的中断方式进行数据采集..............................................40
实例 54-1:输出负脉宽为 200 微秒的方波.....................................................40
实例 54-2:测量负脉冲宽度...........................................................................41
实例 55:方式 0 控制流水灯循环点亮 ............................................................42
实例 56-1:数据发送程序...............................................................................43
实例 56-2:数据接收程序...............................................................................44
实例 57-1:数据发送程序...............................................................................45
实例 57-2:数据接收程序...............................................................................46
实例 58:单片机向PC发送数据......................................................................47
实例 59:单片机接收PC发出的数据 ..............................................................48
数码管显示.....................................................................................................49
实例 60:用LED数码显示数字 5 ....................................................................49
实例 61:用LED数码显示器循环显示数字 0~9 ..............................................49
实例 62:用数码管慢速动态扫描显示数字"1234"...........................................50
实例 63:用LED数码显示器伪静态显示数字 1234.........................................51
实例 64:用数码管显示动态检测结果 ............................................................51
实例 65:数码秒表设计..................................................................................53
实例 66:数码时钟设计..................................................................................55
实例 67:用LED数码管显示计数器T0 的计数值.............................................58
实例 68:静态显示数字“59” .........................................................................59
键盘控制 ........................................................................................................60
实例 69:无软件消抖的独立式键盘输入实验..................................................60
实例 70:软件消抖的独立式键盘输入实验 .....................................................60
实例 71:CPU控制的独立式键盘扫描实验.....................................................61
实例 72:定时器中断控制的独立式键盘扫描实验 ..........................................64
实例 73:独立式键盘控制的 4 级变速流水灯 .................................................67
实例 74:独立式键盘的按键功能扩展:"以一当四"........................................69
实例 75:独立式键盘调时的数码时钟实验 .....................................................71
实例 76:独立式键盘控制步进电机实验.........................................................75
实例 77:矩阵式键盘按键值的数码管显示实验 ..............................................78
2
108
实例 78:矩阵式键盘按键音...........................................................................81
实例 79:简易电子琴 .....................................................................................82
实例 80:矩阵式键盘实现的电子密码锁.........................................................88
液晶显示LCD .................................................................................................91
实例 81:用LCD显示字符'A' ..........................................................................91
实例 82:用LCD循环右移显示"Welcome to China" .......................................95
实例 83:用LCD显示适时检测结果................................................................98
实例 84:液晶时钟设计................................................................................102
一些芯片的使用*****24c02 DS18B20 X5045 ADC0832 DAC0832
DS1302 红外遥控
实例 85:将数据"0x0f"写入AT24C02 再读出送P1 口显示............................108
实例 86:将按键次数写入AT24C02,再读出并用 1602LCD显示.................112
实例 87:对I2C总线上挂接多个AT24C02 的读写操作 .................................119
实例 88:基于AT24C02 的多机通信 读取程序 ..........................................125
实例 88:基于AT24C02 的多机通信 写入程序 ............................................129
实例 90:DS18B20 温度检测及其液晶显示 .................................................140
实例 91:将数据"0xaa"写入X5045 再读出送P1 口显示................................148
实例 92:将流水灯控制码写入X5045 并读出送P1 口显示............................152
实例 93:对SPI总线上挂接多个X5045 的读写操作......................................156
实例 94:基于ADC0832 的数字电压表 ........................................................160
实例 95:用DAC0832 产生锯齿波电压 ........................................................166
实例 96:用P1 口显示红外遥控器的按键值 .................................................166
实例 97:用红外遥控器控制继电器..............................................................169
实例 98:基于DS1302 的日历时钟 ..............................................................171
实例 99:单片机数据发送程序 .....................................................................180
实例 100:电机转速表设计 ..........................................................................181
//模拟霍尔脉冲 .............................................................................................186
函数的使用和熟悉
实例 3:用单片机控制第一个灯亮
#include //包含 51 单片机寄存器定义的头文件
void main(void)
{
P1=0xfe; //P1=1111 1110B,即 P1.0 输出低电平
}
3
实例 4:用单片机控制一个灯闪烁:认识单片机的工作频率
#include //包含单片机寄存器的头文件
/****************************************
函数功能:延时一段时间
*****************************************/
void delay(void) //两个 void 意思分别为无需返回值,没有参数传递
{
unsigned int i; //定义无符号整数,最大取值范围 65535
for(i=0;i<20000;i++) //做 20000 次空循环
; //什么也不做,等待一个机器周期
}
/*******************************************************
函数功能:主函数 (C 语言规定必须有也只能有 1 个主函数)
********************************************************/
void main(void)
{
while(1) //无限循环
{
}
P1=0xfe; //P1=1111 1110B, P1.0 输出低电平
delay(); //延时一段时间
P1=0xff; //P1=1111 1111B, P1.0 输出高电平
delay(); //延时一段时间
}
实例 5:将 P1 口状态分别送入 P0、P2、P3 口:认识 I/O 口的
引脚功能
#include //包含单片机寄存器的头文件
/*******************************************************
函数功能:主函数 (C 语言规定必须有也只能有 1 个主函数)
********************************************************/
void main(void)
{
while(1)
P2=P1;
P3=P1;
// P1=1111 1111B,熄灭 LED
// 将 P1 口状态送入 P0 口
// 将 P1 口状态送入 P2 口
// 将 P1 口状态送入 P3 口
//无限循环
{
P1=0xff;
P0=P1;
4
}
}
unsigned char i,j;
for(i=0;i<250;i++)
}
for(j=0;j<250;j++)
;
实例 6:使用 P3 口流水点亮 8 位 LED
#include //包含单片机寄存器的头文件
/****************************************
函数功能:延时一段时间
*****************************************/
void delay(void)
{
/*******************************************************
函数功能:主函数
********************************************************/
void main(void)
{
while(1)
}
{
delay(); //调用延时函数
delay(); //调用延时函数
P3=0x7f; //第八个灯亮
delay(); //调用延时函数
}
P3=0xfe; //第一个灯亮
delay(); //调用延时函数
P3=0xfd; //第二个灯亮
delay(); //调用延时函数
P3=0xfb; //第三个灯亮
delay(); //调用延时函数
P3=0xf7; //第四个灯亮
delay(); //调用延时函数
P3=0xef; //第五个灯亮
P3=0xdf; //第六个灯亮
delay(); //调用延时函数
P3=0xbf; //第七个灯亮
5
unsigned char i,j;
for(i=0;i<250;i++)
}
for(j=0;j<250;j++)
; //利用循环等待若干机器周期,从而延时一段时间
实例 7:通过对 P3 口地址的操作流水点亮 8 位 LED
#include //包含单片机寄存器的头文件
sfr x=0xb0; //P3 口在存储器中的地址是 b0H, 通过 sfr 可定义 8051 内核单
片机
//的所有内部 8 位特殊功能寄存器,对地址 x 的操作也就是对 P1 口的
操作
/****************************************
函数功能:延时一段时间
*****************************************/
void delay(void)
{
/*****************************************
函数功能:主函数
******************************************/
void main(void)
{
while(1)
{
delay(); //调用延时函数
delay(); //调用延时函数
delay(); //调用延时函数
}
x=0xfe; //第一个灯亮
delay(); //调用延时函数
x=0xfd; //第二个灯亮
delay(); //调用延时函数
x=0xfb; //第三个灯亮
delay(); //调用延时函数
x=0xf7; //第四个灯亮
delay(); //调用延时函数
x=0xef; //第五个灯亮
x=0xdf; //第六个灯亮
delay(); //调用延时函数
x=0xbf; //第七个灯亮
x=0x7f; //第八个灯亮
6
}
{
; //空操作
for(i=0;i<200;i++)
for(j=0;j<180;j++)
实例 8:用不同数据类型控制灯闪烁时间
#include //包含单片机寄存器的头文件
/******************************************************
函数功能:用整形数据延时一段时间
******************************************************/
void int_delay(void) //延时一段较长的时间
{
unsigned int m; //定义无符号整形变量,双字节数据,值域为 0~65535
for(m=0;m<36000;m++)
}
/******************************************************
函数功能:用字符型数据延时一段时间
******************************************************/
void char_delay(void) //延时一段较短的时间
{
unsigned char i,j; //定义无符号字符型变量,单字节数据,值域 0~255
}
/******************************************************
函数功能:主函数
******************************************************/
void main(void)
{
unsigned char i;
while(1)
for(i=0;i<3;i++)
{
for(i=0;i<3;i++)
P1=0xfe; //P1.0 口的灯点亮
int_delay(); //延时一段较长的时间
P1=0xff; //熄灭
int_delay(); //延时一段较长的时间
}
{
P1=0xef; //P1.4 口的灯点亮
; //空操作
7
char_delay(); //延时一段较长的时间
P1=0xff; //熄灭
char_delay(); //延时一段较长的时间
}
}
}
实例 9:用 P0 口、P1 口分别显示加法和减法运算结果
#include
void main(void)
{
unsigned char m,n;
m=43; //即十进制数 2x16+11=43
n=60; //即十进制数 3x16+12=60
P1=m+n; //P1=103=0110 0111B,结果 P1.3、P1.4、P1.7 口的灯被点亮
P0=n-m; //P0=17=0001 0001B,结果 P0.0、P0.4 的灯被熄灭
}
实例 10:用 P0、P1 口显示乘法运算结果
#include //包含单片机寄存器的头文件
void main(void)
{
unsigned char m,n;
unsigned int s;
m=64;
n=71;
s=m*n; //s=64*71=4544,需要 16 位二进制数表示,高 8 位送 P1 口,
低 8 位送 P0 口
//由于
4544=17*256+192=H3*16*16*16+H2*16*16+H1*16+H0
(H1*16+H0)/256
除以 256 的商
256 的余数
//两边同除以 256,可得 17+192/256=H3*16+H2+
//因此,高 8 位 16 进制数 H3*16+H2 必然等于 17,即 4544
//低 8 位 16 进制数 H1*16+H0 必然等于 192,即 4544 除以
8