单片机流程图

合集下载

51单片机密码锁制作的程序和流程图

51单片机密码锁制作的程序和流程图

51单片机密码锁制作的程序和流程图(很详细) 一、基本组成:单片机小系统+4*4矩阵键盘+1602显示+DC电机基本电路:键盘和和显示键盘接P1口,液晶的电源的开、关通过P2.7口控制电机(控制口P2.4)二、基本功能描述:1.验证密码、修改密码a)锁的初始密码是123456(密码最长为10位,最短为1位)。

2.恢复初始密码a)系统可以恢复初始密码,否则一旦忘记密码而又不能恢复初始密码,该锁就永远打不开。

但是又不能让用户自行修改密码,否则其他人也可以恢复该初始密码,使得锁的安全性大大下降。

3.使系统进入低功耗状态a)在实际使用中,锁只有在开门时才被使用。

因而在大多数的时间里,应该让锁进入休眠状态、以降低功耗,这使系统进入掉电状态,可以大大降低系统功耗。

b)同时将LCD背光灯关闭4.DC电机模拟开锁动作。

a)DC电机启动时解除开锁把手的锁定,允许通过把手开锁。

DC电机不直接开锁,使得DC电机的功率不用太大,系统的组成和维护将变得简单,功耗也降了下来。

三、密码锁特点说明:1.0 输入将被以字符形式输入,最长为10位。

超过10位时系统将自动截取前10位、但不作密码长度溢出提示。

2.0 开锁10秒后不允许更改密码、并提示修改超时_进入初始态,需要重新输入密码方可再次修改密码。

3.0 系统未使用存储器存储密码故掉电后密码自动恢复为初始密码。

4.0 若2分钟内无任何操作,系统自动进入省电模式运行,同时关闭液晶显示,以节省电力。

5.0 输入密码正确后、电机允许开锁时间为5秒, 5秒后需要再次输入密码才可以再次开锁。

6.0 修改密码键和恢复初始密码键最好置于室内。

这是Proteus仿真结果:输入密码123456:显示结果:密码正确时电机启动、电机将持续5秒:这是键盘:开锁键是接INT0引脚接的一个独立按键,用于唤醒CPU工作、进而开启整个系统密码正确时可以修改密码:再次输入新密码,两次输入相同时、更改有效当然你可以随时放弃修改密码改进:1.0 密码锁的秘密没有存储,因而在掉电时最新的密码将丢失,重新上电后密码将恢复成为初始密码。

单片机自动清洁机器人设计(电路图+原理图+流程图+源程序)课程设计

单片机自动清洁机器人设计(电路图+原理图+流程图+源程序)课程设计

单片机自动清洁机器人设计(电路图+原理图+流程图+源程序)-课程设计单片机自动清洁机器人设计最近在电视看到一款能够遥控移动的吸尘器,圆形的和遥控汽车差不多,我感觉到如果再不把自己的想法写出来,自己的创意会被很多人实现,我几年前就想设计一款能够打扫卫生的机器人,直到看到电视里的那个东西,我意识到,我要自己做一个出来。

移动机构是清洁机器人的主体,决定了清洁机器人的运动空间,一般采用轮式结构。

传感器系统一般采用超声波传感器、红外光电传感器、接触传感器等构成多传感器系统。

随着近年来控制技术、传感技术以及移动机器人技术等技术的迅速发展,智能清洁机器人控制系统的研究和开发已具备了坚实的基础和良好的发展前景。

吸尘系统在原理上与传统立式吸尘器相同,主要是在结构设计上更多考虑结构尺寸、集成度以及一些辅助机构的合理布置和利用,以此来提高能源利用率和工作效率。

现在的智能清洁机器人通过软硬件的合理设计,使其能够自动避开障碍物,实现一般家居环境下的自主清洁工作。

它的主要功能有: 1 能够自动熟悉地形,了解房间布局,感知自己的方位,记录和分析环境卫生状况,容易脏的地方多打扫,干净的地方少打扫,节省能源。

2能够自动补充能量。

当检测到电源不足时,自动找到电源,并充电。

充电结束自动专为待机状态。

3当垃圾装满后自动打包,并将垃圾放到主人指定的地点。

4能够检测主人是否在家,只有当主人不在家时,才出来打扫卫生,主人在家时机器人休息。

保证不影响主人的正常生活。

可行性分析:1应用超声波测距和滚轮定位就可以测到自己的位置,给据吸入垃圾量的多少,就可以分析出,那干净那里脏.2应用简单的空中加油技术就可以把自动充电搞定。

检测电源能量多少,和是否充满就更简单了.3垃圾打包只用简单的打包技术就可以解决.4机器人上装上热释红外探测器就知道主人在不在了..5剩下的功能,好多玩具里都有,只要把吸尘器和遥控车结合起来就搞定了1 系统整体方案设计1.1 制作清洁机器人的任务与要求:任务: 清洁机器人在场地上任意运动并吸尘,当遇到障碍物时,可自主避开障碍物绕道继续运动(轨迹由团队设定)。

单片机程序流程图及源代码

单片机程序流程图及源代码

单片机上机实验报告【实验一】端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。

实验内容:1)输出实验:假定4个端口全部连接发光二极管,编程实现所有发光二极管同时亮,延迟一定时间(自定)后,又同时灭,如此循环。

2)输入:从P0口输入某个数据到累加器A,打开观察窗口观察数据是否进入累加器A。

实现方式:通过peripherals实现端口数据观察实验。

程序流程图:将P0到P3端口先赋值为0,调用延迟后,再赋1,然后循环执行。

源代码:ORG 0000H ;程序入口地址LJMP MAIN ;跳转到主程序ORG 0300H ;主程序地址MAIN:MOV P0,#00H;MOV P1 ,#00H;MOV P2 ,#00H;MOV P3 ,#00H ;P0~P3均赋值为0ACALL DEL;调用延迟MOV P0 ,#0FFH;MOV P1 ,#0FFH;MOV P2 ,#0FFH;MOV P3 ,#0FFH;P0~P3均设为1MOV A,P0;将P0口值赋给累加器ACALL DEL;AJMP MAIN;跳转到主程序入口ORG 0200H;延迟程序入口地址DEL:MOV R5,#04H;寄存器实现延迟,F3:MOV R6,#0FFH;若主频为12MHZ则F2:MOV R7,#0FFH;延时为256*256*4F1:DJNZ R7,F1;0.26S,人眼可分辨DJNZ R6,F2;DJNZ R5,F3;RET;从延迟程序返回END;结束3.假设P0口外接一个数码管(共阴),如图,请在数码管上轮流显示数字0~9(采用软件延时)。

程序流程图:将数码管的真值编码0~9依次赋给P0并调用延迟,然后循环运行程序即可。

源代码:ORG 0000H; 程序入口SJMP MAIN; 跳转到主程序ORG 0300H; 主程序入口地址MAIN:MOV P0,#0FCH; 将数码管0的编码赋给P0口ACALL DELAY; 调用延迟,使数码管亮0持续0.33SMOV P0,#60H; show 1ACALL DELAY;MOV P0,#0DAH; show 2ACALL DELAY;MOV P0,#0F2H; show 3ACALL DELAY;MOV P0,#66H; show 4ACALL DELAY;MOV P0,#0B6H; show 5ACALL DELAY;MOVP0,#0BEH; show 6ACALL DELAY;MOV P0,#0E0H; show 7ACALL DELAY;MOV P0,#0FEH; show 8ACALL DELAY;MOV P0,#0F6H; show 9ACALL DELAY;AJMP LOOP; 跳转到主程序入口ORG 0200H; 延迟程序入口DEL:MOV R5,#05H; 采用软件延迟,若主频为12MHz,则DEL1:MOV R6,#0FFH; 定时时间为256*256*5*1uS=0.33S,DEL2:MOV R7,#0FFH; 人眼可分辨。

单片机四个实验报告流程图

单片机四个实验报告流程图

实验一流水灯
实验目的:用AT89C51控制,使8个LED轮流点亮,周期1S,且LED使用驱动电路。

单片机电路
流程图
开始
将累加器的值赋为0FEH
将累加器的值输出给P1
循环左移一位
延时1秒
实验二定时器/计数器的使

实验目的:用T0对1kHz方波进行计数,每满200个使输出翻转;用T1产生20ms定时,满200ms时使翻转,满1s时使翻转。

电路图
流程图
开始
给TMOD赋初值,设
设定定时器初值
开启中断
等待中断
T0中断子程序,翻转T1中断子程序,
翻转
T1中断子程序,
翻转
脉冲个数满200 T1计时满200ms T1计时满1s
实验三 矩阵键盘的使用
单片机电路
流程图
开始 扫描键盘码 延时10ms
再次扫描键盘码
比较两次键盘码
将上次的按键字符左移,将
寻找较键盘码对应的字符
Y
N
实验四双机通信
实验目的:单片机甲同期发送一个自累加数值,周期500ms,用定时器且用中断;单片机乙中断方式接收数据,并通过P1口外接LED显示。

实验电路图:
实验流程图:
单片机乙。

单片机设计程序流程图

单片机设计程序流程图

设计题1:按下SW1电机全速运行,电机输出端P2.6输出高峰按下SW2电机半速运行,电机输出端P2.6输出低峰设计题2;四路抢答器说明:按下复位键后没有显示,开始抢答,根据P3口的输入值,显示对应的数字设计题3:双路报警器说明:正常时SW1为断开状态,SW2为闭合状态。

当小偷翻窗入室,会导致SW1闭合或SW2断开时,同时启动声光报警:直流蜂鸣器(BUZZER)通电发声,LED1与LED2交替闪亮,交替时间为0.5秒设计题4:三人表决器说明:程序检测按键,三个按键中如果有一个主裁判和任意一个副裁判按下说明有效设计题5:设计题:5:单双八拍说明:A→AB →B →BC→C →CD→D →DA设计题6:小便池自动抽水说明:当人靠近小便池时,出水2秒,人离开后,出水5秒(请考虑时间的精度问题)。

本题仅要求用一只普通开关SW1来代替人体红外感应开关,有人靠近时SW1接通,人离开时,SW1断开。

设计题7:小便池自动抽水说明:通过三档旋转开关设定高、中、低三档水位,水位设定好后单片机能按设定水位控制电磁阀注水,达到设定水位后停止注水。

设计题8:自动计数说明:当自动检测开关SW1检测到有工件通过时,马上闭合,然后断开,利用这一特点实现自动流水线货物(SW1接通次数)计数(00--99)。

设计题9:水塔水位说明:当水位低于B时,开启水泵电机进行抽水,水池水位慢慢升高,达到预设水位C时,水泵电机停止;放水时,水池水位低于B时,水泵电机又开始启动并抽水(排除机械故障),如此循环。

当系统处于进水状态时,要求指示灯D1点亮。

设计题10:自动风扇的电气控制说明:通过对光照的感应,实现对风扇(FA)的启停,当外界没有光照时,相当于是夜间工作方式,风扇停止工作,当有光照时相当于是白天,风扇启动,以达到节能的目的设计题11:计数指示灯说明:每按一次按键SW1,发光二极管向右移动增加一个亮灯,3个全亮后,再按按键,发光二极管全灭,之后再从最左一个开始点亮。

单片机水箱水位控制系统硬件框图流程图电路图汇编源程序.

单片机水箱水位控制系统硬件框图流程图电路图汇编源程序.

单片机水箱水位控制系统+硬件框图+流程图+电路图+汇编源程序
单片机水箱水位控制系统+硬件框图+流程图+电路图+汇编源程序给水泵电机主控回路图如下:三本系统8051单片机控制部分结构本系统采用8051单片机,引脚具体控制如下:P1口和P3口为输入输出检测信号和控制信号。

下面是8051芯片引脚具体分配:P1.0:水位低低输入信号。

(低0 高1)P1.1:水位低输入信号。

(低0 高1)P1.2:水位高输入信号。

(高1,低0)P1.3:手动与自动转换输入信号。

(手动1,自动0)P1.4:M1起动KM1控制输出信号。

(手动1,自动0)P1.5:M2起动KM1控制输出信号。

(手动1,自动0)P1.6:M1开关状态输入信号。

(开0,关1)P1.7:M2开关状态输入信号。

(开0,关1)P3.0:水位低低报警输出信号。

论文网
P3.1:水位低报警输出信号。

P3.2:水位高报警输出信号。

P3.4:手动起动M1输入信号,低电频有效动作。

P3.5:手动起动M2输入信号,低电频有效动作。

P3.6:手动停M1输入信号,低电频有效动作。

P3.7:手动停M2输入信号,低电频有效动作。

上一页[1] [2] [3] [4]。

单片机程序编程流程ppt课件

单片机程序编程流程ppt课件
r1 = 0x0001 unsigned int uiTmep;
完成后即进入 初始化寄存器 r2 作为累加器,初始值为 0;
uiArray[i+1] = uiTmep; for(Count = 0;Count <= 100;Count++)
• 累加循环;在累加循环当中,累加器的数值 【实验目的】
掌握 µ\u8217XnSP™ IDE 集成开发环境的一般使用方法。 第一页,编辑于星期五:十三点 二十三分。
第四页,编辑于星期五:十三点 二十三分。
பைடு நூலகம்
【程序流程】

第五页,编辑于星期五:十三点 二十三分。
流程说明
• 初始化寄存器 r2 作为累加器,初始值为 0;
在程序运行中主要用到 r1~r4 四个通用寄存器和 BP(r5)、SP、PC、SR 四个特殊功能寄存器。
寄存器 r1 为加数,初始值为 1。初始化操作 第十二页,编辑于星期五:十三点 二十三分。
把 r2 累加的结果送到[Sum]单元中。 2) 对于n 个数,理论上说应该进行(n-1)次冒泡才能完成排序,但实际上有时不到(n-1)次就已经排完。
第六页,编辑于星期五:十三点 二十三分。
.DEFINE P_Watchdog_Clear 0x7012
.RAM
.VAR Sum
//定义变量Sum
.CODE
.PUBLIC
_main
_main:
r1 = 0x0001
r2 = 0x0000
?Loop:
r2 = r2 + r1
//累加
r1 = r1 + 1
cmp r1,100
//比较r1与100,如不大于则继续累加

《单片机原理及应用》课程设计软件流程图

《单片机原理及应用》课程设计软件流程图

1.函数波形发生器流程图主程序流程T0中断服务程序流程2. 255秒定时器流程主程序流程图INT0中断服务程序流程T1中断服务程序流程T0中断服务程序流程3. 比例电压变换器流程主程序流程图4. 模拟电压显示器流程主程序流程图注:P1口和P3.0-P3.3接12个LED 灯,其中P3.3接最高位灯L12,P1.0接最低位灯L0。

5. 脉冲计数器流程主程序流程图T1中断服务程序流程图T0中断服务程序流程图6. 水塔水位控制器流程主程序流程图T0中断服务程序流程图T1中断服务程序流程图7. 占空比可调的方波发生器流程主程序流程图T0中断服务程序流程图注:T0的中断服务程序编制过程中必须注意使程序所有流程的执行时间小于100μS 。

否则,输出波形的频率不符合题目的要求8. 双机通过串行接口互传数据流程主程序流程图T0中断服务程序流程图串口中断服务程序流程图9. 花样流水灯流程主程序流程图T0中断服务程序流程图注:在主程序中由于仅使用了8bit运算,故实际A/D采样值为255时,得到的延时时间间隔为1280mS。

若要完全符合题意,则需要使用16bit的算术运算才能满足要求。

10. 模拟电压比较器流程主程序流程图T0中断服务程序流程图T1中断服务程序流程图11. 利用PWM 信号实现直流小电机的调速流程主程序流程图注:在程序的编制过程中,必须仔细调整延时37微秒的延时子程序的延时时间,使输出波形的频率满足题目要求。

12. 调频信号发生器流程主程序流程图T0中断服务程序流程图注:该程序编制过程中须注意,T0中断服务程序与主程序均使用0区的工作寄存器。

另外,T0的中断服务程序中最长流程的执行时间必须小于50微秒13. 频率计主程序流程图T1中断服务程序流程图动态显示子程序流程图主程序流程图14. 电子钟T0中断服务程序流程图INT0中断服务程序流程图动态显示子程序流程图15. 数字电压表主程序流程图T0中断服务程序流程图动态显示子程序流程图16. 数字跑表主程序流程图INT0中断服务程序流程图T0中断服务程序流程图动态显示子程序流程图17. 步进电机驱动器主程序流程图INT0中断服务程序流程T0中断服务程序流程。

单片机串行通信

单片机串行通信

1.单片机串行通信的概述在通信领域内,有两种数据通信方式:并行通信和串行通信。

随着计算机网络化和微机分级分布式应用系统的发展,通信的功能越来越重要。

通信是指计算机与外界的信息传输,既包括计算机与计算机之间的传输,也包括计算机与外部设备,如终端、打印机和磁盘等设备之间的传输。

串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。

其只需要少数几条线就可以在系统间交换信息,特别使用于计算机与计算机、计算机与外设之间的远距离通信。

使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0。

在串行通信中,把通信接口只能发送或接收的单向传送办法叫单工传送;而把数据在甲乙两机之间的双向传递,称之为双工传送。

在双工传送方式中又分为半双工传送和全双工传送。

半双工传送是两机之间不能同时进行发送和接收,任一时该,只能发或者只能收信息。

51系列单片机有一个可编程的全双工串行通信接口,它可作异步接收发送器用,也可做同步移位寄存器用,其帧格式可有8位、10位或11位,并能设置各种波特率,给使用带来很大的灵活性。

51系列单片机有两个物理上独立的接收、发送缓冲器SBUF,它们只占用同一地址99H,可同时发送、接送数据。

发送缓冲器只能写入,不能读出,接收缓冲器只能读出、不能写入。

串行发送接收的速率与波特率发生器产生的移位脉冲同频。

51系列单片机用定时器T1或直接用CPU时钟作为通信波特率发生器的输入,在串行接口的不同工作方式中,波特率发生器从两个输入信号中选择一个分频,产生移位脉冲来同步串口的接收和发送,移位脉冲的速率即是波特率。

接收器是双缓冲结构,在前一个字节被从接收缓冲器SBUF读出之前,第二字节即开始被接收。

但是,若在第二个字节接收完毕后,前一个字节还未被CPU 读取的话,第二个字就会覆盖第一个字节,造成第一个字节的丢失。

接收器是双缓冲结构,串行口的发送和接收都是以特殊功能寄存器SBUF的名义进行读或写的。

精品课件-单片机原理及应用系统设计-第4章

精品课件-单片机原理及应用系统设计-第4章

;
PUSH
DPL
;
保护现场, 将主程序中
; DPTR的低八位放入堆
MOV
DPTR, #TABLE
; 在子程
第四章 单片机程序设计语言
恢复现场,
MOVC A, @A+DPTR
POP
DPL
将主程序中DPTR
; ;
;的低八位从堆栈中弹出
POP 场, 将主程序中DPTR
DPH
; 恢复现
;的高八位从堆栈中弹出
图 4-8 循环程序的典型形式
第四章 单片机程序设计语言
【例 4-4】 冒泡程序。假设有N个数, 它们依次存放 于LIST地址开始的存储区域中, 将N个数比较大小后, 使它 们按照由小到大的顺序排列,
编写该程序的方法: 依次将相邻两个单元的内容作比较, 即第一个数和第二个数比较,第二个数和第三个数比 较, ……, 如果符合从小到大的顺序则不改变它们在内存 中的位置,否则交换它们之间的位置。如此反复比较, 直到 数列排序完成为止。
LJMP MAIN
;
MAIN: MOV A, X
XRL A, Y
; (X)与(Y)进行异或操作
JB ACC.7, NEXT1
; 累加器A的第7位
为1, 两个数
;符号不同, 转移到
第四章 单片机程序设计语言
MOV
CJNE
转移到NEQUAL
CLR
P1.0置0
S
MOV DXCE1COUNTER, #00H
; 将DXCE1COUNTER赋值为0
而如下的注释则给出了额外有用的信息:
JNZ PC Comm_Err
;
第四章 单片机程序设计语言
(2) 注释应与其描述的代码相近, 对单条语句的注释应 放在其上方或右方相邻位置, 不可放在下面, 如放于上方

单片机整套实验及程序(交通灯_跑马灯等)

单片机整套实验及程序(交通灯_跑马灯等)

实验1 跑马灯实验一、实验目的●初步学会Proteus ISIS和uVision2单片机集成开发环境的使用;●初步掌握采用汇编语言与C语言开发单片机系统的程序结构;●掌握80C51单片机通用I/O口的使用;●掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法。

二、实验设备及器件●硬件:PC机,HNIST-1型单片机实验系统●软件:Proteus ISIS单片机仿真环境,uVision2单片机集成开发环境三、实验内容●编写一段程序,采用P1口作为控制端口,使与P1口相接的四个发光二极管(D1、D2、D3、D4)按照一定的方式点亮。

如点亮方式为:先点亮D1,延时一段时间,再顺序点亮D2……D4,然后又是D4……D1,同时只能有一个灯亮;然后每隔一段时间一次使相邻两个灯亮,三个灯亮,四个灯亮,最后闪烁三次,接着循环变化。

●基于Proteus ISIS仿真环境完成上述功能的仿真。

●基于uVision2单片机集成开发环境与硬件平台完成程序的脱机运行。

四、实验原理图图3.1 跑马灯实验电路原理图电路原理图如上图3.1所示,AT89S52的P1.0~P1.3控制4个发光二极管,发光二极管按照一定次序发光,相邻发光二极管的发光时间间隔可以通过定时器控制,还可以通过软件延时实现。

五、软件流程图与参考程序●主程序流程图如下:●参考程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar aa,num,speed,flag;uchar code table[]={0x0e,0x0d,0x0b,0x07};uchar code table1[]={0x0a,0x05,0x09,0x06};uchar codetable2[]={0x0c,0x09,0x03,0x08,0x01,0x0e,0x0c,0x08,0x00};void delay(uint z)//延时函数{uint x;uchar y;for(x=z;x>0;x--)for(y=200;y>0;y--);}void init()//条件初始化函数{ flag=0;speed=10;//控制跑马灯流水速度TMOD=0x01;//中断方式TH0=(65535-50000)/256;TL0=(65536-50000)%256;//初值EA=1;//打开总中断ET0=1;//打开外中断0TR0=1;}void main(){init();//调用初始化函数while(1){if(flag){delay(2000);//调用延时函数for(num=0;num<4;num++)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=0;num<4;num++)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=0;num<6;num++)//两个,三个,四个跑马灯依次闪烁{P1=table2[num];delay(2000);}for(num=0;num<5;num++)//闪烁5次{P1=0xff;//全暗delay(2000);P1=0X00;//全亮delay(2000);}speed=speed-3;//变速if(speed==4){speed=10;}}}}void timer0() interrupt 1//中断函数{TH0=(65535-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==speed){aa=0;flag=1;}}六、实验思考题●请用汇编指令完成本实验内容,深刻理解汇编语言程序设计结构。

51单片机智能小车PWM调速前进程序源代码、电路原理图和器件表

51单片机智能小车PWM调速前进程序源代码、电路原理图和器件表

51单片机智能小车PWM调速前进程序源代码、电路原理图、电路器件表从控制电路角度划分,智能小车电路板分为核心板和驱动板。

核心板上的处理器的芯片型号是:STC15W4K56S4,这是一款51单片机。

驱动板上有电源电路、电机驱动电路以及一些功能模块接口。

智能小车前进只要控制智能小车四个轮子向前转动就可以了。

智能小车四个轮子由四个直流减速电机驱动。

直流减速电机驱动芯片采用L293D,一片电机驱动芯片L293D可以驱动两个直流减速电机,智能小车用到4个直流减速电机,需要用到两片L293D电机驱动芯片。

但有时候我们需要控制智能小车的速度,不希望智能小车全速前进。

比如在“智能小车循迹实验”中,如果智能小车速度过快,来不及反应做出方向的调整,智能小车会很容易跑离轨迹,这样就需要调整控制智能小车的速度了。

那么怎么样实现智能小车前进速度的调节呢?调节智能小车的速度,实际上是调节电机的运转速度,PWM调速是目前电机的主流调速方式。

智能小车采用脉宽调制(PWM)的办法来控制电机的转速,从而控制智能小车的速度。

在此种情况下,电池电源并非连续地向直流电机供电,而是在一个特定的频率下为直流电机提供电能。

不同占空比的方波信号,调节对直流电机的通断电,能起到对直流电机调速作用。

这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上。

这样,改变L293D使能端EN1和EN2上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了直流电机转速。

智能小车PWM调速前进程序如下:首先,定义了2个变量,这2个变量用于设置智能小车的速度。

unsigned char pwmval_left_init=6; //调节此值可以调节小车的速度。

unsigned char pwmval_right_init=6; //调节此值可以调节小车的速度。

通过以下函数初始化定时器0,每1毫秒中断一次。

void Timer0_Init(void) //定时器0初始化{TMOD=0x01;TH0=0xf8;TL0=0xcd;TR0=1;ET0=1;EA=1;}下面我们看定时器0的中断处理函数。

单片机新手教学教案-含流程图及程序

单片机新手教学教案-含流程图及程序

//赋值实例:用单片机控制第一个灯亮#include<reg52.h> //包含51单片机寄存器定义的头文件 void ma in (void) {程序开始P0=0xfe; 〃P0=1111 1110B,即 P1.0输出低电平 -------- j ------} ________________________________________________ !_让第一个灯亮 //闪烁实例:用单片机控制一个灯闪烁#include<reg52.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间void delay(void)//两个void 意思分别为无需返回值,没有参数传递 {unsigned int i; //定义无符号整数,最大取值范围 65535for(i=0;i<20000;i++) //做20000次空什么也不做,等待一个机器周期}/******************************************************* 函数功能:主函数 (C 语言规定必须有也只能有1个主函数)void ma in (void){while(1)//无限循环 {P0=0xfe; //P1=1111 1110B ,P1.0 输出低电平 delay(); //延时一段时间P0=0xff; //P1=1111 1111B ,P1.0 输出高电平 delay(); //延时一段时间}让第一个灯灭 程序开始 让第一个灯亮//流水实例1 :使用P0 口流水点亮8位LED #include<reg52.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/ void delay(void){un sig ned char i,j;for(i=0;i<250;i++) for(j=0;j<250;j++);}/***************************************函数功能:主函数***************************************{ while(1)void main (void)P0=0xfe; //第一个灯亮delay(); //调用延时函数P0=0xfd; //第二个灯亮delay(); //调用延时函数P0=0xfb; //第三个灯亮delay(); //调用延时函数P0=0xf7; //第四个灯亮delay(); //调用延时函数P0=0xef; //第五个灯亮delay(); //调用延时函数P0=0xdf; //第六个灯亮delay(); //调用延时函数P0=0xbf; //第七个灯亮delay(); //调用延时函数P0=0x7f; //第八个灯亮delay(); //调用延时函数//流水实例2 :用自增运算控制P0 口8位LED流水花样#include<reg52.h> //包含单片机寄存器的头文件/******************************************************函数功能:延时一段时间******************************************************/void delay(void){un sig ned int i;for(i=0;i<20000;i++)J}/******************************************************函数功能:主函数******************************************************/void ma in (void){un sig ned char i;for(i=0;i<255;i++) //注意i的值不能超过255{P0=i; //将i的值送P0 口delay(); //调用延时函数}}//流水实例3 :用右移运算流水点亮P1 口8位LED#include<reg52.h> //包含单片机寄存器的头文件/*****************************函数功能:延时一段时间*****************************/void delay(void){un sig ned int n;for(n=0;n <30000; n++);}/*****************************函数功能:主函数*****************************/void ma in (void){un sig ned char i;while(1){P0=0xff;delay();for(i=0;i<8;i++) //设置循环次数为8{P0=P0>>1; //每次循环P1的各二进位右移1位,高位补0 delay();//调用延时函数}}}//开关实例:用if语句控制P0 口8位LED的点亮效果#include<reg52.h> //包含单片机寄存器的头文件sbit S仁P1A4; //将S1位定义为P1.4sbit S2=P1A5; // 将S2 位定义为P1.5/*****************************函数功能:主函数*****************************/void ma in (void){while(1){if(S1==0) //如果按键S1按下P0=0x0f; //P0 口高四位LED点亮if(S2==0) //如果按键S2按下P0=0xf0; //P0 口低四位LED点亮}}//开关实例3 :用swtich 语句的控制P0 口 8位LED 的点亮状态 #include<reg52.h> //包含单片机寄存器的头文件 sbit S 仁P1A 4; //将S1位定义为P1.4 /***************************** 函数功能:延时一段时间 *****************************/ void delay(void) { un sig ned int n; for(n=0; n<10000; n++); /***************************** 函数功能:主函数 *****************************/ void ma in (void) { un sig ned char i; i=0; while(1) { if(S1==0) { delay(); if(S1==0) i++; if(i==9) i=1; } switch(i) //将i 初始化为0 //如果S1键按下 //延时一段时间 //如果再次检测到S1键按下 //i 自增1 //如果i=9,重新将其置为1 //使用多分支选择语句 case 1: P0=0xfe; break; case 2: P0=0xfd; break; case 3:P0=0xfb; break; case 4:P0=0xf7; break; case 5:P0=0xef; break; case 6:P0=0xdf; break; case 7:P0=0xbf; break; case 8:P0=0x7f; break //第一个LED 亮 //第二个LED 亮 //第三个 //第四个 //第五个 //第六个 //第七个 //第八个 LED 亮 LED 亮 LED 亮 LED 亮 LED 亮 LED 亮 default: //'缺省值,关闭所有LED P0=0xff;。

51单片机密码锁制作的程序和流程图

51单片机密码锁制作的程序和流程图

51单片机密码锁制作的程序和流程图(很详细)、基本组成:单片机小系统+4* 4矩阵键盘+ 1 6 0 2显示+ DC电机基本电路:键盘和和显示键盘接P1 口,液晶的电源的开、关通过P2.7 口控制电机(控制口P2.4)二、基本功能描述:1.验证密码、修改密码a)锁的初始密码是123456(密码最长为10位,最短为1位)。

2.恢复初始密码a)系统可以恢复初始密码,否则一旦忘记密码而又不能恢复初始密码,该锁就永远打不开。

但是又不能让用户自行修改密码,否则其他人也可以恢复该初始密码,使得锁的安全性大大下降。

3.使系统进入低功耗状态a)在实际使用中,锁只有在开门时才被使用。

因而在大多数的时间里,应该让锁进入休眠状态、以降低功耗,这使系统进入掉电状态,可以大大降低系统功耗。

b)同时将LCD背光灯关闭4. DC电机模拟开锁动作。

a)DC电机启动时解除开锁把手的锁定,允许通过把手开锁。

DC电机不直接开锁,使得DC电机的功率不用太大,系统的组成和维护将变得简单,功耗也降了下来。

三、密码锁特点说明:1.0 输入将被以字符形式输入,最长为10位。

超过10位时系统将自动截取前10位、但不作密码长度溢出提示。

2.0 开锁10秒后不允许更改密码、并提示修改超时_进入初始态,需要重新输入密码方可再次修改密码。

3.0 系统未使用存储器存储密码故掉电后密码自动恢复为初始密码。

4.0 若2分钟内无任何操作,系统自动进入省电模式运行,同时关闭液晶显示,以节省电力。

5.0 输入密码正确后、电机允许开锁时间为5秒, 5秒后需要再次输入密码才可以再次开锁。

6.0 修改密码键和恢复初始密码键最好置于室内。

这是Proteus仿真结果:输入密码123456:密码正确时电机启动、电机将持续5秒:这是键盘:开锁键是接I N T O引脚接的一个独立按键,用于唤醒C P U工作、进而开启整个系统密码正确时可以修改密码:再次输入新密码,两次输入相同时、更改有效改进:1.0 密码锁的秘密没有存储,因而在掉电时最新的密码将丢失,重新上电后密码将恢复成为初始密码。

51单片机设计数字温度计(流程图+源码+实物图片)

51单片机设计数字温度计(流程图+源码+实物图片)

DS18B20获取温度程序流程图DS18B20的读字节,写字节,获取温度的程序流程图如图所示。

DS18B20初始化程序流程图DS18B20读字节程序流程图DS18B20写字节程序流程图DS18B20获取温度程序流程图图3-4 DS18B20程序流程图显示程序设计显示电路是由四位一体的数码管来实现的。

由于单片机的I/O 口有限,所以数码管采用动态扫描的方式来进行显示。

程序流程图如图所示。

图显示程序流程图按键程序设计按键是用来设定上下限报警温度的。

具体的程序流程图如图所示。

N图按键程序流程图附1 源程序代码/********************************************************************* 程序名; 基于DS18B20的测温系统* 功能:实时测量温度,超过上下限报警,报警温度可手动调整。

K1是用来* 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限* 调节模式。

在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动* 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除* 按键音,再按一下启动按键音。

在调节上下限温度模式下,K2是实现加1功能,* K1是实现减1功能,K3是用来设定上下限温度正负的。

* 编程者:ZPZ* 编程时间:2009/10/2*********************************************************************/#include<AT89X52.h> //将AT89X52.h头文件包含到主程序#include<intrins.h> //将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)#define uint unsigned int //变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char //变量类型宏定义,用uchar表示无符号字符型(8位)uchar max=0x00,min=0x00; //max是上限报警温度,min是下限报警温度bit s=0; //s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bit s1=0; //s1标志位用于上下限查看时的显示void display1(uint z); //声明display1()函数#include"ds18b20.h" //将ds18b20.h头文件包含到主程序#include"keyscan.h" //将keyscan.h头文件包含到主程序#include"display.h" //将display.h头文件包含到主程序/***********************主函数************************/void main(){beer=1; //关闭蜂鸣器led=1; //关闭LED灯timer1_init(0); //初始化定时器1(未启动定时器1)get_temperature(1); //首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器)while(1) //主循环{keyscan(); //按键扫描函数get_temperature(0); //获取温度函数keyscan(); //按键扫描函数display(temp,temp_d*0.625);//显示函数alarm(); //报警函数keyscan(); //按键扫描函数}}/********************************************************************* 程序名; __ds18b20_h__* 功能:DS18B20的c51编程头文件* 编程者:ZPZ* 编程时间:2009/10/2* 说明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d* (测得的温度小数部分),标志位f(测量温度的标志位‘0’表示“正温度”‘1’表* 示“负温度”),标志位f_max(上限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位f_min(下限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位w(报警标志位‘1’启动报警‘0’关闭报警)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机总流程图
主函数程序
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define OSC_FREQ 12000000
#define __10ms (65536 - OSC_FREQ/(12000000/9970)) #define COM8255 XBYTE[0XFFF3]
#define PA8255 XBYTE[0XFFF0]
#define PB8255 XBYTE[0XFFF1]
#define PC8255 XBYTE[0XFFF2]
uchar code
tab[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};
uchar code dis_HELLO[]={0x89,0x86,0xc7,0xc7};
uchar code dis_op51[]={0xc0,0x8c,0x92,0xf9};
uchar code dis_code[]={0xcf,0xa4,0xcf,0xa4};
uchar ucCnt_10ms=99;
uchar i=0;
uchar J=0;
uchar n=0;
uchar led1;
uchar led2;
sbit P2_4=P2^4;
sbit P3_7=P3^7;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
void Disp_op51 ();
void Disp_HELLO();
void Set_Init_Xint();
void Set_Init_Timer();
void Disp_t();
void DelayX1ms(uint count);
void Disp_8255();
void main()
{
for(;;)
{
Set_Init_Xint();
Set_Init_Timer();
Disp_8255();
//ucCnt_10ms =99;
//ucLed1 = 6;
//ucLed2 = 8;
if ( n>=1 )
{
for(;;)
{
Disp_HELLO();
if (PB8255==0xef)
{
for(;;)
{
Disp_op51 () ;
Disp_t();
for(i=0;i<0xff;i++);
}
}
for(i=0;i<0xff;i++);
}
}
}
}
定时器T0流程图
定时器初始化函数程序
void Set_Init_Timer()
{
TMOD=0x01;
TH0 = __10ms/256;
TL0 = __10ms%256;
EA=1;
ET0=1;
}
定时器中断服务函数程序
Run_Time0(void) interrupt 1 using 2
{
TR0 = 0;
TH0 = __10ms/256;
TL0 = __10ms%256;
TR0 = 1;
ucCnt_10ms++;
if( ucCnt_10ms==200 ) //1s
{ ucCnt_10ms = 0;
led1++ ;
if( led1==10) //1S时间到更新显示缓冲值
{
led1 = 0;led2++;}
if(led2== 10)
{
led2 = 0 ;
}
}
}
外部中断0流程图
外部中断初始化函数程序
void Set_Init_Xint()
{
IT0=1;
EX0=1;
EA=1;
}
定时器中断服务函数程序
Run_Xint0(void) interrupt 0 using 1
{
n++;
TR0=1;
}
独立式按键流程图
8255定义入口
#define COM8255 XBYTE[0XFFF3]
#define PA8255 XBYTE[0XFFF0]
#define PB8255 XBYTE[0XFFF1]
#define PC8255 XBYTE[0XFFF2]
sbit P3_7=P3^7;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
8255初始化函数程序
void Disp_8255()
{
P3_7=0;
P1_0=0;
P1_1=1;
P1_2=0;
COM8255=0x82;
}
HELLO显示函数程序
void Disp_HELLO() //HELLO显示函数
{
SCON = 0x00;
SBUF=0xFC;
P2_4=0;
while(!TI);
TI = 0;
P2_4=1;
P2_4=0;
SBUF=0x02;
while(!TI);
TI = 0;
P2_4=1;
P1=0x7A;
P2=dis_HELLO[0 ];
DelayX1ms(5);
P1=0xBA;
P2=dis_HELLO[1 ];
DelayX1ms(5);
P1=0xDA;
P2=dis_HELLO[2];
DelayX1ms(5);
P1=0xEA;
P2=dis_HELLO[3];
DelayX1ms(5);
}
void Disp_op51 ()
{
P1=0x7F;
P2=dis_op51[0 ];
DelayX1ms(5);
P1=0xBF;
P2=dis_op51[1 ];
DelayX1ms(5);
P1=0xDF;
P2=dis_op51[2 ];
DelayX1ms(5);
P1=0xEF;
P2=dis_op51[3 ];
DelayX1ms(5);
}
0~99显示函数程序
void Disp_t()
{
SCON = 0x00;
SBUF=tab[led2];
P2_4=0;
while(!TI);
TI=0;
P2_4=1;
P2_4=0;
SBUF=tab[led1];
while(!TI);
TI=0;
P2_4=1;
}
void DelayX1ms(uint count) {
uint j;
while(count--!=0)
{
for(j=0;j<72;j++);
}
}。

相关文档
最新文档