51单片机应用程序实例
51单片机实用程序库

MAIN1:
MOV P1,A ;开最左边的灯
ACALL DELAY ;延时
RL A ;将开的灯向右边移
AJMP MAIN ;循环
DELAY:
MOV 30H,#0FFH
D1: MOV 31H,#0FFH
D2: DJNZ 31H,D2
DJNZ 30H,D1
MOVC A,@A+DPTR
MOV SBUF,A
D1: JNB TI,D1
CLR TI
;//////////////////////////////////////////////////
;将转换的数字量屏蔽低位高位送显////////////////////
MOV A,30H
20
ANL A,#0F0H
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV DPTR,#SETTAB
MOV A,QIAN
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
;/////////////////////////////////////////////
19
处理后在数码管上用相对应的16进制数显示出来,0—5V对
应为0--0FFH,实际应用例如:数据采集。
程序操作:程序写完上电运行后,用本机配带的专用起微调
图15所示电位器,会在数码管上看到随不同电压而变化的对
应16进制值。也可以用
万用表实ADC0809IN3脚
电压,来检验所对应显
示的16进制数。
51单片机应用程序实例

MCS 51单片机应用程序实例2007年10月25日工控吧-;多路开关状态指示1.实验任务如图3.1所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。
〔开关闭合,对应的灯亮,开关断开,对应的灯灭〕。
2.电路原理图图3.13.系统板上硬件连线〔1.把“单片机系统〞区域中的P1.0-P1.3用导线连接到“八路发光二极管指示图4.13.系统板上硬件连线把“单片机系统〞区域中的P1.0-P1.7用8芯排线连接到“八路发光二极管指示模块〞区域中的L1-L8端口上,要求:P1.0对应着L1,P1.1对应着L2,……,P1.7对应着L8。
4.程序设计内容我们可以运用输出端口指令MOV P1,A或MOV P1,#DATA,只要给累加器值或常数值,然后执行上述的指令,即可到达输出控制的动作。
每次送出的数据是不同,具体的数据如下表1所示P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 说明L8 L7 L6 L5 L4 L3 L2 L11 1 1 1 1 1 1 0 L1亮1 1 1 1 1 1 0 1 L2亮1 1 1 1 1 0 1 1 L3亮1 1 1 1 0 1 1 1 L4亮1 1 1 0 1 1 1 1 L5亮1 1 0 1 1 1 1 1 L6亮1 0 1 1 1 1 1 1 L7亮0 1 1 1 1 1 1 1 L8亮表15.程序框图图4.26.汇编源程序ORG 0START: MOV R2,#8MOV A,#0FEHSETB CLOOP: MOV P1,ALCALL DELAYRLC ADJNZ R2,LOOPMOV R2,#8LOOP1: MOV P1,ALCALL DELAYRRC ADJNZ R2,LOOP1LJMP STARTDELAY: MOV R5,#20 ;D1: MOV R6,#20一键多功能按键识别技术1.实验任务如图9.1所示,开关SP1接在P3.7/RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。
51单片机C语言实例(350例)Proteus仿真和代码都有

51单片机C语言实例(350例)Proteus仿真和代码都有51单片机C语言实例(400例)所有实例程序均经测试过,适合新手学习。
1-IO输出-点亮1个LED灯方法1 10-LED循环左移100-24c02记忆开机次数101-24c02存储上次使用中状态102-DS1302 时钟原理103-DS1302可调时钟104-DS1302时钟串口自动更新时间105-1602液晶显示DS1302时钟106-字库ST7920 12864液晶基础显示107-按键 12864显示108-PCF8591 1路AD数码管显示109-PCF8591 4路AD数码管显示11-LED循环右移110-PCF8591 DA输出模拟111-PCF8591 输出锯齿波112-PCF8591 1602液晶显示113-串口通讯114-串口通讯中断应用115-RS485基本通讯原理116-红外接收原理117-红外解码数码管显示118-红外解码1602液晶显示119-红外发射原理12-查表显示LED灯120-红外收发测试121-双红外发射避障原理测试122-1个18B20 温度传感器数码管显示123-1个18b20温度传感器1602液晶显示124-多个18b20温度传感器1602液晶显示125-超温报警测试126-温度可调上下限1602126-温度可调上下限1602显示127-PS2键盘输入1602液晶显示128-双色点阵1种颜色显示测试129-双色点阵2种颜色显示测试13-双灯左移右移闪烁130-双色点阵显示特定图形131-双色点阵交替图形显示132-双色点阵双色交替动态显示133-热敏电阻测试数码管显示134-光敏电阻测试数码管显示135-自动调光测试136-串转并数字芯片测试137-非门数字芯片测试138-电子琴139-实用99分钟倒计时器14-花样灯140-外部频率测试141-定时做普通时钟可调142-1602液晶显示的密码锁143-实用密码锁144-1602液晶显示的计算器145-秒表146-串口测温电脑显示147-交通灯测试148-点阵模拟电梯上行下行149-点阵流动广告模拟15-PWM调光150-综合测试程序151-12位AD_DS1621与12864液晶152-闪烁灯一153-闪烁灯二154-流水灯A155-51单片机12864大液晶屏proteus仿真156-流水灯B157-数码管显示158-12864LCD显示计算器键盘按键实验159-数码管显示(锁存器)16-共阳数码管静态显示160-数码管动态显示161-数码管滚动显示162-数码管字符显示163-独立按键164-矩阵键盘165-矩阵键盘(LCD)166-用DS1302与12864LCD设计的可调式中文电子日历167-定时器的使用(方式1)168-12864LCD图形滚动演示169-用PG12864LCD设计的指针式电子钟17-1个共阳数码管显示变化数字170-定时器的使用(方式2)171-外部中断的使用172-定时器和外部中断173-开关控制12864LCD串行模式显示174-点阵显示175-液晶1602显示176-12864带字库测试程序177-串行12864显示178-遥控键值解码-12864LCD显示179-液晶12864并行18-单个数码管模拟水流180-液晶12864并行2181-串口发送试验182-串口接收试验183-串口接收(1602)184-蜂鸣器发声185-直流电机调速186-蜂鸣器间断发声187-lcd-12864应用188-继电器控制189-直流电机调速19-按键控制单个数码管显示190-步进电机191-存储AT24C02192-PCF8591T AD实验193-PCF8591T芯片DA实验194-温度采集DS18B20195-EEPROM_24C02196-12864LCD显示24C08保存的开机画面197-红外解码198-12864LCD显示EPROM2764保存的开机画面199-时钟DS1302(LCD)2-IO输出-点亮1个LED灯方法220-单个数码管指示逻辑电平200-宏晶看门狗201-SD卡202-秒表203-普通定时器时钟204-彩屏控制205-彩屏图片显示206-12864+DS1302时钟+18B20温度计207-12864测试程序208-12864串行驱动演示209-12864生产厂程序21-8位数码管显示其中之一210-12864中文显示测试211-LCD12864212-12864M液晶显示(有字库)程序(汇编)213-超声波测距LCD12864显示214-红外遥控键值解码12864液晶显示(汇编语言)215-用DS1302与12864LCD设计的可调式中文电子日历216-中文12864217-中文12864LCD显示红外遥控解码实验218-IO端口输出219-IO端口输入22-8位数码管静态显示其中之二220-流水灯221-数码管显示223-独立按键224-独立按键去抖动225-定时器0226-定时器1227-定时器2228-外部中断0电平触发229-外部中断0边沿触发23-8位数码管动态扫描显示230-外部中断1231-矩阵键盘232-液晶LCM1602233-LCD1602动态显示234-EEPROM24c02235-开机次数记忆236-红外解码LCD1602液晶显示237-红外解码数码管显示238-喇叭239-液晶背光控制24-8位数码管动态扫描原理演示240-与电脑串口通信241-步进电机242-字库LCD12864液晶测试243-液晶数码综合显示244-99秒计时245-99倒计时246-抢答器247-PWM调光248-LED点阵249-直流电机调速250-按键计数器251-秒表252-数码管移动253-花样灯254-红绿灯255-音乐播放256-红外收发演示257-普通定时器时钟258-继电器控制259-ps2键盘LCD1602液晶显示26-9累加260-RTC实时时钟DS1302液晶显示261-单线温度传感器18b20262-串口测温263-带停机步进电机正反转264-步进电机正反转265-AD_DA_PCF8591266-液晶AD_DA_PCF8591267-秒手动记数268-功能感受269-流水登27-99累加270-点亮一个二极管271-用单片机控制一个灯闪烁272-将P1口状态送入P0、P2、P3273-P3口流水灯274-通过对P3口地址的操作流水点亮8位LED 275-用不同数据类型控制灯闪烁时间276-用P0口、P1 口分别显示加法和减法运算结果277-用P0、P1口显示乘法运算结果278-用P1、P0口显示除法运算结果279-用自增运算控制P0口8位LED流水花样28-999累加280-用P0口显示逻辑与运算结果281-用P0口显示条件运算结果282-用P0口显示按位异或运算结果283-用P0显示左移运算结果284-万能逻辑电路实验285-用右移运算流水点亮P1口8位LED286-用if语句控制P0口8位LED的流水方向287-用swtich语句的控制P0口8位LED的点亮状态288-用for语句控制蜂鸣器鸣笛次数289-包含单片机寄存器的头文件29-9999累加290-用do-while语句控制P0口8位LED流水点亮291-用字符型数组控制P0口8位LED流水点亮292-用P0口显示字符串常量293-用P0 口显示指针运算结果294-用指针数组控制P0口8位LED流水点亮295-用数组的指针控制P0 口8 位LED流水点亮296-用P0 、P1口显示整型函数返回值297-用有参函数控制P0口8位LED流水速度298-用数组作函数参数控制流水花样299-用数组作函数参数控制流水花样3-IO输出-点亮多个LED灯方法130-9累减300-用函数型指针控制P1口灯花样301-用指针数组作为函数的参数显示多个字符串302-字符函数ctype.h应用举例303-内部函数intrins.h应用举例304-标准函数stdlib.h应用举例305-字符串函数string.h应用举例306-宏定义应用举例307-文件包应用举例308-条件编译应用举例309-用定时器T0查询方式P2口8位控制LED闪烁31-99累减310-用定时器T1查询方式控制单片机发出1KHz音频311-将计数器T0计数的结果送P1口8位LED显示311-用定时器T0的中断控制1位LED闪烁312-用定时器T0的中断实现长时间定时313-用定时器T1中断控制两个LED以不同周期闪烁314-用计数器T1的中断控制蜂鸣器发出1KHz音频315-用定时器T0的中断实现渴望主题曲的播放316-输出50个矩形脉冲317-输出正脉宽为250微秒的方波318-用定时器T0控制输出高低宽度不同的矩形波319-用外中断0的中断方式进行数据采集32-999累减320-输出负脉宽为200微秒的方波321-方式0控制流水灯循环点亮322-数据发送程序323-数据接收程序324-单片机向PC发送数据325-单片机接收PC发出的数据326-用LED数码显示数字5327-用LED数码显示器循环显示数字0~9328-用数码管慢速动态扫描显示数字1234329-用LED数码显示器伪静态显示数字123433-9999累减330-用数码管显示动态检测结果331-数码秒表设计332-数码时钟设计333-用LED数码管显示计数器T0的计数值334-静态显示数字“59”335-无软件消抖的独立式键盘输入实验336-软件消抖的独立式键盘输入实验337-CPU控制的独立式键盘扫描实验338-定时器中断控制的独立式键盘扫描实验339-独立式键盘控制的4级变速流水灯34-显示小数点340-独立式键盘的按键功能扩展:以一当四341-独立式键盘调时的数码时钟实验342-独立式键盘控制步进电机实验343-矩阵式键盘按键值的数码管显示实验344-矩阵式键盘按键音345-简易电子琴346-矩阵式键盘实现的电子密码锁347-用LCD显示字符'A'348-用LCD循环右移显示Welcome to China 349-将数据0x0f写入AT24C02再读出送P1口显示35-数码管消隐350-液晶时钟设计36-数码管递加递减带消隐37-数码管左移38-数码管右移38-数码管右移139-数码管右移24-IO输出-点亮多个LED灯方法240-数码管循环左移41-数码管循环右移41-数码管循环右移142-数码管循环右移243-数码管闪烁44-数码管局部闪烁45-定时器046-定时器147-定时器248-产生1mS方波49-产生200mS方波5-闪烁1个LED50-产生多路不同频率方波51-1个独立按键控制LED52-1个独立按键控制LED状态转换53-2按键加减操作53-2按键加减操作数码管显示54-多位数按键加减(闪烁)54-多位数按键加减(闪烁)数码管显示55-多位数按键加减(不闪烁)55-多位数按键加减(不闪烁)数码管显示56-定时器扫描数码管(不闪烁)57-按键长按短按效果58-抢答器59-独立按键依次输入数据6-不同频率闪烁1个LED灯60-按键从右至左输入61-8位端口检测8独立按键62-矩阵键盘行列扫描63-矩阵键盘反转扫描64-矩阵键盘中断扫描65-矩阵键盘密码锁66-矩阵键盘简易计算器67-外部中断0电平触发68-外部中断1电平触发69-外部中断0下降沿触发7-不同频率闪烁多个LED灯70-外部中断1下降沿触发71-T0外部计数输入72-T1外部计数输入73-看门狗溢出测试74-按键喂狗75-喇叭发声原理76-警车声音77-救护车声音78-喇叭滴答声79-报警发声8-8位LED左移80-消防车警报81-音乐播放82-步进电机转动原理83-步进电机正反转84-步进电机按键控制85-步进电机转速数码管显示86-双步进电机综合控制86-步进电机调速原理87-双步进电机综合控制87-步进电机综合控制87-步进电机调速原理88-直流电机按键控制89-直流电机调速控制9-8位LED右移90-继电器控制原理91-双继电器模拟洗衣机电机控制92-1602液晶静态显示93-1602液晶动态显示94-1602液晶滚动显示95-1602液晶移动显示96-1602液晶按键输入显示97-2402存储1个数据98-24c02存储多个数据99-24c02存储花样流水灯。
51单片机应用开发案例精选

1.发光二极管流水灯2.交通灯控制器3.单片机演奏音乐4.液晶显示复杂自制图形5.电子万年历6.实时时钟(年月日时分秒,含定时计时)7.液晶显示字符(PC计算发送)8.四路抢答器9.数字化语音存储与回放(低频)10.数字温度传感器11.宽带数控放大器12.超声波测距13.基于单片机的电压表设计14.基于单片机的称重显示仪表设计15.基于单片机的车轮测速系统16.步进电机控制17.控制微型打印机18.简易智能电动车19.多种模型发生器20.相位差测试仪21.简易红外遥控器或红外通信22.PC与单片机通信23.单片机间多机通信24.无线数据传输25.单片机实现PWM信号26.低频信号频谱分析仪27.单片机USB接口28.单片机实现TCP/IP29.单片机读写U盘30.高精度实时时钟芯片的应用31.SD卡读写32.LED数码管点阵显示(支持显示10个汉字)33.低频数字示波器34.频率计35.GPS系统设计(实现GPS模块接口,获取当前定位信息)36.I2C接口(实现串行EEPROM读写)37.键盘扩展(增加16个按键,实现队按键的控制)38.条形码应用51单片机应用开发案例精选第1章51单片机开发基础1.1单片机开发流程1.2开发工具1.3测试方法和工具第2章51单片机开发入门实例2.1点亮发光二极管实例2.2跑马灯实例2.3流水灯实例2.4查0~9平方表实例2.5受控输出实例2.6比较输入数大小实例2.7交通灯控制器实例2.8蜂鸣器发音实例2.9单片机演奏音乐实例2.10软件陷阱实例第3章输入和显示3.1独立式键盘输入实例3.2行列式键盘输入实例3.3扫描方式键盘输入实例3.4定时中断方式键盘输入实例3.5LED静态显示实例3.6LED动态显示实例3.7实时时钟实例3.8简单液晶显示实例3.9液晶显示复杂自制图形实例3.10电子万年历实例第4章数据采集第5章数据通信第6章全球定位系统的设计与开发51单片机应用开发范例大全第1章单片机C语言开发基础1.1 MCS-51单片机硬件基础1.1.1 8051引脚1.1.2 51单片机功能结构1.1.3 中央处理器(CPU)1.1.4 存储器结构1.1.5 定时/计数器1.1.6 并行端口1.1.7 串行端口1.1.8 中断系统1.1.9 总线1.2 Keil mVision21.2.1 Keil mVision2集成开发环境介绍1.2.2 使用Keil mVision2进行开发1.2.3 dScope for Windows的使用1.3 C51基础知识1.3.1 C51控制语句1.3.2 C51函数1.3.3 C51数组和指针1.4 【实例19】P1口控制直流电动机实例第2章单片机接口的扩展2.1 基本器件实现端口扩展实例2.1.1 【实例20】用74LS165实现串口扩展并行输入口2.1.2 【实例21】用74LS164实现串口扩展并行输出口2.1.3 【实例22】P0 I/O扩展并行输入口2.1.4 【实例23】P0 I/O扩展并行输出口2.2 扩展芯片实现端口扩展2.2.1 【实例24】用8243扩展I/O端口2.2.2 【实例25】用8255A扩展I/O口2.2.3 【实例26】用8155扩展I/O口2.3 CPLD实现端口扩展第3章存储器的扩展3.1 外部程序存储器的扩展3.1.1 【实例27】EPROM27xxx程序存储器的扩展3.1.2 【实例28】EEPROM28xxx程序存储器的扩展3.2 外部数据存储器的扩展3.2.1 【实例29】与AT24系列EEPROM接口及驱动程序3.2.2 【实例30】EEPROM(X5045)接口及驱动程序3.2.3 【实例31】铁电存储器接口及驱动程序3.2.4 【实例32】与双口RAM存储器接口及应用实例3.3 FLASH驱动程序第4章输入/输出及显示技术4.1 【实例34】独立键盘控制4.1.1 实例功能4.1.2 典型器件介绍4.1.3 硬件设计4.1.4 程序设计4.1.5 经验总结4.2 【实例35】矩阵式键盘控制4.2.1 实例功能4.2.2 典型器件介绍4.2.3 硬件设计4.2.4 程序设计4.2.5 经验总结4.3 【实例36】改进型I/O端口键盘4.3.1 实例功能4.3.2 硬件设计4.3.3 程序设计4.4 【实例37】PS/2键盘的控制4.4.1 实例功能4.4.2 典型器件介绍4.4.3 硬件设计4.4.4 程序设计4.4.5 经验总结4.5 【实例38】LED显示4.5.1 实例功能4.5.2 硬件设计4.5.3 程序设计4.5.4 经验总结4.6 【实例39】段数码管显示实例4.6.1 实例功能4.6.2 硬件设计4.6.3 程序设计4.6.4 经验总结4.7 【实例40】16×2字符型液晶显示实例4.7.1 实例功能4.7.2 典型器件介绍4.7.3 硬件设计4.7.4 程序设计4.7.5 经验总结4.8 【实例41】点阵型液晶显示实例4.8.1 实例功能4.8.2 典型器件介绍4.8.3 硬件设计4.8.4 程序设计4.8.5 经验总结4.9 【实例42】LCD显示图片实例4.9.1 实例功能4.9.2 典型器件介绍4.9.3 硬件设计4.9.4 程序设计4.9.5 经验总结第5章实用电子制作5.1 【实例43】简易电子琴的设计5.1.1 实例功能5.1.2 典型器件介绍5.1.3 硬件设计5.1.4 程序设计5.1.5 经验总结5.2 【实例44】基于MCS-51单片机的四路抢答器5.2.1 实例功能5.2.2 典型器件介绍5.2.3 硬件设计5.2.4 程序设计5.2.5 经验总结5.3 【实例45】电子调光灯的制作5.3.1 实例功能5.3.2 典型器件介绍5.3.3 硬件设计5.3.4 程序设计5.3.5 经验总结5.4 【实例46】数码管时钟的制作5.4.1 实例功能5.4.2 典型器件介绍5.4.3 硬件设计5.4.4 程序设计5.4.5 经验总结5.5 【实例47】LCD时钟的制作5.5.1实例功能5.5.2典型器件介绍5.5.3硬件设计5.5.4程序设计5.5.5经验总结5.6 【实例48】数字化语音存储与回放5.6.1 实例功能5.6.2 典型器件介绍5.6.3 硬件设计5.6.4 程序设计5.6.5 经验总结5.7 【实例49】电子标签设计5.7.1 实例功能5.7.2 典型器件介绍5.7.3 硬件设计5.7.4 程序设计5.7.5 经验总结第6章传感控制技术6.1 【实例50】指纹识别模块6.1.1 指纹识别传感器原理6.1.2 硬件设计6.1.3 程序设计6.1.4 实例实现过程6.1.5 经验总结6.2 【实例51】数字温度传感器6.2.1 数字温度传感器原理6.2.2 硬件设计6.2.3 程序设计6.2.4 实例实现过程6.2.5 经验总结6.3 【实例52】宽带数控放大器6.3.1 宽带数控放大器设计原理6.3.2 硬件设计6.3.3 程序设计6.3.4 实例实现过程6.3.5 经验总结第7章智能仪表与测试技术7.1 【实例53】超声波测距7.1.1 实例功能7.1.2 典型器件介绍7.1.3 硬件设计7.1.4 程序设计7.1.5 经验总结7.2 【实例54】数字气压计7.2.1 实例功能7.2.2 典型器件介绍7.2.3 硬件设计7.2.4 程序设计7.2.5 经验总结7.3 【实例55】基于单片机的电压表设计7.3.1 实例功能7.3.2 电压表设计原理7.3.3 硬件设计7.3.4 程序设计7.3.5 经验总结7.4 【实例56】基于单片机的称重显示仪表设计7.4.1 实例功能7.4.2 典型器件介绍7.4.3 硬件设计7.4.4 程序设计7.4.5 经验总结7.5 【实例57】基于单片机的车轮测速系统7.5.1 实例功能7.5.2 典型器件介绍7.5.3 硬件设计7.5.4 程序设计7.5.5 经验总结第8章电气传动及控制技术8.1 【实例58】电源切换控制8.1.1 实例功能8.1.2 典型器件介绍8.1.3 硬件设计8.1.4 程序设计8.1.5 经验总结8.2 【实例59】步进电机控制8.2.1 实例功能8.2.2 典型器件介绍8.2.3 硬件设计8.2.4 程序设计8.2.5 经验总结8.3 【实例60】单片机控制自动门系统8.3.1 实例功能8.3.2 典型器件介绍8.3.3 硬件设计8.3.4 程序设计8.3.5 经验总结8.4 【实例61】控制微型打印机8.4.1 实例功能8.4.2 典型器件介绍8.4.3 硬件设计8.4.4 程序设计8.4.5 经验总结8.5 【实例62】单片机控制的EPSON微型打印头8.5.1 实例功能8.5.2 典型器件介绍8.5.3 硬件设计8.5.4 程序设计8.5.5 经验总结8.6 【实例63】简易智能电动车8.6.1 实例功能8.6.2 典型器件介绍8.6.3 硬件设计8.6.4 程序设计8.6.5 经验总结8.7 【实例64】洗衣机控制器8.7.1 实例功能8.7.2 典型器件介绍8.7.3 硬件设计8.7.4 程序设计8.7.5 经验总结第9章单片机数据处理9.1 【实例65】串行A/D转换9.1.1 实例功能9.1.2 典型器件介绍9.1.3 硬件设计9.1.4 程序设计9.1.5 经验总结9.2 【实例66】并行A/D转换9.2.1 实例功能9.2.2 典型器件介绍9.2.3 硬件设计9.2.4 程序设计9.2.5 经验总结9.3 【实例67】模拟比较器实现A/D转换9.3.1 实例功能9.3.2 典型器件介绍9.3.3 硬件设计9.3.4 程序设计9.3.5 经验总结9.4 【实例68】串行D/A转换9.4.1 实例功能9.4.2 典型器件介绍9.4.3 硬件设计9.4.4 程序设计9.4.5 经验总结9.5 【实例69】并行电压型D/A转换9.5.1 实例功能9.5.2 典型器件介绍9.5.3 硬件设计9.5.4 程序设计9.5.5 经验总结9.6 【实例70】并行电流型D/A转换9.6.1 实例功能9.6.2 典型器件介绍9.6.3 硬件设计9.6.4 程序设计9.6.5 经验总结9.7 【实例71】I2C接口的A/D转换9.7.1 实例功能9.7.2 典型器件介绍9.7.3 硬件设计9.7.4 程序设计9.7.5 经验总结9.8 【实例72】I2C接口的D/A转换9.8.1 实例功能9.8.2 典型器件介绍9.8.3 硬件设计9.8.4 程序设计9.8.5 经验总结第10章单片机通信技术10.1 【实例73】单片机间通信10.1.1 实例功能10.1.2 典型器件介绍10.1.3 硬件设计10.1.4 程序设计10.1.5 经验总结10.2 【实例74】单片机间多机通信方法之一10.2.1 主从通信介绍10.2.2 实例功能10.2.3 硬件设计10.2.4 程序设计10.2.5 经验总结10.3 【实例75】单片机间多机通信方法之二10.3.1 实例功能10.3.2 程序设计10.3.3 经验总结10.4 【实例76】PC与单片机通信10.4.1 实例功能10.4.2 典型器件介绍10.4.3 硬件设计10.4.4 程序设计10.4.5 经验总结10.5 【实例77】红外通信接口10.5.1 实例功能10.5.2 典型器件介绍10.5.3 硬件设计10.5.4 程序设计10.5.5 经验总结10.6 【实例78】无线数据传输模块10.6.1 实例功能10.6.2 典型器件介绍10.6.3 硬件设计10.6.4 程序设计10.6.5 经验总结第11章单片机实现信号与算法11.1 【实例79】单片机实现PWM信号输出11.1.1 实例功能11.1.2 典型器件介绍11.1.3 硬件设计11.1.4 程序设计11.1.5 经验总结11.2 【实例80】实现基于单片机的低频信号发生器11.2.1 实例功能11.2.2 典型器件介绍11.2.3 硬件设计11.2.4 程序代码11.2.5 经验总结11.3 【实例81】软件滤波方法11.3.1 实例功能11.3.2 软件滤波方法介绍11.3.3 程序设计11.3.4 经验总结11.4 【实例82】FSK信号解码接收11.4.1 实例功能11.4.2 FSK原理11.4.3 程序设计11.4.4 经验总结11.5 【实例83】单片机浮点数运算实现11.5.1 实例功能11.5.2 单片机浮点数运算实现原理11.5.3 程序设计11.5.4 经验总结11.6 【实例84】神经网络在单片机中的实现11.6.1 实例功能11.6.2 神经网络简介11.6.3 程序设计11.6.4 经验总结11.7 【实例85】信号数据的FFT变换11.7.1 实例功能11.7.2 FFT变换介绍11.7.3 程序设计11.7.4 经验总结第12章单片机的总线与网络技术12.1 【实例86】I2C总线接口的软件实现12.1.1 实例功能12.1.2 典型器件介绍12.1.3 程序设计12.1.4 经验总结12.2 【实例87】SPI总线接口的软件实现12.2.1 实例功能12.2.2 典型器件介绍12.2.3 硬件设计12.2.4 经验总结12.3 【实例88】1-WIRE总线接口的软件实现12.3.1 1-WIRE总线通信原理12.3.2 硬件设计12.3.3 程序设计12.3.4 经验总结12.4 【实例89】单片机外挂CAN总线接口12.4.1 CAN总线介绍12.4.2 CAN总线接口12.4.3 程序设计12.4.4 经验总结12.5 【实例90】单片机外挂USB总线接口12.5.1 USB总线原理12.5.2 与单片机的硬件接口12.5.3 程序设计12.5.4 经验总结12.6 【实例91】单片机实现以太网接口12.6.1 以太网接口芯片12.6.2 程序设计12.6.3 经验总结12.7 【实例92】单片机控制GPRS传输12.7.1 典型器件介绍12.7.2 硬件设计12.7.3 程序设计12.7.4 经验总结12.8 【实例93】单片机实现TCP/IP协议12.8.1 TCP/IP原理12.8.2 程序设计12.8.3 经验总结第13章典型器件及应用技术13.1 【实例94】读写U盘13.1.1 实例功能13.1.2 典型器件介绍13.1.3 硬件设计13.1.4 程序设计13.1.5 经验总结13.2 【实例95】非接触IC卡读写13.2.1 实例功能13.2.2 典型器件介绍13.2.3 硬件设计13.2.4 程序设计13.2.5 经验总结13.3 【实例96】SD卡读写13.3.1 实例功能13.3.2 典型器件介绍13.3.3 硬件设计13.3.4 程序设计13.3.5 经验总结13.4 【实例97】高精度实时时钟芯片的应用13.4.1 实例功能13.4.2 典型器件介绍13.4.3 硬件电路设计13.4.4 程序设计13.4.5 经验总结第14章综合应用实例14.1 【实例98】智能手机充电器设计14.1.1 智能手机电池充电器的结构组成14.1.2 智能手机电池充电器的硬件电路设计14.1.3 智能手机电池充电器的软件设计14.1.4 经验总结14.2 【实例99】单片机控制门禁系统14.2.1 门禁系统的结构组成14.2.2 门禁系统的硬件电路设计14.2.3 门禁系统的软件设计14.2.4 经验总结14.3 【实例100】电机保护器的设计14.3.1 电机保护器的结构组成14.3.2 电机保护器的硬件电路设计14.3.3 电机保护器的软件设计14.3.4 设计中的几个关键问题14.3.5 经验总结附录1 8051的指令列表附录2 PS/2键盘键值和符号对照表51单片机应用开发实战手册第1章 MCS-51单片机基础1.1 概述1.2 MCS-51单片机硬件结构1.2.1 MCS-51单片机的基本组成1.2.2 AT89S52单片机的引脚图及各引脚功能说明1.3 MCS-51单片机的复位1.4 MCS-51的存储系统1.4.1 MCS-51程序存储器1.4.2 MCS-51数据存储器1.4.3 特殊功能寄存器(SFR)1.5 MCS-51的中断系统1.5.1 MCS-51的中断源1.5.2 MCS-51的中断请求标志1.5.3 MCS-51的中断控制1.5.4 MCS-51的中断处理过程第2章51单片机软硬件开发环境2.1 硬件开发环境的建立2.1.1 Protel 99SE2.1.2 开发工具的选择2.1.3 硬件开发所需仪器2.2 软件开发环境的建立2.2.1 系统概述2.2.2 Keil C51单片机软件开发系统的整体结构2.2.3 Keil C51 的使用2.3 Keil C51+ Proteus 实现单片机的软件仿真……第3章单片机应用系统设计的必备知识第4章简单应用系统设计案例——I/O使用第5章简单应用系统设计案例——定时器和中断使用第6章简单应用系统设计——串行通信类第7章简单应用系统设计——控制类第8章综合应用系统设计案例——基础篇第9章综合应用系统设计案例——提高篇第10章综合应用系统设计案例——实践篇。
51单片机C程序设计100例

《单片机 C 语言程序设计实训 100 例---基于 8051 和 PROTEUS 仿真》案例
//延时 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_形成来回滚动的效果
名称:LED 模拟交通灯 说明:东西向绿灯亮若干秒,黄 灯闪烁 5 次后红灯亮, 红灯亮后,南 北向由红灯变为绿灯,若干秒后南北 向黄灯闪烁 5 此后变红灯,东西向变 绿灯,如此重复。 */ #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit RED_A=P0^0; //东西向灯 sbit YELLOW_A=P0^1; sbit GREEN_A=P0^2; sbit RED_B=P0^3; //南北向灯 sbit YELLOW_B=P0^4; sbit GREEN_B=P0^5; uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量
2 上海师范大学信息与机电工程学院—倪继锋
《单片机 C 语言程序设计实训 100 例---基于 8051 和 PROTEUS 仿真》案例
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 /* 花样流水灯
51单片机50个实例代码

51单片机50个例程代码程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5修改:无内容:点亮P1口的一个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED=P1^0;// 用sbit 关键字定义LED到P1.0端口,//LED是自己任意定义且容易记忆的符号/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值LED=1; //将P1.0口赋值1,对外输出高电平LED=0; //将P1.0口赋值0,对外输出低电平while (1) //主循环{//主循环中添加其他需要一直工作的程序}}2-IO输出-点亮1个LED灯方法2/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5修改:无内容:点亮P1口的一个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用1个字节对单个端口赋值P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉,//ff换算成二进制是1111 1111P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮//0xfe是16进制,0x开头表示16进制数,//fe换算成二进制是1111 1110while (1) //主循环{//主循环中添加其他需要一直工作的程序}}3-IO输出-点亮多个LED灯方法1/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5修改:无内容:点亮P1口的多个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义LED到P1.0端口,sbit LED1=P1^1;//LED是自己任意定义且容易记忆的符号sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值LED0=0; //将P1.0口赋值0,对外输出低电平LED1=1;LED2=0;LED3=1;LED4=0;LED5=1;LED6=0;LED7=1;while (1) //主循环{//主循环中添加其他需要一直工作的程序}}4-IO输出-点亮多个LED灯方法2/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5修改:无内容:点亮P1口的多个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值P1=0x55; //换成二进制是0101 0101while (1) //主循环{//主循环中添加其他需要一直工作的程序}}5-闪烁1个LED/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5修改:无内容:点亮P1口的1个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义LED到P1.0端口,//LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值while (1) //主循环{LED0=0; //将P1.0口赋值0,对外输出低电平Delay(10000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值1,对外输出高电平Delay(10000);//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}6-不同频率闪烁1个LED灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5修改:无内容:点亮P1口的1个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义LED到P1.0端口,//LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255while (1) //主循环{for(i=0;i<10;i++) //加入for循环,表明for循环大括号中的程序循环执行10次{LED0=0; //将P1.0口赋值0,对外输出低电平Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值1,对外输出高电平Delay(5000);}for(i=0;i<10;i++){LED0=0; //将P1.0口赋值0,对外输出低电平Delay(60000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值1,对外输出高电平Delay(60000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}7-不同频率闪烁多个LED灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5修改:无内容:点亮P1口的多个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义LED到P1.0端口,LED是自己任意定义且容易记忆的符号sbit LED1=P1^1;sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255while (1) //主循环{for(i=0;i<10;i++) //加入for循环,表明for循环大括号中//的程序循环执行10次{LED0=0; //将P1.0口赋值0,对外输出低电平LED2=1;LED4=0;Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值1,对外输出高电平LED2=0;LED4=1;Delay(5000);}for(i=0;i<10;i++){LED0=0; //将P1.0口赋值0,对外输出低电平LED2=1;LED4=0;Delay(60000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值1,对外输出高电平LED2=0;LED4=1;Delay(60000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}8-8位LED左移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5修改:无内容:左移,直至LED全部点亮,左移符号<<------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255Delay(50000);P1=0xfe; //赋初始值for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1<<=1;}while (1) //主循环{//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}9-8位LED右移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5修改:无内容:右移,直至LED全部点亮,右移符号>>------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255Delay(50000);P1=0x7f; //赋初始值for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1>>=1;}while (1) //主循环{//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}10-LED循环左移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5修改:无内容:循环左移,始终一个led点亮,并循环执行流水动作,左移符号<< 逻辑或符号|------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255Delay(50000);P1=0xfe; //赋初始值while (1) //主循环{for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1<<=1;P1=P1|0x01; //左移后,最右端自动赋值0,所以需要该语句赋值1}P1=0xfe; //重新赋初始值//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}11-LED循环右移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5修改:无内容:循环右移,始终一个led点亮,并循环执行流水动作,右移符号>> 逻辑或符号|------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255Delay(50000);P1=0x7f; //赋初始值while (1) , //主循环{for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1>>=1;P1=P1|0x80; //右移后,最左端自动赋值0,所以需要该语句赋值1}P1=0x7f; //重新赋初始值//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}12-查表显示LED灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5修改:无内容:通过查表获得1个字节的值然后赋值给P1端口,ROM允许情况可以设置更多表格------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------查表表格------------------------------------------------*/unsigned char code table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0x00,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加/*------------------------------------------------函数声明------------------------------------------------*/void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255while (1) //主循环{for(i=0;i<16;i++) //加入for循环,表明for循环大括号中的程序循环//执行16次,表明表格中有16个元素{P1=table[i];Delay(30000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}13-双灯左移右移闪烁/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5修改:无内容:2个led灯先左移,然后右移,然后同时闪烁------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i//取值范围0~255unsigned char temp;//定义临时变量用于转换while (1) //主循环{temp=0xfc;P1=temp;for(i=0;i<7;i++) //加入for循环,表明for循环大括号//中的程序循环执行7次{Delay(50000); //调用延时程序;更改延时数字可//以更改延时长度;用于改变闪烁频率temp<<=1;temp=temp|0x01; //也可以直接把temp换成P1P1=temp; //之所以加入temp做中间变量,转换//完成后直接赋值到端口,防止直接//操作端口造成的短暂闪烁}temp=0x3f;P1=temp;for(i=0;i<7;i++) //加入for循环,表明for循环大括号//中的程序循环执行7次{Delay(50000); //调用延时程序;更改延时数字可以//更改延时长度;用于改变闪烁频率temp>>=1;temp|=0x80; //等效于temp=temp|0x80P1=temp;}for(i=0;i<3;i++) //加入for循环,表明for循环大括号//中的程序循环执行3次{P1=0xff;Delay(50000);P1=0x00;Delay(50000);} //主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}14-花样灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:2009.5内容:花样灯一般有两种方法实现:1、程序循环执行2、查表法这里我们两种都使用一下------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------花样表格------------------------------------------------*/unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0x00,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/main(){unsigned char i; //定义一个无符号字符型//局部变量i 取值范围0~255while(1){P1=0xFE; //第1个LED亮for(i=0;i<8;i++){Delay(20000);P1 <<=1;}P1=0x7F; //第8个LED亮for(i=0;i<8;i++){Delay(20000);P1 >>=1;}P1=0xFE; //第1个LED亮for(i=0;i<8;i++)Delay(20000);P1 <<=1;P1 |=0x01;}P1=0x7F; //第8个LED亮for(i=0;i<8;i++){Delay(20000);P1 >>=1;P1 |=0x80;}//下面通过查表方法获得花样参数for(i=0;i<16;i++)//查表可以简单的显示各种花样实用性更强{Delay(20000);P1=seg[i];}}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}15-PWM调光/*-----------------------------------------------名称:PWM调光论坛:编写:shifang日期:2009.5修改:无内容:通过PWM(脉宽调制)调节LED的亮度#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义LED到P1.0端口,LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值while (1) //主循环{LED0=1;Delay(60000); //特意加延时,可以看到熄灭的过程for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){ //PWM_LOW表示低//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次LED0=0; //点亮LEDDelay(PWM_LOW);//延时长度,600次循环中从1加至599LED0=1; //熄灭LEDDelay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1}LED0=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //与逐渐变亮相反的过程LED0=0;Delay(PWM_LOW);LED0=1;Delay(CYCLE-PWM_LOW);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535void Delay(unsigned int t){while(--t);}16-共阳数码管静态显示/*-----------------------------------------------名称:单个共阳数码管静态显示论坛:编写:shifang日期:2009.5修改:无内容:通过赋值给P1,让数码管显示特定的字符或者数字------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义void main (void){P1=0xc0; //二进制为1100 0000 参考数码管排列,//可以得出0对应的段点亮,1对应的段熄灭,结果显示数字"0"while(1){}}17-1个共阳数码管显示变化数字/*-----------------------------------------------名称:单个共阳数码管动态显示变化数字论坛:编写:shifang日期:2009.5修改:无内容:通过循环赋值给P1,让数码管显示特定的字符或者数字------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义unsigned char code dofly_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x77,0x7c,0x39,0x5e,0x 79,0x71,};// 显示数值表0-9void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255while (1) //主循环{for(i=0;i<16;i++) //加入for循环,表明for循环大括号中的程序循环执行10次{P1=dofly_table[i]; //循环调用表中的数值Delay(60000); //延时,方便观看数字变化}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}18-单个数码管模拟水流/*-----------------------------------------------名称:单个共阳数码管模拟水流论坛:编写:shifang日期:2009.5修改:无内容:通过循环赋值给P1,让数码管显示特定流动样式------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255while (1) //主循环{P1=0xfe;for(i=0;i<6;i++) //加入for循环,表明for循环大括号中的程序循环执行6次{Delay(10000);P1<<=1;P1|=0x01;}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}19-按键控制单个数码管显示/*-----------------------------------------------名称:单个共阳数码管动态显示变化数字论坛:编写:shifang日期:2009.5修改:无内容:通过循环检测P1口按键输入值,然后用数码管输出,没有按键按下时原值不变------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义unsigned char code dofly_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};// 显示数值表0-9/*------------------------------------------------主函数------------------------------------------------*/void main (void){while (1) //主循环{switch(P3) //P3口作为独立按键输入端,检测端口电平并做如下判断{case 0xfe:P1=dofly_table[1];break;//0xfe = 1111 1110,//说明连接在P3.0端口的按键被按下,显示对应的数字然后跳出循环case 0xfd:P1=dofly_table[2];break;//调用表中的第三个//元素0xa4 下标0 才表示数组中的第一个元素case 0xfb:P1=dofly_table[3];break;case 0xf7:P1=dofly_table[4];break;case 0xef:P1=dofly_table[5];break;case 0xdf:P1=dofly_table[6];break;case 0xbf:P1=dofly_table[7];break;case 0x7f:P1=dofly_table[8];break;default:break; //如果都没按下,直接跳出}//主循环中添加其他需要一直工作的程序}}20-单个数码管指示逻辑电平/*-----------------------------------------------名称:单个共阳数码管指示逻辑电平论坛:编写:shifang日期:2009.5修改:无内容:通过循环检测P3.2口电平输入值,然后用数码管输出"H" or "L",表示该端口现在连接的是高电平还是低电平------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit IO_IN=P3^2; //定义IO 信号输入端/*------------------------------------------------主函数------------------------------------------------*/void main (void){while (1) //主循环{if(IO_IN==1)//如果端口检测到1表示高电平P1=0x89; //"H"elseP1=0xc7; //"L"//否则表示低电平,这里使用条件语句if 。
51单片机应用实例及源代码 推荐1

1.闪烁灯1.实验任务如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。
2.电路原理图图4.1.13.系统板上硬件连线把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。
4.程序设计内容(1).延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒MOV R6,#20 2个 2D1: MOV R7,#248 2个 2 2+2×248=498 20× DJNZ R7,$ 2个2×248 (498DJNZ R6,D1 2个2×20=4010002因此,上面的延时程序时间为10.002ms。
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。
如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5.程序框图如图4.1.2所示图4.1.26.汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void) {while(1){L1=0;delay02s();L1=1;delay02s();}2.模拟开关灯1.实验任务如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。
51单片机C语言应用程序实例精讲

CSA=1;
CSB=0;
RW=1;
DI=0;
do {ACC=LCD;} while (busy_bit);//wait for lcd not busy
WriteWord (DecodeMode,DecodeDigit); //设置译码模式
WriteWord (Intensity,IntensityGrade); //设置亮度
WriteWord (ShutDown,NormalOperation); //设置为正常工作模式
}
/*主函数*/
void main(void)
void display(void)
{
uchar i;
switch (digbit)
{
case 1:i=0;break;
case 2:i=1;break;
case 4:i=2;break;
case 8:i=3;break;
default:break;
}
DIGPORT = 0;//关闭显示
WORDPORT = getcode(wordbuf[i]);//送字型码
case 12: p=0x39;break;/* C */
case 13: p=0x5E;break;/* D */
case 14: p=0x79;break;/* E */
case 15: p=0x71;break;/* F */
default:break;
}
return(p);
}
/*显示函数*/
{
uchar i,temp;
_nop_();
for (i=0;i<8;i++)
{
temp=ch&0x80;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void delay02s(void)
{
unsigned char i;
for(i=20;i>0;i--)
{delay10ms();
}
}
void main(void)
{ while(1)
{ if(P3_7==0)
{delay10ms();
if(P3_7==0)
{
ID++;
if(ID==4)
{
ID=0;
(2. 输出控制
根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB 和CLR 指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。
5. 程序流程
读P1口数据到A CC 中
A CC 内容右移4次
A CC 内容与F0H相或
A CC 内容送入P1口
6. 方法一(汇编源程序)
MOV KEYBUF,#3
LJMP DK1
NK4: NOP
DK1:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
DK1A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK1A
NOKEY1:
MOV P3,#0FFH
CLR
MOV A,P3
MOV KEYBUF,#5
LJMP DK2
NK6: CJNE A,#0BH,NK7
MOV KEYBUF,#6
LJMP DK2
NK7: CJNE A,#07H,NK8
MOV KEYBUF,#7
LJMP DK2
NK8: NOP
DK2:
MOV A,KEYBUF
每次送出的数据是不同,具体的数据如下表1所示
说明
L8
L7
L6
L5
L4
L3
L2
L1
1
1
1
1
1
1
1
0
L1亮
1
1
1
1
1
1
0
1
L2亮
1
1
1
1
1
0
1
1
L3亮
1
1
1
1
0
1
1
1
L4亮
1
1
1
0
1
1
1
1
L5亮
1
1
0
1
1
1
1
1
L6亮
1
0
1
1
1
1
1
1
L7亮
0
1
1
1
1
1
1
1
L8亮
表1
5. 程序框图
图
6. 汇编源程序
ORG 0
SJMP START
IS2: CJNE A,#03H,IS3
CPL L4
LCALL DELAY
SJMP START
IS3: LJMP START
DELAY10MS: MOV R6,#20
LOOP1: MOV R7,#248
DJNZ R7,$
DJNZ R6,LOOP1
RET
DELAY: MOV R5,#20
(2. 把“单片机系统”区域中的AD0-AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:AD0对应着a,AD1对应着b,……,AD7对应着h。
4. 程序设计内容
(1. 4×4矩阵键盘识别处理
(2. 每个按键有它的行值和列值 ,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
ORG 00H
START: MOV A,P1
ANL A,#0F0H
RR A
RR A
RR A
RR A
XOR A,#0F0H
MOV P1,A
SJMP START
END
7. 方法一(C语言源程序)
#include
unsigned char temp;
void main(void)
{
while(1)
{
temp=P1>>4;
5. 程序框图
图
6. 汇编源程序
KEYBUF EQU 30H
ORG 00H
START: MOV KEYBUF,#2
WAIT:
MOV P3,#0FFH
CLR
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
7. C语言源程序
#include
unsigned char i;
unsigned char temp;
unsigned char a,b;
void delay(void)
MCS 51单片机应用程序实例
2007年10月25日工控吧-
多路开关状态指示
1. 实验任务
如图所示,AT89S51单片机的-接四个发光二极管L1-L4,-接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。
2. 电路原理图
图
3. 系统板上硬件连线
{
unsigned char m,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
void main(void)
{
while(1)
{
temp=0xfe;
P1=temp;
delay();
for(i=1;i<8;i++)
{
a=temp<
5.程序框图
图
6. 汇编源程序
ID EQU 30H
SP1 BIT P3.7
L1 BIT P1.0
L2 BIT P1.1
L3 BIT P1.2
L4 BIT
ORG 0
MOV ID,#00H
START: JB K1,REL
LCALL DELAY10MSJB 来自1,RELINC ID
MOV A,ID
CJNE A,#04,REL
(2. 设计方法
从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID=0;当L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。下面给出有关程序设计的框图。
(1. 把“单片机系统”区域中的-用导线连接到“八路发光二极管指示模块”区域中的L1-L4端口上;
(2. 把“单片机系统”区域中的-用导线连接到“四路拨动开关”区域中的K1-K4端口上;
4. 程序设计内容
(1. 开关状态检测
对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB ,REL或JNB ,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。
{
P1_1=0;
}
else
{
P1_1=1;
}
if(P1_6==0)
{
P1_2=0;
}
else
{
P1_2=1;
}
if(P1_7==0)
{
P1_3=0;
}
else
{
P1_3=1;
}
}
}
广告灯的左移右移
1. 实验任务
做单一灯的左移右移,硬件电路如图所示,八个发光二极管L1-L8分别接在单片机的-接口上,输出“0”时,发光二极管亮,开始时→→→→┅→→→┅→亮,重复循环。
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK5
MOV KEYBUF,#4
LJMP DK2
NK5: CJNE A,#0DH,NK6
2.电路原理图
图
3.系统板上硬件连线
(1. 把“单片机系统”区域中的RD端口连接到“独立式键盘”区域中的SP1端口上;
(2. 把“单片机系统”区域中的-端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,连接到L1,连接到L2,连接到L3,连接到L4上。
4.程序设计方法
START: MOV R2,#8
MOV A,#0FEH