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

单片机上机实验报告【实验一】端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。
实验内容: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; 人眼可分辨。
单片机整套实验及程序(交通灯_跑马灯等)

实验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;}}六、实验思考题●请用汇编指令完本钱实验内容,深刻理解汇编语言程序设计结构。
单片机IO口内部结构

一、P0端口的结构和工作原理
结构图如下:
1、图解:
(1)输入缓冲器:在P0端口中有两个三态缓冲器,上图中的上面一个是读锁
存器的缓冲器,也就是说,要读取D 锁存器输出端Q 的数据,那就得使读锁存器的这个缓冲器的三态控制端(图中的“读锁存器”端)有效。
下面的是读引脚的缓冲器,要读取P0.x 引脚上的数据,也要使标号为“读引脚”的这个三态缓冲器的控制端有效,引脚上的数据才会传输到单片机的内部数据总线上。
(2)D 锁存器:
结构如图:
它有两个输入端,数据输入端D 和使能输入端CP 。
当CP=0时,G3、G4输出均为0,使G1、G2构成的基本SR 锁存器处于保持状态,无论D 信号怎么变化,输出Q 和Q 非均保持不变。
当需要更新状态时,可将门控信号CP 置1,此时,根据送到D 端新的二值信息将锁存器置为新的状态。
2、当控制信号为低电平“0”,P0口作为通用IO 接口使用时,控制信号为0,转换开关把输出级与锁存器__
Q 端接通,在CPU 向端口输出数据时,因与门输出为0,是
V1
24G
截止,此时,输出级是漏极开路电路,类似于OD门,当驱动上接电流负载时,需要外接上拉电阻,否则输出电平就没有高低之分了。
下图为内部数据总线向P0口输出数据的流程图:
二、P1、P2、P3口作IO口使用时原理与P0口类似,他们的内部结构分别为:。
单片机四个实验报告流程图

实验一流水灯
实验目的:用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]。
c51单片机温度传感器控制电机转动

图12 主程序流程图
5.2
读温度值模块需要调用4个子程序,分别为:
DS18B20初始化子程序:让单片机知道DS18B20在总线上且已准备好操作
DS18B20写字节子程序:对DS18B20发出命令
DS18B20读字节子程序:读取DS18B20存储器的数据
延时子程序:对DS18B20操作时的时序控制
4.2.2
图3DS18B20外形及引脚
GND:地
DQ:单线运用的数据输入/输出引脚
VD:可选的电源引脚
4.2.3
单总线通常要求接一个约4.7K左右的上拉电阻,这样,当总线空闲时,其状态为高电平。
图4 DS18B20接线原理图
4.2.4
主机使用时间隙来读写DS18B20的数据位和写命令字的位。
1.初始化时序如下图:
课程设计报告
基于单片机的DS18B20温度控制设计
学院:计算机科学与工程
专业:计算机科学与技术
班级:090603
学号:090603120
姓名:张阳阳
指导老师:乔永兴
1
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,各种数字系统的应用也使人们的生活更加舒适。数字化控制、智能控制为现代人的工作、生活、科研等方面带来方便。其中数字温度计就是一个典型的例子。
图5 DS18B20初始化时序
2.DS18B20读写时序:
图6DS18B20读写时序
4.2.5
高速暂存存储器由9个字节组成,其分配如表5所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。
单片机程序编程流程ppt课件

完成后即进入 初始化寄存器 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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机总流程图
主函数程序
#include<>
#include<>
#define uchar unsigned char
#define uint unsigned int
#define OSC_FREQ
#define __10ms (65536 - OSC_FREQ/(/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++);
}
}。