本帖最后由 史提芬温 于 2012-3-29 16:46 编辑
内容简介
本书以宏晶公司的STC89C52RC单片机为蓝本,由浅入深,并结合SmartM51开发板系统地介绍单片机的原理与结构、开发环境的使用、各种功能器件的应用。 本书主要特色是边学边做,不是单纯的理论讲解,各章节中规中矩,遵循由简到繁、循序渐进的编排方式。本书大部分的内容均来自本人的项目经验,因而许多C语言代码能够直接应用到工程项目中去,且代码风格良好。书中还介绍了USB通信、网络通信、数据校验、深入编程等,而这些内容在很多同类型书籍中并不具备,恰恰也是踏出社会工作经常要接触的。其中配套的光盘提供各实验的演示视频和实例代码,可使读者在短时间内迅速掌握单片机的应用技巧,并可向读者提供配套的单片机开发板。 本书既可以作为大学本、专科单片机课程教材,又可以作为相关技术人员的参考与学习。俗语有说:“师父领进门,悟性靠徒弟”,最后衷心希望本书能对单片机应用推广起到一定的作用。
目录
前 言 12
绪 论 14
第一章 8051简介 18
1.1 8051系列单片机的特点 18
1.2 8051系列单片机内部结构 19
1.2.1 微处理器 20
1.2.2 振荡器与CPU时序 22
1.2.3 存储器 22
1.2.4 并行接口 25
1.3 8051系列单片机内部资源 25
第二章 STC89C51RC/RD+系列单片机 27
2.1 主要特性 27
2.2 型号 27
2.3 结构图 28
2.4 管脚 29
2.5 特殊功能寄存器 31
第三章 开发环境 33
3.1 Cx51编译器 33
3.2 Keil简介 35
3.2.1 Keil C51系统概述 35
3.2.2 Keil开发系统的整体结构 36
3.2.3 Keil C51存储区关键字 37
3.3 NotePad++简介 39
3.4 NotePad++配置 40
3.4.1 设置语法着色 40
3.4.2 添加关键字 41
3.4.3 设置自动完成 43
3.5 Keil与NotePad++联合编辑 44
第四章 工程创建与深入 48
4.1 启动程序 48
4.2 创建工程 49
4.3 编写程序 51
4.3.1 HEX文件 55
4.4 深入Keil 57
4.4.1 剖析头文件 57
4.4.2 剖析优化 59
4.4.3 详解STARTUP.A51 62
4.5 程序烧写 66
基础入门篇 70
第五章 GPIO 71
5.1 GPIO简介 71
5.2 GPIO实验 72
5.3 软件延时 78
5.3.1 软件延时编写 79
第六章 定时器/计数器与中断 82
6.1 定时器/计数器简介 82
6.2 定时器/计数器寄存器 82
6.3 定时器/计数器工作方式 85
6.4 流水灯实验 86
6.5 中断相关 92
6.5.1 中断 92
6.5.2 中断寄存器 93
6.5.3 中断服务函数 99
6.5.4 中断优先级与中断嵌套研究 100
第七章 串口 105
7.1 串口简介 105
7.1.1 串口基本概念 105
7.1.2 串口通信原理 106
7.2 串口相关寄存器 108
7.3 串口工作方式 109
7.4 串口实验 110
7.4.1 串口发送数据实验 110
7.4.2 串口接收数据实验 114
7.5模拟串口实验 122
7.6串口波特率研究 128
7.7串口多机通信研究 130
第八章 外部中断 132
8.1 外部中断简介 132
8.2 外部中断实验 132
第九章 串行输入并行输出 137
9.1 74LS164简介 137
9.2 74LS164结构 138
9.3 74LS164函数 140
第十章 数码管 142
10.1 数码管简介 142
10.2 字型码 142
10.3 驱动方式 144
10.4 数码管实验 145
第十一章 LCD 154
11.1 液晶简介 154
11.2 1602液晶 154
11.2.1 LCD1602显示实验 157
11.3 12864液晶 164
11.3.1 LCD12864显示实验 169
第十二章 EEPROM 177
12.1 EEPROM简介 177
12.2 STC89C52RC内部EEPROM 177
12.2.1内部EEPROM简介 177
12.2.2 EEPROM寄存器 178
12.3 EEPROM实验 182
第十三章 看门狗 189
13.1 看门狗简介 189
13.2 看门狗寄存器 189
13.3 看门狗实验 191
第十四章 单片机补遗 196
14.1 功耗控制 196
14.1.1 PCON电源管理寄存器 196
14.1.2 中断唤醒MCU实验 197
14.2 EMI管理 201
14.2.1 AUXR特殊功能寄存器 201
14.3 软件复位 202
14.3.1 ISP/IAP控制寄存器ISP_CONTR 202
14.3.2软件复位实验 203
14.3.3 Keil仿真模拟软件复位 208
14.4 RTX-51实时系统 213
14.4.1 实时系统与前后台系统 213
14.4.2 RTX-51实时系统技术参数 216
14.4.3 深入RTX-51 tiny实时系统 218
14.4.4 RTX-51 Tiny实时系统实验 219
14.5 LIB的生成与使用 226
14.5.1 LIB文件的创建 227
14.5.2 LIB文件的使用 228
实战篇 230
第十五章 按键计数器 231
15.1 按键计数器简介 231
15.2 按键检测 231
15.2.1 传统的按键检测 231
15.2.2 状态机按键检测 233
15.3 按键计数器实验 234
第十六章 交通灯 248
16.1 交通灯简介 248
16.2 交通灯实验 249
第十七章 频率计 264
17.1 频率计简介 264
17.2 频率计实验 264
高级通信接口开发篇 276
第十八章 USB通信 277
18.1 USB简介 277
18.2 USB的电气特性与传输方式 279
18.2.1 电气特性 279
18.2.2 传输方式 279
18.2.3 总线协议 280
18.3 USB总线接口芯片CH372 281
18.4 CH372内置固件模式 296
18.4.1 内置固件模式实验 296
18.4.2 驱动安装与识别 305
18.5 CH372外部固件模式 308
18.5.1 外部固件 308
18.5.2 外部固件模式实验 310
18.5.3 USB协议 314
18.5.4 驱动安装与识别 328
第十九章 网络通信 331
19.1网络简介 331
19.2网络芯片ENC28J60 332
19.3 SPI通信 338
19.3.1 SPI简介 338
19.3.2 SPI接口定义 339
19.4 TCP/IP协议 344
19.4.1 TCP/IP 协议简介 344
19.5 网络实验 351
19.5.1 Ping实验 358
19.5.2 TCP实验 359
19.5.3 UDP实验 362
深入篇 364
第二十章 深入接口 365
20.1 简介 365
20.2 校验介绍 365
20.2.1 奇偶校验 365
20.2.2 校验和 367
20.2.3 循环冗余码校验 368
20.3 数据校验实战 370
20.3.1 数据帧格式定义 371
20.3.2 数据校验实验 373
第二十一章 深入编程 377
21.1 编程规范 377
21.1.1 排版 377
21.1.2 注释 378
21.1.3 标识符 379
21.1.4 函数 380
21.2 代码架构 381
21.2.1 功能模块构建 381
21.2.2 前后台系统构建 383
21.3 高级应用集锦 389
21.3.1 宏 389
21.3.2 函数指针 391
21.3.3 结构体、共用体 392
21.3.4 程序优化 393
21.3.5 软件抗干扰 404
21.3.6 软件低功耗设计 406
番外篇 408
第二十二章 界面开发 409
22.1 VC++2008 409
22.2 HelloWorld小程序 409
22.3 实现串口通信 410
22.3.1 创建界面 410
22.3.2 添加CSerial类 410
22.3.3 编写程序 410
22.3.4 运行程序 411
附录A Keil C与ANSI C的差异 412
附录B 编译器限制 415
附录C 字节顺序 416
附录D 提示与注意 418
附录E 调试技巧 422
E.1 软件仿真 422
附录F 指令集 427
参考文献 430
示例源码 /****************************************
*函数名称:UARTInit
*输 入:无
*输 出:无
*功 能:串口初始化
******************************************/
static void UARTInit(void)
{
SCON =0x40;
T2CON=0x34;
RCAP2L=0xD9;
RCAP2H=0xFF;
}
/****************************************
*函数名称:UARTSendByte
*输 入:byte 要发送的字节
*输 出:无
*功 能:串口数据发送
******************************************/
static void UARTSendByte(UINT8 byte)
{
SBUF=byte;
while(TI==0);
TI=0;
}
/****************************************
*函数名称:PROC_SetData
*输 入:Wp 参数1
Lp 参数2
*输 出:无
*功 能:进程-设置数据
******************************************/
PROC_API void PROC_SetData(WPARAM Wp,LPARAM Lp)
{
static UINT8 cnt=1;
static UINT8 buf[8],i;
Wp=Wp; //若不使用该变量,就自赋值,以免出现编译警告
Lp=Lp; //若不使用该变量,就自赋值,以免出现编译警告
for(i=0; i<8; i++)
{
buf=cnt+'0';
}
if(++cnt>9)
{
cnt=1;
}
SetCurProcIsAlive(FALSE); //当前进程无效
SetProcIsAlive(PROC_SEND_DATA,//发送数据进程序号
TRUE, //激活
(WPARAM)buf, //传入buf指针
(LPARAM)8); //数据长度为8
}
/****************************************
*函数名称:PROC_SendData
*输 入:Wp 参数1
Lp 参数2
*输 出:无
*功 能:进程-发送数据
******************************************/
PROC_API void PROC_SendData(WPARAM Wp,LPARAM Lp)
{
UINT8 i;
UINT8 *pbuf=(UINT8 *)Wp; //获取要发送的数据
UINT8 j=(UINT8)Lp; //获取发送数据长度
for(i=0; i
{
UARTSendByte(*(pbuf+i)); //发送数据
}
for(i=0;i<255;i++)
for(j=0;j<255;j++); //延时一会儿
for(i=0;i<255;i++)
for(j=0;j<255;j++); //延时一会儿
SetCurProcIsAlive(FALSE); //当前进程无效
SetProcIsAlive(PROC_SET_DATA,//设置数据进程序号
TRUE, //激活
(WPARAM)0, //参数1
(LPARAM)0); //参数2
}
/****************************************
*函数名称:main
*输 入:无
*输 出:无
*功 能:函数主体
******************************************/
void main(void)
{
UARTInit(); //串口初始化
while(1)
{
ProcPerform(); //进程调度
}
}
下载地址
|