单片机程序流程图及源代码
用单片机控制交通灯源程序代码及流程图

用单片机控制交通灯传统的交通灯控制电路一般由数字电路构成,电路复杂、体积大、成本高。
采用单片机控制交通灯不但可以解决上述问题,而且还具有时间显示功能,非常方便。
下面介绍一种用单片机控制交通灯的方法。
一、硬件硬件电路如附图。
AT89C2051的P1.7~P1.5和P1.3~P1.1直接驱动红、黄、绿灯,利用单片机的串口和二片74LS164串/并转换移位寄存器实现时间显示,七段数码管为共阴管,硬件电路极为简单。
二、软件交通灯有红、黄、绿三种。
红灯亮,停止通行;绿灯亮,允许通行;黄灯亮,作过渡。
红灯亮60秒,绿灯亮55秒,黄灯亮5秒。
每组灯的亮暗状态以2分钟为周期循环,故程序采用主、子程序方式,循环结构。
另外,为了简化电路,红、黄、绿灯采用低电平点亮。
源程序清单如下:ORG0000HSTART:MOVDRTR,#TABMOVSCON,#00HMOVP1,#6CH;点亮红、绿灯MOVR0,#0;R0清零LEFT:INCR0CJNER0,#55,LP0;R0<55,转LP0MOVP1,#6AH;R0=55,点亮红、黄灯LJMPLP1LP0:CJNER0,#60,LP1;R0<60,转LP1MOVP1,#0C6H;R0=60,点亮绿、红灯LJMPRIGHTLP1:LCALLDBDBLCALLDISPLJMPLEFT;20H为1,转LEFTRIGHT:DECR0CJNER0,#5,LP2;R0>0,转LP2MOVP1,#0A6H;R0=5,点亮黄、红灯LJMPLP3LP2:CJNER0,#0,LP3MOVP1,#6CH;R0=0,点亮红、绿灯LJMPLEFTLP3:LCALLDBDBLCALLDISPLJMPRIGHTDBDB:MOVA,R0MOVB,#10DIVABMOVR1,AMOVR2,BRETDISP:MOVA,R2MOVCA,@A+DPTRMOVSBUF,AJNBTI,$;查TI位CLRTIMOVA,R1MOVCA,@A+DPTRMOVSBUF,AJNBT1,$CLRTILCALLDEALYRETDELAY:MOVR3,#09HK1:MOVR4,#100K2:MOVR5,#250K3:DJNZR5,K3DJNZR4,K2KJNZR3,K1RETTAB:DB3FH,06H,5BHDB4FH,66HDB6DH,7DH,07HDB7FH,6FH三.实验电路及连线四.实验说明1.因为本实验是交通灯控制实验,所以要先了解实际交通灯的变化规律。
单片机实验程序及流程图 (2) 2

三.程序清单及程序流程框图ORG 0000HLJMP MAINMAIN: MOV R0,#30HMOV R2,#10H CLR AA1: MOV @R0,A INC R0 INC A DJNZ R2,A1 MOV R0,#30H MOV R1,#40H MOV R2,#10H A2: MOV A, @R0 MOV @R1,A INC R0 INC R1 DJNZ R2, A2 MOV R1,#40H MOV DPTR ,#4800H MOV R2, #10H A3: MOV A,@R1 MOVX @DPTR ,A INC R1 INC DPTR DJNZ R2,A3 MOV SP,#60H MOV R2,#10H MOV DPTR ,#4800H PUSH DPL PUSH DPH MOV DPTR,#5800H MOV R3,DPL MOV R4,DPH A4: POP DPH POP DPL MOVX A,@DPTR INC DPTR PUSH DPL PUSH DPH MOV DPL,R3MOV DPH,R4 MOVX @DPTR,A INC DPTRMOV R3,DPL MOV R4,DPH DJNZ R2,A4 MOV R0,#50H MOV DPTR,#5800H MOV R2,#10H A5: MOVX A,@DPTR MOV @R0,AINC R0INC DPTRDJNZ R2,A5修改DPTR《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义LJMP MAINP1, ACLR 00HLJMP NTIPTO:MOV TH0, #3CH MOV TL0, #0B0HDJNZ R2, TIOMOV R2, #0AHSETB 01HDJNZ R1, TIOMOV R1, #02HSETB 00HTIO: RETIEND程序四(思考题程序)ORG 0000HLJMP MAINORG 000BHLJMP IPTOMAIN: MOV SP, #30HMOV P1, #0ffHMOV TMOD, #01HCLR 00HSETB EASETB ET0MOV TH0, #3CHMOV TL0, #0B0HMOV R1, #14HSETB TR0MOV A, #00H NT:JNB 00H, NTINC AMOV R3, ACPL AMOV P1, ACLR 00HMOV A, R3LJMP NTIPTO:MOV TH0, #3CHMOV TL0, #0B0HDJNZ R1, TIOMOV R1, #14HSETB 00HTIO: RETIENDORG Array LJMPM OVMOV TH0,MOV TL0,SETB TR0SETB P1.0TF0,CPL P1.0CLR TF0LJMPENDORG0000HLJMPMAINORG000BHLJMPIPTOM OV SP,#60HMOVTMOD, #02HMOV IE,#82HMOVTH0, #88HMOV TL0, #88HSETB TR0SETB P1.1LJMP HEREP1.1RETIEND)ORG 0000HLJMP MAINMAIN: M OV TMOD, #11HMOV TH0, #0FEH MOV TL0, #0D4H MOV TH1, #0FFH MOV TL1, #38H SETB TR1 SETB P1.0 HERE: JNB TF1, HERECPL P1.0 SETB TR0 CLR TF1 CLR TR1 MOV TH1, #0FFH MOV TL1, #38H HERE1: JNB TF0, HERE1CPL P1.0 SETB TR1 CLR TF0 CLR TR0 MOV TH0, #0FEH MOV TL0, #0D4HLJMP HEREEND五.实验结果周期为200us 方波周期为240us 方波周期为500us 占空比为2:5的方波开始计数器初始化开定时器0TF0=1?P1.0取反TF0清零结束Y开始定时器初始化开定时器1清零TF1结束TF1=0?P1.0取反开定时器0送定时器1初值关定时器1清零TF0TF0=0?P1.0取反开定时器1送定时器0初值关定时器0YNYN三、电路原理图ORG 0000HLJMPMOV TH0,MOV TL0,SETB TR0TF0,CPL P1.0CLR TF0LJMPENDORGLJMPORGLJMPSP,MOVTMOD, #06HMOV TH0,#38HMOV TL0,#38HMOV IE,#82HSETB TR0 HERE:LJMP HEREITPO:CPL P1.0RETIEND程序3(思考题):ORG 0000HLJMP MAINORG 001BHLJMP ITPO MAIN: M OV SP, #60H MOV TMOD, #62HMOV TH0, #9CHMOV TL0, #9CHMOV TH1,#0CEHMOV TL1,#0CEHMOV IE, #88HSETB TR0SETB TR1SETB P1.0HERE:JNB TF0, HERECPL P1.0CLR TF0LJMP HEREITPO:CPL P1.1RETIEND五、实验结果程序1与程序2从T0接入1000Hz的方波,思考题从P1.0口线产生的方波从T1接入计100次脉冲计200次脉冲思考题波形三、电路原理图0000H MAIN0003HEXTER0 000BH IPTO 00013H EXTER1 SP, #60H TMOD, #11H IE,IP, TH0,TL0,MOV TH1, #0D8H MOV TL1, #0F0HHERE:LJMP HEREDELAY:SETB TR1HEREY:JNB TF1, HEREYCLR TR1 CLR TF1 MOV TH1, MOV TL1, RETEXTER0:LCALL DELAYJB P1.0, HERE0:JNB P1.0, SETB TR0 LOOP0:RETIEXTER1:LCALL DELAYJB P1.1, LOOP1 HERE1:JNB P1.1, HERE1CLR TR0LOOP1:RETIIPTO:CPL P1.2MOV TH0, #9EHMOV TL0, #58HRETIEND程序二(思考题)ORG 0000HLJMP MAINORG 0003HLJMP EXTER0ORG 000BHLJMP IPTOMAIN: M OV SP, #60HMOV TMOD, #11HMOV IE, #83HMOV IP, #02HMOV TH0, #0B1HMOV TL0, #0E0HMOV TH1, #0D8HMOV TL1, #0F0HMOV R1, #02H HERE:LJMP HEREDELAY:SETB TR1HEREY:JNB TF1, HEREYCLR TR1CLR TF1MOV TH1, #0D8HMOV TL1, #0F0HRETEXTER0:LCALL DELAYJB P1.0, LOOP0 HERE0:JNB P1.0, HERE0CPL TR0OOP0:RETIIPTO: DJNZ R1, LOOPCPL P1.2CPL 00HJNB 00H, LOOP2MOV R1, #03HLJMP LOOPLOOP2: MOV R1, #02H LOOP: MOV TH0, #0B1HMOV TL0, #0E0HRETIEND五、实验结果1、基本要求部分:将程序产生的十六进制代码加载到proteus中,运行仿真开始无波形输出,按下K0键输出周期为50mS的连续方波,如图5.1所示,当按下K1键波形消失,重复操作结果一样。
单片机课程设计--跑马灯设计

单片机课程设计(跑马灯设计)专业:电气自动化摘要AT89C51是一种带4K字节闪存可编程可擦除只读存储器)(FPEROM—Flash Programmable and Erasable Read Only Memory 的低电压、高性能CMOS 8位微处理器,即单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
该设计使用A T89C51芯片作为控制芯片,利用P1口连接8个发光二极管,通过I/O的值控制“跑马灯”的亮灭,以达到显示效果。
开始时所有灯全亮,按下按键S时开始跑马灯,再按下按键S时停止,再按下S时继续,并要求有多种亮暗组合。
时继续,并要求有多种亮暗组合。
按键跑马灯 按键单片机 跑马灯关键词:A T89C51单片机目录摘要 (I)第一章芯片分析和设计概述 (3)第一节 AT89C51芯片分析 (3)第一节第二节 设计概述 (8)第二节第二章硬件电路设计 (9)第三章程序部分设计 (10)参考文献 (18)第一章 芯片分析和设计概述第一节 AT89C51芯片分析ATMEL 的AT89S51是一种高效微控制器,将多功能8位CPU 和闪烁存储器组合在单个芯片中,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
且价廉的方案。
AT89C51AT89C51的芯片引脚图如下:的芯片引脚图如下:图1.1 AT89C51引脚图引脚图各引脚的说明和功能分析如下:各引脚的说明和功能分析如下:VCC VCC:供电电压。
:供电电压。
:供电电压。
GND GND:接地。
:接地。
:接地。
P0口:口:P0P0口为一个8位漏级开路双向I/O 口,每脚可吸收8TTL 门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
时,被定义为高阻输入。
P0P0能够用于外部程序数据存储器,它可以被定义为数据外部程序数据存储器,它可以被定义为数据//地址的第八位。
单片机自动清洁机器人设计(电路图+原理图+流程图+源程序)课程设计

单片机自动清洁机器人设计(电路图+原理图+流程图+源程序)-课程设计单片机自动清洁机器人设计最近在电视看到一款能够遥控移动的吸尘器,圆形的和遥控汽车差不多,我感觉到如果再不把自己的想法写出来,自己的创意会被很多人实现,我几年前就想设计一款能够打扫卫生的机器人,直到看到电视里的那个东西,我意识到,我要自己做一个出来。
移动机构是清洁机器人的主体,决定了清洁机器人的运动空间,一般采用轮式结构。
传感器系统一般采用超声波传感器、红外光电传感器、接触传感器等构成多传感器系统。
随着近年来控制技术、传感技术以及移动机器人技术等技术的迅速发展,智能清洁机器人控制系统的研究和开发已具备了坚实的基础和良好的发展前景。
吸尘系统在原理上与传统立式吸尘器相同,主要是在结构设计上更多考虑结构尺寸、集成度以及一些辅助机构的合理布置和利用,以此来提高能源利用率和工作效率。
现在的智能清洁机器人通过软硬件的合理设计,使其能够自动避开障碍物,实现一般家居环境下的自主清洁工作。
它的主要功能有: 1 能够自动熟悉地形,了解房间布局,感知自己的方位,记录和分析环境卫生状况,容易脏的地方多打扫,干净的地方少打扫,节省能源。
2能够自动补充能量。
当检测到电源不足时,自动找到电源,并充电。
充电结束自动专为待机状态。
3当垃圾装满后自动打包,并将垃圾放到主人指定的地点。
4能够检测主人是否在家,只有当主人不在家时,才出来打扫卫生,主人在家时机器人休息。
保证不影响主人的正常生活。
可行性分析:1应用超声波测距和滚轮定位就可以测到自己的位置,给据吸入垃圾量的多少,就可以分析出,那干净那里脏.2应用简单的空中加油技术就可以把自动充电搞定。
检测电源能量多少,和是否充满就更简单了.3垃圾打包只用简单的打包技术就可以解决.4机器人上装上热释红外探测器就知道主人在不在了..5剩下的功能,好多玩具里都有,只要把吸尘器和遥控车结合起来就搞定了1 系统整体方案设计1.1 制作清洁机器人的任务与要求:任务: 清洁机器人在场地上任意运动并吸尘,当遇到障碍物时,可自主避开障碍物绕道继续运动(轨迹由团队设定)。
51单片机电子时钟硬件图及完整程序代码

delay(10);
P2=0xdf; //片选秒十位
P0=table[s/10];//显示小时十位
delay(10);
P2=0xff; //关闭所有片选位
}
/*=================初始化函数================*/
void init()
delay(10);
P2=0xf7; //片选分十位
P0=table[f/10]; //显示分十位
delay(10);
P2=0xff; //关闭所有片选位
}
/*=================时显示程序================*/
void displayshi(uchar s)
{
P2=0xef; //片选小时个位
sbit beep=P1^0; //定义蜂鸣器端
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//7段代码表(0~9)
uchar count ,s1num;
char miao,shi,fen;
/*=================延时程序================*/
void delay1ms(void)
{
unsigned i,j;
for(i=0;i<10;i++)
for(j=0;j<1;j++);
}
void delay(unsigned z)
{
unsigned m;
for(m=0;m<z;m++)
51单片机设计数字温度计(流程图+源码+实物图片)

DS18B20获取温度程序流程图DS18B20的读字节,写字节,获取温度的程序流程图如图所示结束DS18B20初始化程序流程图写0x44启动DS18B20延时500 s_____ 、一DS18B20 初始化写0xcc跳过读RCMDS18B20获取温度程序流程图DS18B20读字节程序流程图图3-4 DS18B20程序流程图DS18B20写字节程序流程图显示程序设计显示电路是由四位一体的数码管来实现的。
由于单片机的I/O 口有限,所以数码管采用动态扫描的方式来进行显示。
程序流程图如图所示。
图显示程序流程图按键程序设计按键是用来设定上下限报警温度的。
具体的程序流程图如图所示N附 1 源程序代码******************************************************************* 程序名 ; 基于 DS18B20 的测温系统* 功 能: 实时测量温度,超过上下限报警,报警温度可手动调整。
K1 是用来 * 进入上下限调节模式的,当按一下 K1 进入上限调节模式,再按一下进入下限 * 调节模式。
在正常模式下,按一下K2 进入查看上限温度模式,显示 1s 左右自动* 退出;按一下 K3 进入查看下限温度模式,显示 1s 左右自动退出;按一下 K4 消除 * 按键音,再按一下启动按键音。
在调节上下限温度模式下, K2 是实现加 1 功能, * K1 是实现减 1 功能, K3 是用来设定上下限温度正负的。
* 编程者: ZPZ * 编程时间: 2009/10/2*******************************************************************bit s=0;〃s 是调整上下限温度时温度闪烁的标志位, s=0不显示200ms , s=1 显示 1s 左右bit s1=0; void display1(uint z); #include"ds18b20.h" //s1 标志位用于上下限查看时的显示//声明 display1 ()函数//将 ds18b20.h 头文件包含到主程序#include"keyscan.h" #include"display.h"/***********************//将 keyscan.h 头文件包含到主程序 //将 display.h 头文件包含到主程序 主函数 ************************/#include<AT89X52.h> #include<intrins.h>// 将 AT89X52.h 头文件包含到主程序 //将 intrins.h 头文件包含到主程序(调用其中的 函数延时)_nop_() 空操作#define uint unsigned int #define uchar unsigned char uchar max=0x00,min=0x00;//变量类型宏定义,用 //变量类型宏定义,用//max 是上限报警温度, uint 表示无符号整形( 16 位) uchar 表示无符号字符型( 8 位)min 是下限报警温度void main(){beer=1;led=1; timer1_init(0); get_temperature(1);while(1){keyscan();get_temperature(0);//获取温度函数//关闭蜂鸣器// 关闭LED 灯//初始化定时器1(未启动定时器1)// 首次启动DS18B20 获取温度(DS18B20 上点后自动将EEPROM 中的上下限温度复制到TH 和TL 寄存器)//主循环//按键扫描函数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)输出实验:假定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; 人眼可分辨。
单片机流程图(参考模板)

单片机总流程图主函数程序#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++);}}---精心整理,希望对您有所帮助。
程序流程图及代码

TMOD=0x10; //设置定时器1
TH1=(65536-100)/256; //装初值
TL1=(65536-100)%256; //
ET1=1;//开定时器1中断
EA=1;//开总中断
mscount=0;
}
void delay_0_1ms(uint endcount)
{
k=32;
break;
}
else if(k==31) //若低电平持续了32ms
{
while(IR_Data==0);//等待低电平持续完
for(i=0;i<3;i++)//对一帧数据读三次进行比较确保准确性
{
for(j=1;j<=12;j++)//读取12位数据
{
while(IR_Data==0);//等待上升沿
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit IR_Data =P2^1;//定义一体化接收头数据位
uint IR[3];//用于装取一次接受的多帧数据
uchar K_Data;//装取正确键值
uint mscount;
由于各个部分都相对较简单且讲义上都有详细说明,这里就不做赘述,仅将制作部分及解码程序贴出来。
/***关于BA5104红外编码51单片机解码程序***/
/***2013-12-11***/
/***MCU-STC89C52***/
/**晶振12MHZ**/
/**一体化接收头接收数据与发射数据相反,在电路中加一反相器**/
51单片机C语言源代码例程附带电路图

闪烁灯[实验要求]点亮与单片机P1.0口相连的发光二极管,延时0.2S,然后熄灭,延时0.2S,再点亮,如此循环下去。
[实验目的]初步了解单片机IO口输出高低电平的作用,延时函数的时间估算。
[硬件电路][源代码]#include<reg51.h>/**********************************************************上面这行是一个"文件包含"处理。
所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来这里的程序虽然只写了一行,但C编译器在处理的时候却要处理几十或几百行,这里包含reg51.h的目的在于本程序要使用P1这个符号,而P1是在reg51.h这个头文件中定义的。
大家可以在编译器目录下面用记事本打开这个文件看看。
*********************************************************/sbit P1_0=P1^0; //定义IO口这步的目的是让编//译器知道P1_0代表的就是单片机的P1.0口void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k; //定义3个无符号字符型变量。
for(i=20;i>0;i--) //三个FOR循环用来延时,这里为for(j=20;j>0;j--) //什么是0.2S大家可以用WAVE for(k=248;k>0;k--); //高断点仿真一下,就可知道大概 } //是0.2S了。
void main(void) //每一个C语言程序有且只有一个主函数,{while(1) //循环条件永远为真,以下程序一直执行下去。
{P1_0=0; // I/O口P1.0输出低电平,小灯被点亮。
delay02s(); //延时经过0.2秒。
P1_0=1; // I/O口P1.0输出高电平,小灯熄灭。
单片机操作流程

单片机操作流程
第一步:点击PROJECT中的NEW PROJECT然后命名(要知道路径) ,保存,选择相对应的芯片型号,确定。
第二步:点击FILE,选NEW,输入程序,保存,需要知道路径名及其后缀。
第三步:在界面左侧窗口中的source group 1上点击右键,add file to group,找到刚保存的源文件,add,close 第四步:界面左侧窗口中的target 1上点击右键,options for target"target 1”第五步:在出现的界面中选择上方的output在“create hex file”前打对勾,确定。
第六步:在界面左侧窗口中的target 1上点击右键built target如提示信息中没有警告及错误即可。
第七步:关闭KEIL窗口,打开编程窗口(必须通讯正常) ,选择正确的芯片型号,点击擦除,然后点击加载,找到刚刚KEIL中编译生成的HEX文件,确定,编程即可。
(其间把芯片正确放入编程器的座上。
)。
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 main(void) { P0=0xfe; //P0=1111 1110B ,即P1.0输出低电平 }//闪烁实例:用单片机控制一个灯闪烁#include<reg52.h> //包含单片机寄存器的头文件 /**************************************** 函数功能:延时一段时间*****************************************/void delay(void) //两个void 意思分别为无需返回值,没有参数传递 {unsigned int i; //定义无符号整数,最大取值范围65535for(i=0;i<20000;i++) //做20000次空什么也不做,等待一个机器周期 }/******************************************************* 函数功能:主函数 (C 语言规定必须有也只能有1void main(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) Array {unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/***************************************函数功能:主函数***************************************void main(void){ while(1){ 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){unsigned int i;for(i=0;i<20000;i++);}/******************************************************函数功能******************************************************/void main(void){unsigned 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){unsigned int n;for(n=0;n<30000;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;while(1){P0=0xff;delay();for(i=0;i<8;i++) //设置循环次数为8{P0=P0>>1; //每次循环P1的各二进位右移1位,高位补0delay(); //调用延时函数}}}//开关实例:用if语句控制P0口8位LED的点亮效果#include<reg52.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4sbit S2=P1^5; //将S2位定义为P1.5/*****************************函数功能:主函数*****************************/void main(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 S1=P1^4; //将S1位定义为P1.4/*****************************函数功能:延时一段时间*****************************/void delay(void){ unsigned int n;for(n=0;n<10000;n++); }/*****************************函数功能:主函数*****************************/void main(void){ unsigned char i;i=0; //将i初始化为0while(1){ if(S1==0) //如果S1键按下{ delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为1i=1; }switch(i) //使用多分支选择语句{ case 1: P0=0xfe; //第一个LED亮break;case 2: P0=0xfd; //第二个LED亮break;case 3:P0=0xfb; //第三个LED亮break;case 4:P0=0xf7; //第四个LED亮break;case 5:P0=0xef; //第五个LED亮break;case 6:P0=0xdf; //第六个LED亮break;case 7:P0=0xbf; //第七个LED亮break;case 8:P0=0x7f; //第八个LED亮break;default: //缺省值,关闭所有LEDP0=0xff;}}}。
MSP430单片机课程设计-简单计算器设计

MSP430 单片机课程设计
unsigned char disbuff[8] = {20,20,0,0,0,0,0,0};//初始数码管 unsigned char getkey(void); unsigned int qiushu(); void clear(void); void zhuanhuan(); void delay(unsigned int j) { for(uint i=0;i<j;i++); } unsigned int qiushu() //转化成相应的十进制整数 {unsigned int y; y=disbuff[2]*100000+disbuff[3]*10000+disbuff[4]*1000+disbuff[5]*100 +disbuff[6]*10+disbuff[7]; return y; } void clear(void) {unsigned int a; for(a=7;a>1;a--) disbuff[a]=0; } //清除屏幕
实验二:猜数字游戏设计
一、目的
利用单片机芯片 MSP430x14x、四位八段共阴数码管,设计一个猜数字游戏, 并将游戏结果显示在数码管上。
二、功能
要求该设计能实现如下的功能:游戏开始后,先在程序内随即设定四个 0-9 之间的不同数,作为游戏数答案。然后用户给出 4 个数,该软件会将您提交的数 与它自动产生的数进行比较,结果在八段数码管上显示成"kAsB"。k 代表位置正 确数字也正确的字数,s 代表数字正确但位置不正确的字数。当 k=4 且 s=0 时, 则比较正确显示“GOOD” ,进行下一次比较。
4
MSP430 单片机课程设计
单片机实验程序及流程图

《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义三.程序清单及程序流程框图ORG 0000H Array LJMP MAINMAIN: MOV R0,#30HMOV R2,#10HCLR AA1: MOV @R0,AINC R0INC ADJNZ R2,A1MOV R0,#30HMOV R1,#40HMOV R2,#10HA2: MOV A, @R0MOV @R1,AINC R0INC R1DJNZ R2, A2MOV R1,#40HMOV DPTR ,#4800HMOV R2, #10HA3: MOV A,@R1MOVX @DPTR ,AINC R1INC DPTRDJNZ R2,A3MOV SP,#60HMOV R2,#10HMOV DPTR ,#4800HPUSH DPLPUSH DPHMOV DPTR,#5800HMOV R3,DPLMOV R4,DPHA4: POP DPHPOP DPLMOVX A,@DPTRINC DPTRPUSH DPLPUSH DPHMOV DPL,R3MOV DPH,R4 MOVX @DPTR,A INC DPTRMOV R3,DPLMOV R4,DPHDJNZ R2,A4MOV R0,#50HMOV DPTR,#5800H MOV R2,#10HA5: MOVX A,@DPTR MOV @R0,AINC R0 INC DPTR DJNZ R2,A5POP DPH POP DPL HERE: LJMP HEREEND《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义三.实验电路四.程序清单及流程图程序一ORG 0000HLJMP MAIN ORG 000BH LJMP IPTO MAIN: MOV SP, #30H MOV TMOD, #01HCLR 00H SETB EA SETB ET0 MOV TH0, #3CH MOV TL0, #0B0H MOV R1, #14H SETB TR0 MOV A, #0feH MOV P1, A NT: JNB 00H, NT RL A MOV P1, ACLR 00H LJMP NT IPTO: MOV TH0,#3CH MOV TL0,#0B0HDJNZ R1, TIOMOV R1, #14HSETB 00HTIO: RETIEND程序二只需将程序一中“RL A”改为“RR A”即可实现其功能。
单片机基本程序图文稿

单片机基本程序 Company number【1089WT-1898YT-1W8CB-9UUT-92108】1第一位隔一秒闪烁一次#include<reg52.h>#defineuintunsignedintsbitled1=P1^0;uinti;uintj;voidmain(){while(1){led1=0;for(i=1000;i>0;i--)for(j=110;j>0;j--);led1=1;for(i=1000;i>0;i--)for(j=110;j>0;j--);}}2复杂广告灯#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharuchardiscode[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,//正向流水灯0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,//反向流水灯0xAA,0x55,0xAA,0x55,0xAA,0x55,0xFF,//隔灯闪烁3次0xF0,0x0F,0xF0,0x0F,0xFF,//高四盏。
低四盏闪烁2次0x33,0xCC,0x33,0xCC,0x33,0xCC,0xFF//隔两盏闪烁3次};voiddelayms(uintms){uinti;while(ms--){for(i=0;i<120;i++);}}voidmain(void){uchari;P0=0xFF;while(1){for(i=0;i<35;i++){P0=discode[i];delayms(250);}}}3拉幕式与闭幕式广告灯#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharuchardiscode1[4]={0x18,0x24,0x42,0x81}; uchardiscode2[4]={0x7E,0x3C,0x18,0x00}; voiddelayms(uintms){uinti;while(ms--){for(i=0;i<120;i++);}}voidmain(void){uchari,j;P0=0xFF;while(1){for(i=0;i<4;i++){j=discode1[i];P0=~j;delayms(500);}j=0xFF;P0=~j;delayms(500);for(i=0;i<4;i++){j=discode2[i];P0=~j;delayms(500);} }}4流水灯跑马灯左移右移#include<reg52.h>#defineuintunsignedint#defineucharunsignedchar voiddelay(uints){uinti;while(s--){for(i=0;i<120;i++);}}voidmain(void){uchari,j;P0=0xFF;while(1){j=0x01;for(i=0;i<8;i++){P0=~j;delay(500);j=j<<1;}P0=0xFF;delay(1000);j=0x80;for(i=0;i<8;i++){P0=~j;delay(500);j=j>>1;}}}5千位静态显示数字#include<reg52.h>sbitSMG_q=P1^0; //定义数码管阳级控制脚(千位)sbitSMG_b=P1^1; //定义数码管阳级控制脚(百位)sbitSMG_s=P1^2; //定义数码管阳级控制脚(十位)sbitSMG_g=P1^3; //定义数码管阳级控制脚(个位)voidmain(){SMG_q=0;P0=0xF8;while(1);}6,4位数码管同时静态显示#include<reg52.h>#defineuncharunsignedchar#defineuintunsignedintsbitSMG_q=P1^0; //定义数码管阳级控制脚(千位)sbitSMG_b=P1^1; //定义数码管阳级控制脚(百位)sbitSMG_s=P1^2; //定义数码管阳级控制脚(十位)sbitSMG_g=P1^3; //定义数码管阳级控制脚(个位)uncharmun;uchar;codetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};voiddelay(uint);voidmain(void){SMG_q=0;SMG_b=0;SMG_s=0;SMG_g=0; //P1=0xf0;两种都可以实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机上机实验报告
【实验一】端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。
实验内容: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均赋值为0
ACALL DEL;调用延迟
MOV P0 ,#0FFH;
MOV P1 ,#0FFH;
MOV P2 ,#0FFH;
MOV P3 ,#0FFH;P0~P3均设为1
MOV A,P0;将P0口值赋给累加器
ACALL DEL;
AJMP MAIN;跳转到主程序入口
ORG 0200H;延迟程序入口地址
DEL: MOV R5,#04H;寄存器实现延迟,
F3: MOV R6,#0FFH;若主频为12MHZ则
F2: MOV R7,#0FFH;延时为256*256*4
F1: 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.33S
MOV P0,#60H; show 1
ACALL DELAY;
MOV P0,#0DAH; show 2
ACALL DELAY;
MOV P0,#0F2H; show 3
ACALL DELAY;
MOV P0,#66H; show 4
ACALL DELAY;
MOV P0,#0B6H; show 5
ACALL DELAY;
MOVP0,#0BEH; show 6
ACALL DELAY;
MOV P0,#0E0H; show 7
ACALL DELAY;
MOV P0,#0FEH; show 8
ACALL DELAY;
MOV P0,#0F6H; show 9
ACALL DELAY;
AJMP LOOP; 跳转到主程序入口
ORG 0200H; 延迟程序入口
DEL: MOV R5,#05H; 采用软件延迟,若主频为12MHz,则
DEL1: MOV R6,#0FFH; 定时时间为256*256*5*1uS=0.33S,
DEL2: MOV R7,#0FFH; 人眼可分辨。
DEL3: DJNZ R7, DEL3;
DJNZ R6, DEL2;
DJNZ R5, DEL1;
RET; 延迟程序返回
【实验二】定时器/计数器及中断实验
实验内容:1、假设P0口外接一个数码管(共阴),如图,请在数码管上轮流显示数字0~9。
(采用定时器实现延时并显示数字)。
实验流程图:
跟实验1.3差不多,只是延迟程序改成用定时器定时,定时器采用查询方式,由于定时器本身所能定时有点短,故采用寄存器进行计数以延长时间,定时器定时50ms,50ms*10=0.5s。
源程序:
ORG 0000H;
AJMP MAIN; 跳入主程序
ORG 0030H; 主程序地址
MAIN:MOV P0,#0FCH; 将1的编码值赋给
ACALL DELAY; P0并调用延迟
MOV P0,#0FCH;
ACALL DELAY;
MOV P0,#60H;
ACALL DELAY;
MOV P0,#0DAH;
ACALL DELAY;
MOV P0,#0F2H;
ACALL DELAY;
MOV P0,#66H;
ACALL DELAY;
MOV P0,#0B6H;
ACALL DELAY;
MOV P0,#0BEH;
ACALL DELAY;
MOV P0,#0E0H;
ACALL DELAY;
MOV P0,#0FEH;
ACALL DELAY;
MOV P0,#0F6H; 依次将1~9的值赋
ACALL DELAY; P0口,并调用延迟
AJMP MAIN; 跳回主程序入口
DELAY: MOV R7,#0AH; 寄存器赋值计定时器定时值
AJMP DELAY1; 跳转
DELAY1:MOV TMOD,#01H 选择方式1
MOV TH1,#3CH
MOV TL1,#0B0H 定时器赋初值
SETB TR0; 启动T0
LOOPER:JBC TF0,PE; 循环查询TF0是否置位
AJMP LOOPER
PE: MOV TH0,#3CH
MOV TL0,#0B0H;定时器重新赋值
DJNZ R7,LOOPER; R7减1非零则跳转
CLR TR0; 软件清零
SETB EX0;
RET;
2、单片机晶振为12MHZ,要求利用T1,工作方式1产生周期为2ms的方波。
实验流程图:
采用的是定时器查询方式,初值为65536-1ms/1us=65536-1000=64536=FC18H 源代码:
ORG 0000H;开始
AJMP START;跳到主程序
ORG 0030H;主程序地址
START: MOV TMOD,#10H;使用T1
MOV TH1,#0FCH;
MOV TL1,#18H;赋初值
SETB TR1;启动T1
LOOPER: JBC TF1,PE ; 循环查询TF1是否置位
AJMP LOOPER;
PE: MOV TH1,#0FCH;
MOV TL1,#18H;重新赋值
CPL P1.0;翻转P1.0
AJMP LOOPER;继续查询是否溢出
END;
【实验三】串口通信实验
实验内容:假定P1口连接8个外围开关,不断读取P1口输入的开关量信息,并将读取的结果通过串口发送出去。
其中P1口的输入信息通过Peripherals->P1口模拟,并通过serial window查看输出信息。
1.发送:
程序流程图:
源代码:
ORG 0000H;
AJMP START;
ORG 0130H;
START:MOV SCON,#80H ;选择工作在方式2
MOV PCON,#00H ;波特率不加倍
MAIN: MOV A,P1 ;
MOV SBUF,A ;将P1中的值传送给缓冲器
ACALL DEL;调用延时
W AIT: JBC TI,MAIN ;查询中断标志,若为1则转移到MAIN SJMP W AIT;
DEL:MOV R5,#84H ;延时程序,若主频为12MHz,延迟为DEL1:MOV R6,#0FFH;132*256*256*1us=8.65s
DEL2:MOV R7,#0FFH;
DEL3:DJNZ R7, DEL3;
DJNZ R6, DEL2;
DJNZ R5, DEL1;
RET;延迟程序返回
END;结束
2.接收
程序流程图:
源代码:
ORG 0000H;
AJMP START;
ORG 0023H ;串行口中断入口地址
AJMP SERIN;
ORG 0030H;
START:MOV SCON,#90H ;选择工作在方式2,允许接收MOV PCON,#00H ;波特率不加倍
SETB ES ;开串行口中断
SETB EA;CPU开中断
SJMP $ ;等待中断
SERIN:CLR RI ;串行口接收中断标志,必须由指令清零MOV A,SBUF;
MOV P0,A;传送
RETI;返回
END。