×

单片机编程实例大全

单片机编程实例大全(51单片机C语言应用程序设计实例精讲的目录)

admin admin 发表于2023-10-27 10:18:34 浏览29 评论0

抢沙发发表评论

本文目录

51单片机C语言应用程序设计实例精讲的目录

第1章51单片机开发的基础知识1.151单片机的硬件结构1.1.1功能模块1.1.2CPU1.1.3并行I/O端口1.1.4存储嚣结构1.1.5定时/计数器1.1.6串行口1.1.7中断系统1.251单片机的指令系统1.2.1寻址方式1.2.2指令说明1.2.3指令系统表1.3本章总结第2章C语言程序各语句用法与意义2.1数据结构2.1.1数据类型2.1.2变量与常量2.1.3数组2.1.4指针2.1.5结构2.1.6共用体2.1.7枚举2.2运算符与表达式2.2.1运算符分类与优先级2.2.2算术运算符与表达式2.2.3关系运算符与表达式2.2.4逻辑运算符与表达式2.2.5位操作运算符与表达式2.2.6赋值运算符与表达式2.3程序结构与函数2.3.1程序结构2.3.2函数2.4流程控制语句2.4.1选择语句2.4.2循环语句2.4.3转移语句2.5本章总结第3章Keil8051C编译器3.1Keil编译器简介3.2使用Keil开发应用软件3.2.1建立工程3.2.2工程的设置3.2.3编译与连接3.3dScopeforWindows的使用3.3.1如何启动3.3.2如何调试3.3.3调试窗口3.4本章总结 第4章单片机实现液晶显示4.1实例说明4.2设计思路分析4.2.1液晶显示模块4.2.2液晶显示工作原理4.2.3设计思路4.3硬件电路设计4.3.1器件选取4.3.2电源模块4.3.3液晶显示模块4.3.4单片机模块4.4软件设计4.4.1液晶控制驱动嚣指令集4.4.2程序说明4.5实例总结第5章基于MAX7219的8位数码管显示5.1实例说明5.2设计思路分析5.2.1LED显示驱动芯片的选取5.2.2MAX7219的工作原理5.3硬件电路设计5.3.1主要器件5.3.2电路原理图5.4软件设计5.4.1MAX7219的工作时序和寄存器描述5.4.2程序说明5.5实例总结第6章键盘输入实例——实现4x4键盘6.1实例说明6.2设计思路分析6.3硬件电路设计6.4软件设计6.5实例总结第7章单片机实现语音录放7.1实例说明7.2设计思路分析7.2.1语音芯片选取7.2.2语音芯片1SD2560简介7.3硬件电路设计7.3.1主要器件7.3.2电路原理图及说明7.4软件设计7.4.1程序流程7.4.2程序说明7.5实例总结 第8章基于MAX197的并行A/D转换8.1实例说明8.2设计思路分析8.2.1A/D转换原理8.2.2如何选择A/D转换器件8.2.3A/D转换器对电源电路的要求8.3硬件电路设计8.3.1主要器件8.3.2电路原理图及说明8.4软件设计8.4.1MAX197控制字8.4.2程序流程8.4.3程序说明8.5实例总结第9章基于TLC549的串行A/D转换9.1实例说明9.2设计思路分析9.2.1芯片选取9.2.2工作原理9.3硬件电路设计9.3.1主要器件9.3.2电路原理图及说明9.4软件设计9.4.1转换过程和时序要求9.4.2程序流程9.4.3程序说明9.5实例总结第10章基于MAX527的并行D/A转换10.1实例说明10.2设计思路分析10.2.1D/A转换原理10.2.2如何选择D/A转换器件10.2.3D/A转换器对电源电路的要求10.3硬件电路设计10.3.1主要器件10.3.2电路原理图及说明10.4软件设计10.4.1MAX527的地址和重要引脚10.4.2程序流程10.4.3程序说明10.5实例总结第11章基于MAX517的串行D/A转换11.1实例说明11.2设计思路分析11.2.1芯片选取11.2.2工作原理11.3硬件电路设计11.3.1主要器件11.3.2电路原理图及说明11.4软件设计11.4.1时序要求和转换过程11.4.2程序说明11.5实例总结第12章基于SHT71数字温/湿度传感器的采集实现12.1实例说明12.2设计思路分析12.2.1SHT71性能概述12.2.2SHT71的功能说明12.2.3SHT71的引脚尺寸和说明12.3硬件电路设计12.4软件设计12.4.1SHT71的操作方法12.42程序流程12.4.3源程序清单12.5实例总结第13章基于DS1624的数字温度计设计13.1实例说明13.1.2设计思路分析13.2.1DS1624简介13.2.2DS1624基本特性13.2.3DS1624工作原理13.2.4DS1624工作方式13.2.5DS1624的指令集13.3硬件电路设计13.3.1硬件设计13.3.2原理科及其说明13.4软件设计13.4.1程序流程13.4.2程序说明13.5实例总结 第14章基于DS12C887的实时日历时钟显示系统设计14.1实例说明14.2设计思路分析14.2.1选择合适的日历时钟芯片714.2.2如何由DS12C887芯片获取时间信息14.3硬件电路设计14.3.1结构框图14.3.2主要器件14.3.3电路原理图及说明14.4软件设计14.4.1DS12C877的内存空间14.4.2程序流程14.4.3程序代码及说明14.5实例总结第15章单片机控制的步进电机系统15.1实例说明15.2设计思路分析15.2.1步进电机的工作原理15.2.2步进电机的控制15.2.3脉冲分配与驱动芯片的选取15.3硬件电路设计15.3.1结构框图15.3.2主要器件15.3.3电路原理图厦说明15.4软件设计15.4.1程序流程15.4.2程序说明15.5实例总结第16章基于MAX1898的智能充电器设计16.1实例说明16.2设计思路分析16.2.1为何需要实现充电器的智能化16.2.2如何选择电池充电芯片16.2.3MAX1898的充电工作原理16.3硬件电路设计16.3.1主要器件16.3.2电路原理图及说明16.4软件设计16.4.1程序流程16.4.2程序说明16.5实例总结 第17章基于NORFlashAM29LV320的数据存储17.1实例说明17.2设计思路分析17.2.1芯片AM29LV32017.2.2具体设计思路17.3硬件电路设计17.4软件设计17.4.1AM29LV320的命令与状态17.4.2串行异步数据传输17.4.3程序代码说明17.5实例总结第18章基于XC95144的串口扩展18.1实例说明18.2设计思路分析18.2.1串口发送的设计18.2.2串口接收的设计18.2.3串口模块的设计l18.3硬件电路设计18.4软件设计18.4.1CPLD的设计原理图18.4.2C51单片机程序代码说明18.5实例总结第19章基于8255扩展并行口19.1实例说明19.2设计思路分析19.2.1并行口扩展的原理19.2.2芯片选择19.3硬件电路设计19.4软件设计19.5实例总结 第20章单片机实现智能信号发生器第21章单片机实现步进式PWM信号输出第22章单片机实现CRC算法第23章单片机实现软件滤波第七篇通信传输系统设计第24章单片机实现点对点的数据传输第25章单片机实现点对多点的数据传输第26章单片机实现以太网接口第27章单片机实现1C总线通信第28章单片机实现RS-485总线现场监测系统第29章CAN总线接口通信设计第八篇电源监控与抗干扰设计第30章单片机监控电路设计第31章光电隔离电路设计 附录A汇编语言与C语言的混合编程附录B实例配套实验箱

单片机的最简单的几个编程

最简单当然就是点亮一个LED灯了。

#include《reg51.h》sbit led=P1^0;main(){while(1)led=0;}

怎样学习单片机编程,单片机编程实例

1,首先要学习C语言基础,就相当于80%会单片机了,因为现在所有8/16/32位(51系列,MSP430系列,ARM系列)都是使用C语言。2,听起来单片机比较陌生,不是因为不懂,而是不知道方法和流程。现简单说说,仅供参考;3,先看内核8051的单片机:台湾宏晶的STC89C51-DIP40/或其它如新茂,到网上买一个开发板,价格不会超过200元。4,看一下单片机功能:包换内部FLASH、RAM、TIMER、INT、ADC、USB、ISP/IAR等。5,编译环境、编程软件KEIL。6,打开开发板的例子程序,在KEIL编译,下载到板,看结果和说明是不是相符,达到这样效果时,心里肯定很激动,这时真正学会了单片机,成功了。 7,然后再学会看电路图,电路图其实很简单,就是一根线从一个地方连接到另一个地方,写代码时,只记住单片机是哪一个管脚,然后对它写代码即可

单片机开发与典型工程项目实例详解的目 录

1.1 单片机的应用和特点 11.1.1 单片机的应用 11.1.2 主流单片机的种类及特点 31.2 MCS-51系列单片机的内部结构 71.3 MCS-51单片机的引脚功能与时序 91.3.1 MCS-51系列单片机引脚说明 101.3.2 MCS-51单片机的时序 161.4 MCS-51单片机的存储器组织 171.4.1 程序存储器 181.4.2 数据存储器 191.4.3 特殊功能寄存器 211.5 单片机最小系统 241.5.1 单片机最小系统 241.5.2 彩灯控制器的设计 251.5.3 顺序控制器的设计 271.6 本章小结 29 2.1 单片机C语言宏配置介绍 302.1.1 处理器的配置 302.1.2 ID区域 312.1.3 EEPROM数据 312.2 单片机数据结构 312.2.1 类型限定词 322.2.2 常数 332.2.3 变量 342.2.4 构造数据类型 382.2.5 函数 462.2.6 中断 492.2.7 C语言和汇编语言的嵌套使用 532.2.8 伪指令 542.3 MPLAB IDE编译器简介 572.3.1 MPLAB工程管理器(MPLAB Project Manager) 572.3.2 MPLAB文本器(MPLAB Editor) 572.3.3 MPLAB软件仿真器(MPLAB-SIM Simulator) 582.3.4 MPLAB在线仿真器(MPLAB-ICE Simulator) 582.4 MPLAB IDE的安装和使用 582.4.1 MPLAB IDE的安装要求 582.4.2 MPLAB IDE的使用 592.4.3 实例应用 592.4.4 MPLAB IDE中的工程 622.4.5 MPLAB IDE工程的编译 652.4.6 MPLAB IDE的软件仿真 662.5 MCC18基础 682.5.1 MCC18的安装目录浏览 682.5.2 MCC18的语言执行流程 702.5.3 MCC18举例 702.5.4 MCC18的编译环境 722.5.5 MCC18和单片机的比较 732.6 单片机的混合开发 742.6.1 C51和汇编语言的性能比较 742.6.2 C51和汇编语言的混合编程 742.7 本章小结 79 3.1 单片机应用系统设计的流程 803.2 单片机应用系统两设计原则 823.2.1 硬件系统设计原则 823.2.2 应用软件设计原则 833.3 单片机的选型 833.3.1 单片机选型的原则 833.3.2 单片机选型参考 853.3.3 开发工具的选择 863.4 系统常见故障与调试 873.5 本章小结 88 4.1 数字滤波算法 894.1.1 算术平均值滤波 904.1.2 滑动平均值滤波 924.1.3 防脉冲干扰平均值滤波 934.1.4 中值滤波 954.1.5 一阶滞后滤波 964.2 数字PID控制算法 974.2.1 位置式PID控制算法 984.2.2 增量式PID控制算法 1004.2.3 积分分离的PID控制算法 1024.2.4 变速积分PID控制算法 1034.3 本章小结 104 5.1 键盘设计的组成和分类 1055.1.1 键盘的物理结构 1065.1.2 键盘的组成形式 1065.2 键盘接口的工作过程和工作方式 1115.2.1 键盘的抖动干扰和消除方法 1115.2.2 盘接口的工作过程 1125.2.3 键盘的工作方式 1125.3 键位置的判别方法 1135.4 键盘接口设计的储存芯片和5.4 相关协议 1145.4.1 键盘接口设计的储存芯片 1145.4.2 AT24CXX系列的芯片及I2C协议 1145.4.3 A93CXX系列的芯片及SPI协议 1245.5 键盘接口实现的工程实例 1325.5.1 矩阵键盘接口的工程实例 1325.5.2 矩阵式中断扫描键盘的设计 1375.5.3 二进制编码键盘接口的工程实例 1395.6 重点与难点 141 6.1 交通灯顺序控制 1436.1.1 硬件系统的设计 1436.1.2 反向器74F06 1456.1.3 控制字 1456.1.4 程序设计 1456.2 设计一种基于模糊理论的单片机控制交通路口调度系统 1486.2.1 系统的总体设计 1486.2.2 十字路口调度系统模糊控制器的设计 1496.2.3 电路设计 1516.2.4 车流量检测电路 1546.2.5 系统主程序和模糊控制程序设计 1556.2.6 系统显示程序设计 1576.3 重点与难点 159 7.1 显示屏显示原理及串行通信基本概念 1617.1.1 显示屏显示原理 1617.1.2 串行通信 1637.1.3 阵列式LED显示屏的实现 1667.2 显示屏硬件电路设计 1667.2.1 硬件电路介绍 1687.2.2 外扩数据存储器电路 1707.3 列式LED显示屏显示程序的1717.3.1 汉字点阵数据的提取 1717.3.2 显示主程序 1747.3.3 串口中断处理程序 1767.3.4 显示驱动函数 1797.3.5 外部存储器读写程序 1817.3.6 串口通信程序 1817.3.7 文字显示特效程序 1827.4 本章小结 191 8.1 IC卡基础 1928.1.1 IC卡的分类 1928.1.2 IC卡的标准 1948.2 接触型IC卡读写系统的开发 1948.2.1 IC卡读写系统的时序 1958.2.2 IC卡读写系统的硬件连1968.2.3 IC卡读写系统的软件系统 1978.3 基于SLE4442加密卡读写系统的开发 2018.3.1 SLE4442卡的介绍 2018.3.2 SLE4442的模式 2038.3.3 SLE4442的操作命令 2058.3.4 SLE4442读/写系统的软硬件设计 2088.4 重点与难点 215 9.1 无刷直流电机控制原理 2169.1.1 无刷直流电机的组成 2179.1.2 无刷直流电机的工作原理 2179.1.3 无刷直流电机的控制方法 2199.2 无刷直流电机的工作特性 2209.3 直流无刷电机控制的应用实现 2219.3.1 总体设计概述 2219.3.2 直流无刷电机控制的硬件设计 2229.3.3 直流无刷电机控制的软件设计 2249.3.4 无刷直流电机速度闭环控制系统 2279.4 本章小结 230 10.1 永磁同步电机的结构与分类 23110.2 永磁同步电机的矢量控制 23210.3 永磁同步电机控制 23610.3.1 控制电路设计 23710.3.2 光电隔离电路设计 23810.3.3 功率电路设计 23910.4 永磁同步电机控制的软件实现 23910.4.1 电压SVPVM的DSPIC33f软件实现 24110.4.2 转子位置检测 24310.4.3 AD转换模块 24510.5 本章小结 246 11.1 汽车行驶记录仪功能介绍 24711.2 简易汽车行驶记录仪的设计 24911.2.1 汽车行驶记录仪的考虑因素 25011.2.1 MSP430 25111.2.2 车模拟信号的采集 25411.2.4 数字信号采集电路 25511.2.5 SST39VF160芯片介绍 25711.3 记录仪的软件设计 25711.3.1 软件流程图 25811.3.2 数据存储格式 25911.3.3 SST39VF160存储器数据读写的实现 25911.4 数据采集的程序实现 26311.5 本章小结 264 12.1 USB-GPIB控制器简介 26512.1.1 认识USB 26612.1.2 GPIB 26912.2 USB-GPIB控制器的硬件电路设计 27112.2.1 器件的选择 27212.2.2 USB-GPIB控制器电路设计 27812.3 USB-GPIB控制器的软件程序的实现 28712.3.1 USB单片机协议控制芯片与主机(计算机)的数据交互 28812.3.2 USB协议控制芯片与GPIB控制器的数据交互 29912.4 USB-GPIB控制器固件的调试与固化 30012.4.1 USB-GPIB控制器固件的调试 30112.4.2 USB-GPIB控制器固件程序的固化 30212.5 本章小结 303 13.1 研究抗干扰技术的重要性 30413.2 干扰的分类 30513.2.1 按噪声产生的原因分类 30613.2.2 按噪声传导模式分类 30613.2.3 按噪声波形及性质分类 30713.3 干扰的耦合方式 30813.4 单片机系统可靠性的设计任务与方法 31013.4.1 单片机系统可靠性设计的任务 31013.4.2 可靠性设计一般方法 31113.5 本章小结 313 14.1 无源滤波器抗干扰 31414.1.1 电容滤波器 31514.1.2 电感滤波器 31614.1.3 RC低通滤波器 31614.1.4 1LC低通滤波器 31814.1.5 低通滤波器的结构选择 31914.1.6 低通滤波器的平衡结构与串联形式 31914.2 有源滤波器抗干扰 32114.2.1 一级低通有源滤波器 32114.2.2 二级低通有源滤波器 32214.3 去耦电路 32414.3.1 尖峰电流的形成原理 32414.3.2 去耦电容的配置 32514.3.3 光电隔离 32614.3.4 继电器隔离 32814.3.5 变压器隔离 32814.3.6 布线隔离 32914.4 接地技术 33014.5 本章小结 334 15.1 概述 33515.2 指令冗余技术 33615.2.1 单字节指令冗余 33715.2.2 重要指令冗余 33715.3 软件陷阱技术 33715.3.1 未使用的中断向量区设置陷阱 33815.3.2 RAM数据区中设置陷阱 33815.3.3 未使用的EPROM数据区设置陷阱 33915.3.4 非EPROM单片机空间设置陷阱 33915.3.5 运行程序区设置陷阱 33915.4 看门狗技术 33915.4.1 硬件看门狗技术 34015.4.2 软件看门狗技术 34215.5 本章小结 345

SAM-BAA单片机编程工具使用实例教程

SAM-BA编程工具是一款非常好用的单片机编程工具,能够利用DEBUG串口和USB接口对AT91系列单片机进行编程。接下来让我们来看一下使用实例:SAM-BA编程工具下载地址:下面就是见证奇迹的时刻(嘿嘿,套用下时下时髦的话),当我们再次把USB数据线与J-Link连接之后,动听的USB设备识别声音出现了,并且弹出驱动安装,我们点击自动安装即可,这样我们损坏的J-Link就起死回生了,很神奇,有木有,哈哈~

80c51单片机程序实例

给你发个产品的真实程序,控制交流滑差电机,既检测控制速度,又检测实际速度,还根据检测值控制电机在控制速度值下平稳运行。ORG0000H;主轴控制程序START:AJMPMAIN;REALSPDLEQU30HREALSPDHEQU31HCMPSPDLEQU32HCMPSPDHEQU33HADJSPDEQU34HBKCNTEQU35HT0COUNTEQU36HT1COUNTEQU37HIOSPDLEQU38HIOSPDHEQU39HT_TMPEQU3AHT_MSEQU3BHT_250MSEQU3CHCH1EQU3AHCH2EQU3BHUPSPDEQU2DNSPDEQU2STOPBEQUP1.4RUNBEQUP1.3LAMPBEQUP3.7PZBEQUP3.4PABEQUP3.3SPDBEQUP3.2BREAKBEQUP1.1ENABLEEQUP1.0;-----------------------------------ORG0003HSJMPIE0DEALORG000BHSJMPTF0DEALORG0013HSJMPIE1DEALORG001BHSJMPTF1DEALORG0023HSJMPRITIDEAL;------------------------------------ORG0030HIE0DEAL:CLRTR0MOVIOSPDL,TL0MOVIOSPDH,TH0MOVTL0,#0MOVTH0,#0SETBTR0PUSHACCCLR02HMOVA,REALSPDHCLRCSUBBA,#2JCIE0D2SETB02HIE0D2:POPACCIE0D3:RETI;------------------------------------TF0DEAL:SETB01HRETI;------------------------------------IE1DEAL:CLRTR1MOVREALSPDL,TL1MOVREALSPDH,TH1MOVTL1,#0MOVTH1,#0SETBTR1JB03H,IE1D1INCT1COUNTMOVA,T1COUNTCLRCSUBBA,#250JCIE1D1MOVT1COUNT,#0INCT0COUNTMOVA,T0COUNTCLRCSUBBA,#4JCIE1D1MOVT0COUNT,#0SETB03HIE1D1:CLR01HRETI;------------------------------------TF1DEAL:SETB01HMOVREALSPDL,#0FFHMOVREALSPDH,#0FFHRETI;------------------------------------RITIDEAL:RETI;******************************************************************************DELAY2:MOVT_TMP,#0F9H;0FAH=1msDJNZT_TMP,$DJNZT_MS,DELAY2;3EH=?msRET;------------------------------------------------------------------------------DELAY3:MOVT_MS,#0FAH;0FAH=250msLCALLDELAY2DJNZT_250MS,DELAY3;3FH=?*250msRET;------------------------------------MAIN:CLREACLRET0CLRET1CLREX0CLREX1CLRTR0CLRTR1SETBRUNBSETBSTOPBMOVSP,#60HMOVTMOD,#11HMOVTCON,#05HMOVTL0,#0MOVTH0,#0MOVTL1,#0MOVTH1,#0MOVT_250MS,#20LCALLDELAY3SETBTR0SETBTR1SETBET0SETBET1SETBEX0SETBEX1SETBEAMOVT1COUNT,#0MOVT0COUNT,#0SETBBREAKBSETBENABLESETB01HCLR03HCLR04HSETBRUNBSETBSTOPBMOVT_MS,#100LCALLDELAY2INIT:JBRUNB,LOOPMOVT_MS,#200LCALLDELAY2CPLP3.7SJMPINITLOOP:JNBRUNB,CONTINUELOOP0:JNBSTOPB,STOPPRESUME:SETBBREAKBSETBENABLESETB01HCLRP3.7MOVTL0,#0MOVTH0,#0MOVTL1,#0MOVTH1,#0MOVT1COUNT,#0MOVT0COUNT,#0MOVBKCNT,#0CLR03HCLR04HSJMPLOOPCONTINUE:JB01H,CNT1LCALLCOMPAREJZCNT3CJNEA,#0FFH,CNT2CNT1:SETBBREAKBCLRENABLESJMPLOOPCNT2:SETBBREAKBSETBENABLESJMPLOOPCNT3:JB02H,CNT2JNB03H,CNT2CLRBREAKBSETBENABLECNT4:SJMPLOOP;------------------------------------STOPP:CLRBREAKBSETBENABLESTOPP1:JNBSTOPB,STOPP1SETBBREAKBSETBENABLESJMPLOOP;------------------------------------COMPARE:MOVA,REALSPDLADDA,#1MOVCMPSPDL,AMOVA,REALSPDHADDCA,#0MOVCMPSPDH,ACLRCMOVA,CMPSPDLSUBBA,IOSPDLMOVCMPSPDL,AMOVA,CMPSPDHSUBBA,IOSPDHMOVCMPSPDH,AJCCOM11;MOREJZCOM12COM10:MOVA,#0FFHRETCOM11:MOVA,#00HRETCOM12:LCALLGETADJCLRCMOVA,CMPSPDLSUBBA,ADJSPDJNCCOM10MOVA,#0A0HRET;------------------------------------GETADJ:MOVA,IOSPDHJNZGETADJ0MOVA,IOSPDLSUBBA,#79JNCGETADJ01MOVADJSPD,#3;》700RETGETADJ01:SUBBA,#32JNCGETADJ03MOVADJSPD,#6;500~700RETGETADJ03:SUBBA,#73JNCGETADJ04MOVADJSPD,#10;300~500RETGETADJ04:MOVADJSPD,#16;216~300RETGETADJ0:MOVA,REALSPDHSUBBA,#2JCGETADJ1MOVADJSPD,#3;《108RETGETADJ1:MOVA,REALSPDLSETBCRRCASUBBA,#150JNCGETADJ2MOVADJSPD,#24;》200RETGETADJ2:SUBBA,#50JNCGETADJ3MOVADJSPD,#48;150~200RETGETADJ3:MOVADJSPD,#96;《150RET;------------------------------------END

c51单片机程序实例

#include《reg51.h》#define uchar unsigned charuchar tab={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};  //0到9uchar num,cnt,disn;uchar keyval,disk;uchar led={1,2,3,4};void dealdat(uchar a){led=0;led=0;led=0;led=0;led; num++; num&=0x03; cnt++; if(cnt》100) { cnt=0; disn++; disn%=4; dealdat(disn); }}uchar kbscan(void){ unsigned char sccode,recode; P3=0x0f;  //发0扫描,列线输入 if ((P3 & 0x0f) != 0x0f)  //有键按下 {// delay(20);   //延时去抖动 if ((P3&0x0f)!= 0x0f) { sccode = 0xef;    //逐行扫描初值 while((sccode&0x01)!=0) {     P3=sccode; if((P3&0x0f)!=0x0f) {     recode=(P3&0x0f)|0xf0; return((~sccode)+(~recode));  }         else sccode=(sccode《《1)|0x01; } } } return 0;  //无键按下,返回0}void getkey(void){ unsigned char key; key=kbscan(); if(key==0){keyval=0xff;return;} switch(key) { case 0x11:keyval=7;break; case 0x12:keyval=4;break; case 0x14:keyval=1;break; case 0x18:keyval=10;break; case 0x21:keyval=8;break; case 0x22:keyval=5;break; case 0x24:keyval=2;break; case 0x28:keyval=0;break; case 0x41:keyval=9;break; case 0x42:keyval=6;break; case 0x44:keyval=3;break; case 0x48:keyval=11;break; case 0x81:keyval=12;break; case 0x82:keyval=13;break; case 0x84:keyval=14;break; case 0x88:keyval=15;break; default:keyval=0xff;break; }}main(){ TMOD=0x11; TH0=(65536-5000)/256; TL0=(65536-5000)%256; TR0=1; ET0=1; EA=1; while(1) { getkey(); if(keyval!=0xff)disk=keyval; delay(10); }}

单片机c语言编程100个实例

51单片机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.3 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P1_3 = 1; //给P1_3赋值1,引脚P1.3就能输出高电平VCC 5. While( 1 ); //死循环,相当 LOOP: goto LOOP; 6. } 注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。 在某引脚输出低电平的编程方法:(比如P2.7引脚) 代码 1. #include 《AT89x52.h》 //该头文档中有单片机内部资源的符号化定义,其中包含P2.7 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P2_7 = 0; //给P2_7赋值0,引脚P2.7就能输出低电平GND 5. While( 1 ); //死循环,相当 LOOP: goto LOOP; 6. } 在某引脚输出方波编程方法:(比如P3.1引脚) 代码 1. #include 《AT89x52.h》 //该头文档中有单片机内部资源的符号化定义,其中包含P3.1 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. While( 1 ) //非零表示真,如果为真则执行下面循环体的语句 5. { 6. P3_1 = 1; //给P3_1赋值1,引脚P3.1就能输出高电平VCC 7. P3_1 = 0; //给P3_1赋值0,引脚P3.1就能输出低电平GND 8. } //由于一直为真,所以不断输出高、低、高、低……,从而形成方波 9. } 将某引脚的输入电平取反后,从另一个引脚输出:( 比如 P0.4 = NOT( P1.1) ) 代码 1. #include 《AT89x52.h》 //该头文档中有单片机内部资源的符号化定义,其中包含P0.4和P1.1 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P1_1 = 1; //初始化。P1.1作为输入,必须输出高电平 5. While( 1 ) //非零表示真,如果为真则执行下面循环体的语句 6. { 7. if( P1_1 == 1 ) //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC 8. { P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND 2 51单片机C语言编程实例 9. else //否则P1.1输入为低电平GND 10. //{ P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND 11. { P0_4 = 1; } //给P0_4赋值1,引脚P0.4就能输出高电平VCC 12. } //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平 13. } 将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) ) 代码 1. #include 《AT89x52.h》 //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P3 = 0xff; //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平 5. While( 1 ) //非零表示真,如果为真则执行下面循环体的语句 6. { //取反的方法是异或1,而不取反的方法则是异或0 7. P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出 8. } //由于一直为真,所以不断将P3取反输出到P2 9. } 注意:一个字节的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灭。 代码 1. #include 《at89x52.h》 2. #define LED P1^1 //用符号LED代替P1_1 3. #define KEY_ON P1^6 //用符号KEY_ON代替P1_6 4. #define KEY_OFF P1^7 //用符号KEY_OFF代替P1_7 5. void main( void ) //单片机复位后的执行入口,void表示空,无输入参数,无返回值 6. { 7. KEY_ON = 1; //作为输入,首先输出高,接下KEY_ON,P1.6则接地为0,否则输入为1 8. KEY_OFF = 1; //作为输入,首先输出高,接下KEY_OFF,P1.7则接地为0,否则输入为1 9. While( 1 ) //永远为真,所以永远循环执行如下括号内所有语句 10. { 11. if( KEY_ON==0 ) LED=1; //是KEY_ON接下,所示P1.1输出高,LED亮 12. if( KEY_OFF==0 ) LED=0; //是KEY_OFF接下,所示P1.1输出低,LED灭 13. } //松开键后,都不给LED赋值,所以LED保持最后按键状态。 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,则可编写出对应十六进制码的七段码表字节数据