51实验v2

合集下载

51单片机实验手册

51单片机实验手册

51单片机实验手册一、概述51单片机是一种经典的8位微控制器,具有广泛的应用领域。

本实验手册旨在提供详细的实验指导,帮助初学者快速入门,并为进一步的学习提供基础。

二、实验准备在进行51单片机实验之前,我们需要准备以下材料:1. 一块51单片机开发板2. USB数据线或者串口线3. 电脑及编程软件4. 面包板及对应的连接线5. 红、绿、蓝LED以及相应的电阻三、实验一:LED闪烁LED闪烁是最基础的实验之一,通过控制51单片机的I/O口状态,使LED灯交替亮灭。

1. 连接电路将51单片机的VCC引脚连接到正极,GND引脚连接到负极,将LED的长脚连接到P1.0引脚,短脚连接到GND引脚。

2. 编写程序使用C语言编写如下程序:```c#include <reg52.h>void main() {while(1) {P1 = 0x00; // P1置低电平,LED灯熄灭Delay(1000); // 延时1秒P1 = 0xFF; // P1置高电平,LED灯点亮Delay(1000); // 延时1秒}}void Delay(unsigned int t) {while (t--);}```3. 烧录程序将编写好的程序通过编程软件下载到51单片机中。

4. 运行实验将USB数据线或串口线连接到51单片机开发板和电脑,将开发板上的开关打开,观察LED灯的闪烁情况。

四、实验二:数码管显示通过控制51单片机的I/O口状态,驱动数码管显示数字。

1. 连接电路将51单片机的VCC引脚连接到正极,GND引脚连接到负极,将数码管的A、B、C、D、E、F、G引脚分别连接到P1.0、P1.1、P1.2、P1.3、P1.4、P1.5、P1.6引脚。

2. 编写程序使用C语言编写如下程序:```c#include <reg52.h>unsigned char code segment[] = { // 数码管段码表0x3F, // 数字00x06, // 数字10x5B, // 数字20x4F, // 数字30x66, // 数字40x6D, // 数字50x7D, // 数字60x07, // 数字70x7F, // 数字80x6F // 数字9};void main() {unsigned int i;while(1) {for(i = 0; i < 10; i++) {P1 = segment[i]; // 依次在数码管上显示数字0-9 Delay(1000); // 延时1秒}}}void Delay(unsigned int t) {while (t--);}```3. 烧录程序将编写好的程序通过编程软件下载到51单片机中。

51实验指导

51实验指导

DICE598K---51单片机实验指导手册一、系统概述(一)系统简介⒈采用在DICE598K主板上扩充一块51K-CPU插件板的方式构成51单片机实验系统。

⒉配有二片61C256静态RAM构成系统的64K基本内存,地址范围为00000H-0FFFFH,其中00000H-00FFFH监控占用。

另配一片W27C512(64K)EP1存放监控程序,地址范围F0000H-FFFFF。

还配有一片W27C512 EP2存放实验程序,为实验系统独立运行时下载实验程序提供方便。

⒊自带键盘、显示器,能独立运行,为实验程序调试带来方便。

⒋配备Windows仿真调试软件,支持机器码、汇编、C等三种语言的开发和调试。

⒌提供标准RS232异步通讯口,以连接IBM-PC机。

⒍配有各种微机常用I/O接口芯片,定时/计数接口芯片8253、A/D转换接口芯片0809、D/A转换接口芯片0832、中断控制器8259、键盘显示接口8279、并行I/O接口芯片8255、通讯接口芯片8250、8251、485和DMA控制器8237等。

⒎配备键盘、数码显示、发光二极管显示、开关量、LED16×16、LCD12864、温度压力、步进电机、直流电机、扬声器等输入输出设备。

⒏带有脉冲发生器、计数器电路、单脉冲发生器等常用电路。

⒐可以单步、断点、全速调试各实验程序。

⒑内置开关电源,为实验提供+5V/3A、±l2V/0.5A直流稳压电源。

⒒使用环境:环境温度0~+40℃,无明显潮湿,无明显振动碰撞。

⒓配备USB接口的电子实验演示装置,通过编制程序,对模拟控制对象进行实时控制。

(二)系统地址分配1.存贮器地址分配2.I/O地址分配(三)系统接口定义1.CZ1:MAIN-COM :通讯接口;图1-12.CZ4:打印接口;图1-23.JX0,JX17为系统提供的数据总线接口;图2-34.CZ7:系统提供的扩展接口;图2-45.JX12、JX14:液晶显示接口图2-5(四)通用电路简介1.LED发光二极管指示电路:实验台上包括16只发光二极管及相应驱动电路。

51实验程序

51实验程序

R4 内存块移动; 移动3000H --> 4000H, 256 字节mov r0, #30h ;设置块的源地址mov r1, #00hmov r2, #40h ;设置块的目标地址mov r3, #00hmov r7, #25 ;设置移动长度25Loop:mov dph, r0mov dpl, r1movx a, @dpt ;从源地址取数mov dph, r2mov dpl, r3movx @dptr, a ;保存到目标地址cjne r1, #0ffh, Goon1;若r1不等于0ffh,则Goon1inc r0 ;;源地址加高8位加Goon1:inc r1 ;源地址加低8位加1cjne r3, #0ffh, Goon2inc r2Goon2:inc r3 ;目标地址加1djnz r7, Loop ;是否移动完ljmp $endR5 程序跳转org 0ljmp StartFunc0: mov a, #0retretFunc2: mov a, #2retFunc3: mov a, #3retFuncEnter:add a, acc ; ajmp 为二字节指令, 调用号X 2mov dptr, #FuncTabjmp @a+dptrFuncTab:ajmp Func0ajmp Func1ajmp Func2ajmp Func3Start:mov a, #0call FuncEntermov a, #1call FuncEntermov a, #2call FuncEntermov a, #3call FuncEnterljmp $endR6 数据排序Size equ 10 ; 数据个数Array equ 50h ; 数据起始地址Change equ 0 ; 交换标志Sort:mov r0, #Arraymov r7, #Size-1clr ChangeGoon:mov r2, ainc r0mov B, @r0cjne a, B, NotEqualsjmp NextNotEqual:jc Next ; 前小后大, 不交换setb Change ; 前大后小, 置交换标志xch a, @r0 ; 交换dec r0xch a, @r0inc r0Next:djnz r7, Goonjb Change, Sortljmp $endH1AP1口输入输出Loop:mov a, #01hmov r2, #8Output:mov P1, arl acall Delaydjnz r2, Outputljmp LoopDelay:mov r6, #0mov r7, #0DelayLoop:djnz r6, DelayLoopdjnz r7, DelayLoopretendH1BKeyLeft equ P1.0KeyRight equ P1.1LedLeft equ P1.2LedRight equ P1.3SETB KeyLeftSETB KeyRight Loop:MOV C,KeyLeftMOV LedLeft,CMOV C,KeyRightMOV Ledright,CLJMP LoopENDH2继电器控制Output equ P1.0 ; P1.0 portLoop:clr cmov Output,ccall Delaysetb cmov Output,ccall Delayljmp LoopDelay:mov r6, #0mov r7, #0 DLoop:djnz r7, DLoopdjnz r6, DLoopretendH3 74LS245读入数据CS245 equ 8000horg 0000hLoop:mov dptr,#CS245movx a, @dptrljmp LoopendH4 74LS273输出数据CS273 equ 8000hmov dptr, #CS273mov a, #1Loop:movx @dptr, arl anopljmp LoopendH5; 输出50% (5:5) 占空比PWM; 输出10% (1:9) 占空比PWM; 输出90% (9:1) 占空比PWMOUTPUT equ P1.0Loop:clr OUTPUTmov A, #3call Delaysetb OUTPUTmov a, #7call Delayljmp LoopDelay:mov r0, #0DLoop:djnz r0, DLoopdjnz acc, DLoopretendH6 音频控制Speaker equ P1.0Loop:clr Speakercall Delaysetb Speakercall Delayljmp LoopDelay:mov r0, #50djnz r0, $retendH7 用8255输入输出mode equ 082h ; 方式0,PA,PC输出,PB输入PortA equ 8000h ; Port APortB equ 8001h ; Port BPortC equ 8002h ; Port CCAddr equ 8003h ; 控制字地址org 0hmov a, #modemov dptr, #CAddrmovx @dptr,a ; 输出控制字;实验1:PortA输出EX_A:mov a,#80Hmov dptr,#PortAmov b,#8HOutA:movx @dptr,a ; 输出PortArr a ; 移位mov r5,#1call delay ; 延时djnz b, OutA;实验2:PortB 输入PortA 输出EX_B:mov dptr,#PortBmovx a,@dptr ; 读入PortBmov dptr,#PortAmovx @dptr,a ; 输出到PortAmov r5,#2call delayljmp 0delay:mov r7,#0ddd: djnz r7,ddddjnz r6,ddddjnz r5,dddretendH8Amov SCON, #0 ; 串口方式0mov a, #0aahmov SBUF, a ; 输出55hjnb ti, $clr tiljmp $endH8BLD equ P1.0DAT equ P1.1CLK equ P1.2setb CLKclr LDsetb LDmov r7, #8Next:rr amov c, DATmov ACC.7, cclr CLKsetb CLKdjnz r7, Nextljmp $endH9mov dptr, #8234hmov a, #56hmovx @dptr, amov dptr, #9234hmovx @dptr, amov TMOD, #00000101b ; 方式1,记数器mov TH0, #0mov TL0, #0setb TR0 ; 开始记数Loop:mov P1, TL0 ; 将记数结果送P1口ljmp LoopendH9ALD equ P1.0clr LDsetb LDmov SCON, #00010000bWait: jnb RI, Waitmov a, SBUFclr riljmp $endH9BLD equ P1.0DAT equ P1.1CLK equ P1.2setb CLKclr LDsetb LDmov r7, #8Next:rr amov c, DATmov ACC.7, cclr CLKsetb CLKdjnz r7, Nextljmp $endH10mov TMOD, #00000101b ; 方式1,记数器mov TH0, #0mov TL0, #0setb TR0 ; 开始记数Loop:mov P1, TL0 ; 将记数结果送P1口ljmp LoopendH11LED equ P1.0LEDBuf equ 0ljmp Startorg 3Interrupt0:push PSW ; 保护现场cpl LEDBuf ; 取反LEDmov c, LEDBufmov LED, cpop PSW ; 恢复现场retiStart:clr LEDBufclr LEDmov TCON, #01h ; 外部中断0下降沿触发mov IE, #81h ; 打开外部中断允许位(EX0)及总中断允许位(EA)ljmp $endH12Tick equ 10000 ; 10000 x 100us = 1sT100us equ 256-50 ; 100us时间常数(6M)C100us equ 30h ; 100us记数单元LEDBuf equ 0LED equ P1.0ljmp Startorg 000bhT0Int:push PSWmov a, C100us+1jnz Goondec C100usGoon:dec C100us+1mov a, C100usorl a, C100us+1jnz Exit ; 100us 记数器不为0, 返回mov C100us, #high(Tick)mov C100us+1, #low(Tick)cpl LEDBuf ; 100us 记数器为0, 重置记数器; 取反LEDExit:pop PSWretiStart:mov TMOD, #02h ; 方式2, 定时器mov TH0, #t100usmov TL0, #t100usmov IE, #10000010b ; EA=1, IT0 = 1setb TR0 ; 开始定时clr LEDBufclr LEDmov C100us, #high(Tick)mov C100us+1, #low(Tick)Loop:mov c, LEDBufmov LED, cljmp LoopendH13 D/ACS0832 equ 0a000hmov dptr, #CS0832mov a, #00hmovx @dptr, amov a, #40hmovx @dptr, amov a, #80hmovx @dptr, amov a, #0c0hmovx @dptr, amov a, #0ffhmovx @dptr, aljmp $endH14 A/Dmode equ 082h ; 方式0,PA,PC输出,PB输入CS0809 equ 8000hPortA equ 9000h ; Port APortB equ 9001h ; Port BPortC equ 9002h ; Port CCAddr equ 9003h ; 控制字地址org 0mov dptr,#CAddrmov a,#modemovx @dptr,amov dptr, #CS0809mov a, #0movx @dptr, a ; 起动A/Dmov a, #40hdjnz ACC, $ ; 延时> 100usmovx a, @dptr ; 读入结果mov r7,#100dly:mov dptr,#PortAmovx @dptr,adjnz r7,dly ;延时ljmp 0endH15 外部中断Flash equ 0 ; LED状态STOP equ 1SR equ p1.0 ; 南北红灯SY equ p1.1 ; 南北黄灯SG equ P1.2 ; 南北绿灯ER equ P1.3 ; 东西红灯EY equ P1.4 ; 东西黄灯EG equ p1.5 ; 东西绿灯ljmp Startorg 3setb STOP ; 南北, 东西均红灯retiStart:mov SP, #70mov TCON, #01h ; down edge IT0mov IE, #81h ; enable EA, EX0setb SR ; 南北, 东西均红灯clr SYclr SGclr EYclr EGclr STOPLoop:jb STOP, AllRedsetb SR ; 南北红灯, 东西绿灯clr SYclr SGclr ERclr EYsetb EGmov a, #20call Delayjb STOP, AllRedsetb SR ; 南北红灯, 东西黄灯闪clr SYclr SGclr ERclr EYclr EGclr Flashmov r7, #9Loop1:mov c, Flashmov EY, cmov a, #1call Delaycpl Flashdjnz r7, Loop1jb STOP, AllRedclr SR ; 南北绿灯, 东西红灯clr SYsetb SGsetb ERclr EGmov a, #20call Delayjb STOP, AllRedclr SR ; 东西红灯, 南北黄灯闪clr SYclr SGsetb ERclr EYclr EGclr Flashmov r7, #9Loop2:mov c, Flashmov SY, cmov a, #1call Delaycpl Flashdjnz r7, Loop2ljmp LoopAllRed:setb SRclr SYclr SGsetb ERclr EYclr EGclr STOPmov a, #10call Delayljmp LoopDelay: ; 延时子程序mov r1, #80Hmov r0, #0DelayLoop:jb STOP, ExitDelaydjnz r0, DelayLoopdjnz r1, DelayLoopdjnz ACC, DelayExitDelay:retendH16 八段数码管显示OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲Num equ 70h ; 显示的数据DelayT equ 75h ;ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #01call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管retStart:mov sp, #40hmov Num, #0MLoop:inc Nummov a, Nummov b, amov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ; 数字转换成显示码mov @r0,a ; 显示在码填入显示缓冲inc r0inc bcjne r0, #LEDBuf+6, FillBufmov DelayT,#30DispAgain:call DisplayLED ; 显示djnz DelayT,DispAgainljmp MLoopendH17 键盘扫描OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲Num equ 70h ; 显示的数据DelayT equ 75h ;ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #01call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管retStart:mov sp, #40hmov Num, #0MLoop:inc Nummov a, Nummov b, amov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ; 数字转换成显示码mov @r0,a ; 显示在码填入显示缓冲inc r0inc bcjne r0, #LEDBuf+6, FillBufmov DelayT,#30DispAgain:call DisplayLED ; 显示djnz DelayT,DispAgainljmp MLoopendOUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr, amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, LoopretTestKey:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 输出线置为0mov dptr, #INmovx a, @dptr ; 读入键状态cpl aanl a, #0fh ; 高四位不用retKeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hGetKey:mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000bmov r2, #6KLoop:mov a, r1 ; 找出键所在列cpl amovx @dptr, acpl arr amov r1, a ; 下一列movx a, @r0cpl aanl a, #0fhjnz Goon1 ; 该列有键入djnz r2, KLoopmov r2, #0ffh ; 没有键按下, 返回0ffhsjmp ExitGoon1:mov r1, a ; 键值= 列X 4 + 行mov a, r2dec arl arl amov r2, a ; r2 = (r2-1)*4mov a, r1 ; r1中为读入的行值mov r1, #4LoopC:rrc a ; 移位找出所在行jc Exitinc r2 ; r2 = r2+ 行值djnz r1, LoopCExit:mov a, r2 ; 取出键码mov dptr, #KeyTablemovc a, @a+dptrmov r2, aWaitRelease:mov dptr, #OUTBIT ; 等键释放clr amovx @dptr, amov r6, #10call Delaycall TestKeyjnz WaitReleasemov a, r2retStart:mov sp, #40hmov LEDBuf+0, #0ffh ; 显示8.8.8.8.mov LEDBuf+1, #0ffhmov LEDBuf+2, #0ffhmov LEDBuf+3, #0ffhmov LEDBuf+4, #0mov LEDBuf+5, #0MLoop:call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示call GetKey ; 读入键码anl a, #0fh ; 显示键码mov dptr, #LEDMapmovc a, @a+dptrmov LEDBuf+5, aljmp MLoopendH18 电子时钟OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲Hour equ 40hMinute equ 41hSecond equ 42hC100us equ 43hTick equ 10000T100us equ 256-50ljmp Startorg 000bhT0Int:push PSWpush ACCmov a, C100us+1jnz Goondec C100usGoon:dec C100us+1mov a, C100usorl a, C100us+1jnz Exitmov C100us, #high(Tick)mov C100us+1, #low(Tick)inc Secondmov a, Secondcjne a, #60, Exitmov Second, #0inc Minutemov a, Minutecjne a, #60, Exitmov Minute, #0inc Hourmov a, Hourcjne a, #24, Exitmov Hour, #0Exit:pop ACCpop PSWretiDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h DisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopret; ===============================================ToLED:mov dptr, #LEDMapmovc a, @a+dptrretStart:mov TMOD, #02h ; 模式2, 定时器mov TH0, #T100usmov TL0, #T100usmov IE, #10000010b ; EA=1, IT0 = 1mov Hour, #0mov Minute, #0mov Second, #0mov C100us, #high(Tick)mov C100us+1, #low(Tick)setb TR0 ; 启动定时器0MLoop:mov a, Hourmov b, #10div abcall ToLEDmov LEDBuf, amov a, bcall ToLEDorl a, #80hmov LEDBuf+1, amov a, Minutemov b, #10div abcall ToLEDmov LEDBuf+2, amov a, bcall ToLEDorl a, #80hmov LEDBuf+3, amov a, Secondmov b, #10div abcall ToLEDmov LEDBuf+4, amov a, bcall ToLEDmov LEDBuf+5, acall DisplayLEDljmp MLoopendH19OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口HasRcv equ 20h.0 ; 接收标志位LEDBuf equ 40h ; 显示缓冲RCVBuf equ 50H ; 接收缓冲ORG 0000HLJMP START; 串行口中断程序ORG 0023HJNB TI,S0_RCLR TINOPSJMP S0_RETS0_R: ; 接收数据CLR RIMOV RCVBUF,SBUF ; 保存数据SETB HasRcv ; 提示收到数据NOPS0_RET:RETILEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, LoopretTestKey:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 输出线置为0mov dptr, #INmovx a, @dptr ; 读入键状态cpl aanl a, #0fh ; 高四位不用retKeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hGetKey:mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000bKLoop:mov a, r1 ; 找出键所在列cpl amovx @dptr, acpl arr amov r1, a ; 下一列movx a, @r0cpl aanl a, #0fhjnz Goon1 ; 该列有键入djnz r2, KLoopmov r2, #0ffh ; 没有键按下, 返回0ffhsjmp ExitGoon1:mov r1, a ; 键值= 列X 4 + 行mov a, r2dec arl arl amov r2, a ; r2 = (r2-1)*4mov a, r1 ; r1中为读入的行值mov r1, #4LoopC:rrc a ; 移位找出所在行jc Exitinc r2 ; r2 = r2+ 行值djnz r1, LoopCExit:mov a, r2 ; 取出键码mov dptr, #KeyTablemovc a, @a+dptrmov r2, aWaitRelease:mov dptr, #OUTBIT ; 等键释放clr amovx @dptr, amov r6, #10call Delaycall TestKeyjnz WaitReleasemov a, r2retSTART:MOV SP, #60HMOV IE, #0 ; DISABLE ALL INTERRUPTMOV TMOD,#020H ; 定时器1工作于方式2 (8位重装)MOV TH1, #0F3H ; 波特率?2400BPS @ 12MHzMOV TL1, #0F3HANL PCON,#07FH ; SMOD 位清零orl PCON,#80hMOV SCON,#050H ; 串行口工作方式设置MOV LEDBuf, #0ffh ; 显示8.8.8.8.mov LEDBuf+1, #0ffhmov LEDBuf+2, #0ffhmov LEDBuf+3, #0ffhmov LEDBuf+4, #0mov LEDBuf+5, #0SETB TR1SETB ESSETB EA;mov sbuf,a;jnb ti,$MLoop:jb HasRcv, RcvData ; 收到数据?call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示call GetKey ; 读入键码anl a, #0fh ; 通讯口输出键码MOV SBUF,ALJMP MLoopRcvData:clr HasRcv ; 是mov a, RcvBuf ; 显示数据anl a,#0fh ; 显示低位mov dptr, #LEDMapmovc a, @a+dptrmov LEDBuf+5, amov a,bswap a ; 显示高位anl a,#0fhmov dptr, #LEDMapmovc a, @a+dptrmov LEDBuf+4, aljmp MLoopENDH20 打印机; printer; ASM for MCS51mode equ 082hdport equ 08000h ; PA口,数据口status equ 08001h ; PB.0 忙状态ctl equ 08002h ; PC.0 选通控制contrl equ 08003h ; 8255 控制口stb equ 0 ; 选通位busy equ 0 ; 忙状态位org 0hjmp startdelay:mov r6,#0mov r7,#0dd: nopdjnz r7,dddjnz r6,ddretprint:push dphmov b,amov dptr, #statusrd_status:movx a,@dptr ; 读打印机状态jb acc.busy, rd_status ; 若忙,等待mov dptr,#dport ; 数据送出mov a,bmovx @dptr,amov dptr,#ctl ; 输出选通脉冲mov a,#1movx @dptr,amov a,#0movx @dptr,apop dplpop dphretstart:mov dptr, #contrlmov a, #modemovx @dptr,amov dptr, #string ; 被打印字串nextchar:clr amovc a,@a+dptrjnz prtchar ; 字串结束jmp $prtchar:call printinc dptr ; 下一字符jmp nextcharnopstring:db 'Hello World!',0dh,0ahdb 'I can print now',0dh,0ah,0ch,0,0endH21 直流电机; DC motor; ASM for MCS51mode equ 082hSTA TUS equ 08000hPORTA equ 08000hCTL equ 08003hCS0832 equ 09001hDC_P equ 0count0 equ 40count1 equ 41org 0hjmp startdelay:mov r5,#10mov r6,#0mov r7,#0ddd:djnz r7,ddddjnz r6,ddddjnz r5,dddretread:mov TMOD, #01 ; 16位计时clr TR0mov TH0, #0mov TL0, #0mov dptr, #STA TUSr_0: movx a,@dptrjnb acc.DC_P, r_0 ; 等待低电平完r_1: movx a,@dptrjb acc.DC_P, r_1 ; 等待高电平完setb TR0r_2: movx a,@dptrjnb acc.DC_P, r_2 ; 等待低电平完r_3: movx a,@dptrjb acc.DC_P, r_3 ; 等待高电平完clr TR0mov count0,TH0mov count1,TL0retstart:mov dptr, #CS0832mov a, #0ffhmovx @dptr, acall delay ; 等待电机运转稳定call read ; 读取时间mov dptr, #CS0832 ; 设断点,观察上次时间mov a, #0c0hmovx @dptr, acall delay ; 等待电机运转稳定call readmov dptr, #CS0832 ; 设断点,观察上次时间mov a, #040h ; 电机反转movx @dptr, acall delay ; 等待电机运转稳定call read ; 读取时间mov dptr, #CS0832 ; 设断点,观察上次时间mov a, #00h ; 电机反转加速movx @dptr, acall delay ; 等待电机运转稳定call readljmp $ ; 设断点,观察上次时间endH22 步进电机; step motor control; ASM for MCS51mode equ 082hcontrl equ 08003hctl equ 08000hAstep equ 01hBstep equ 02hCstep equ 04hDstep equ 08hdly_c equ 60horg 0hstep:mov a,#modemov dptr,#contrlmovx @dptr,amov dptr,#8002hmov a,#0movx @dptr,amov dly_c,#10hjmp loop1; 单/双八拍工作方式loop:mov dptr, #ctlmov a,#Astepmovx @dptr,acall delaymov a,#Astep+Bstepmovx @dptr,acall delaymov a,#Bstepmovx @dptr,acall delaymov a,#Bstep+Cstepmovx @dptr,acall delaymov a,#Cstepmovx @dptr,acall delaymov a,#Cstep+Dstepmovx @dptr,acall delaymov a,#Dstepmovx @dptr,acall delaymov a,#Dstep+Astepmovx @dptr,acall delaymov a, dly_cdec a ; 提高转速cjne a,#1, nn1 ; 最快速度inc ann1: mov dly_c,aljmp Loop; 双四拍工作方式loop1:mov dptr,#ctlmov a, #Astep+Bstepmovx @dptr,acall delaymov a, #Bstep+Cstepmovx @dptr,acall delaymov a, #Cstep+Dstepmovx @dptr,acall delaymov a, #Dstep+Astepmovx @dptr,acall delaymov a, dly_cdec acjne a,#2, nn2inc ann2: mov dly_c,ajmp loop1; 单四拍工作方式loop2:mov dptr,#ctlmov a,#Dstepmovx @dptr,acall delaymov a,#Cstepmovx @dptr,acall delaymov a,#Bstepmovx @dptr,acall delaymov a,#Astepmovx @dptr,acall delaymov a, dly_cdec acjne a,#3, nn3inc ann3: mov dly_c,ajmp loop2delay:mov r6,dly_cdd1:mov r7,#0djnz r7,$djnz r6,dd1retendH23 温度传感器LowTemp equ -99 ; A/D 0HighTemp equ 99 ; A/D 255ADPort equ 09000hCurTemp equ 51hOUTBIT equ 08002hOUTSEG equ 08004h ; 段控制口IN equ 08001hLEDBuf equ 60hORG 0000Hljmp StartLEDMAP:db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay:mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6mov r2, #00100000bLoop:mov dptr, #OUTBITmov a, #0movx @dptr, amov a, @r0mov dptr, #OUTSEGmovx @dptr, amov dptr, #OUTBITmov a, r2movx @dptr, amov r6, #1call Delaymov a, r2rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, aret; ================================ DisplayResult:mov a, CurTempjnb acc.7, GE0mov LEDBuf, #40h ; '-'dec acpl ajmp GoonGE0:mov LEDBuf, #0 ; ' ' Goon:mov b, #10div abmov dptr, #LEDMAPmovc a, @a+dptrmov LEDBuf+1, amov a, bmovc a, @a+dptrmov LEDBuf+2, amov LEDBuf+3, #0 ; ' 'mov LEDBuf+4, #0 ; ' 'mov LEDBuf+5, #0 ; ' 'retReadAD:mov dptr, #ADPortclr amovx @dptr, a ; start A/Dmov a, #80djnz acc, $ ; delaymovx a, @dptrmov b,amov a,#0ffhclr csubb a,bretReadTemp:mov r1, #0mov r2, #0mov r0, #16RLoop:call ReadADadd a, r2mov r2, ajnc GN1inc r1GN1:djnz r0, RLoopmov a, r2swap aanl a, #0fhxch a, r1swap aanl a, #0f0horl a, r1 ; a = r1r2/16mov b, #(HighTemp-LowTemp)mul abmov a, b ; /256add a, #LowTempmov CurTemp, aretStart:mov sp, #70hMLoop:call DisplayResultcall DisplayLEDcall ReadTempsjmp MLoopendH24 液晶CW ADD1 EQU 08000H ;写指令代码地址(E1)DW ADD1 EQU 08001H ;写显示数据地址(E1)CRADD1 EQU 08002H ;读状态字地址(E1)DRADD1 EQU 08003H ;读显示数据地址(E1)CW ADD2 EQU 08004H ;写指令代码地址(E2)DW ADD2 EQU 08005H ;写显示数进地址(E2)CRADD2 EQU 08006H ;读状态字地址(E2)DRADD2 EQU 08007H ;读显示数据地址(E2)PD1 EQU 3DH ;122/2 分成左右两半屏122x32COLUMN EQU 30HPAGE_ EQU 31H ;页地址寄存器D1,DO:页地址CODE_ EQU 32H ;字符代码寄存器COUNT EQU 33H ;计数器DIR equ 34hdtp1 equ 35hdtp2 equ 36hdtp3 equ 37hCTEMP EQU 38HCOM EQU 20H ;指令寄存器DAT EQU 21H ;数据寄存器ORG 0jmp mainmov dptr, #0f002hmov a,#56hmovx @dptr,amov a,#0movx a,@dptrJMP MAIN;---------------------------------------; 初始化程序INIT: MOV COM, #0E2H ;复位LCALL PROLCALL PR3MOV COM, #0A4H ;关闭休闭状态LCALL PROLCALL PR3MOV COM, #0A9H ;设置1/32占空比LCALL PROLCALL PR3MOV COM, #0A0H ;正向排序设置LCALL PROLCALL PR3MOV COM, #0C0H ;设置显示起始行为第一行LCALL PROLCALL PR3MOV COM, #0AFH ;开显示设置LCALL PROLCALL PR3RET;------------------------------------------------; 清屏CLEAR: MOV R4,#00H ;页面地址暂存器设置CLEAR1: MOV A,R4 ;取页地址值ORL A,#0B8H ;"或"页面地址设置代码MOV COM,A ;页面地址设置LCALL PROLCALL PR3MOV COM,#00H ;列地址设置为"0"LCALL PROLCALL PR3MOV R3,#50H ;一页清80个字节CLEAR2: MOV DAT,#00H ;显示数据为"0"LCALL PR1LCALL PR4DJNZ R3,CLEAR2 ;页内字节清零循环INC R4 ;页地址暂存器加一CJNE R4,#04H,CLEAR1;RAM区清零循环RET;-----------------------------------;1.写指令代码子程序(E1)PRO: PUSH DPLPUSH DPHMOV DPTR,#CRADD1 ;设置读状态字地址PR01: MOVX A,@DPTR ;读状态字JB ACC.7,PR01 ;判"忙"标志为句"0",否再读MOV DPTR,#CW ADD1 ;设置写指令代码地址MOV A,COM ;取指令代码MOVX @DPTR,A ;写指令代码POP DPHPOP DPLRET;------------------------------------;2.写显示数据子程序(E1)PR1: PUSH DPLPUSH DPHMOV DPTR,#CRADD1 ;设置读状态字地址PR11: MOVX A,@DPTR ;读状态宇JB ACC.7,PR11 ;判"忙"标志为"0",否再读MOV DPTR,#DW ADD1 ;设置写显示数据地址MOV A,DAT ;取数据MOVX @DPTR,A ;写数据POP DPHPOP DPLRET;-------------------------------------;3.读显示数据子程序(E1)PR2: PUSH DPLPUSH DPHMOV DPTR,#CRADD1 ;设置读状态字地址PR21: MOVX A,@DPTR ;读状态字JB ACC.7,PR21 ;判"忙"标志为"0"否,否再读MOV DPTR,#DRADD1 ;设置读显示数据地址MOVX A,@DPTR ;读数据MOV DA T,A ;存数据POP DPHPOP DPLRET;-------------------------------------;4.写指令代码子程序(E2)PR3: PUSH DPLPUSH DPHMOV DPTR,#CRADD2 ;设置读状态字地址PR31: MOVX A,@DPTR ;读状态字JB ACC.7,PR31 ;判"忙"陈志为"0"否,否再读MOV DPTR,#CW ADD2 ;设置写指令代码地址MOV A,COM ;取指令代码MOVX @DPTR,A ;写指令代码POP DPHPOP DPLRET;-------------------------------------; 5.写显示数据子程序(E2)PR4: PUSH DPLPUSH DPHMOV DPTR,#CRADD2 ;设置读状态字地址PR41: MOVX A,@DPTR ;读状态字JB ACC.7,PR41 ;判"忙"标志为"0"否,否再读MOV DPTR, #DW ADD2 ;设置写显示数据地址MOV A,DAT ;取数据MOVX @DPTR,A ;写数据POP DPHPOP DPLRET;---------------------------------------; 6.读显示数据子程序(E2)PR5: PUSH DPLPUSH DPHMOV DPTR,#CRADD2 ;设置读状态字地址PR51: MOVX A,@DPTR ;读状态字JB ACC.7,PR51 ;判"忙"标志为"0",否再读MOV DPTR,#DRADD2 ;设置写显示数据地址MOVX A,@DPTR ;读数据MOV DA T,A ;存数据POP DPHPOP DPLRET; 中文显示子程序CCW_PR: MOV DPTR,#CCTAB ;确定字符字模块首地址MOV A,CODE_ ;取代码MOV B,#20H ;字模块宽度为32个字节MUL AB ;代码×32ADD A,DPL ;字符字模块首地址MOV DPL,A ;字模库首地址+代码×32MOV A,BADDC A,DPHMOV DPH,APUSH COLUMN ;列地址入栈PUSH COLUMN ;列地址入栈MOV CODE_,#00H ;代码寄存器借用为间址寄存器CCW_1: MOV COUNT,#10H ;计数器设置为16MOV A,PAGE_ ;读页地址寄存器ANL A,#03H ;取页地址有效值ORL A,#0B8H ;"或"页地址设置代码MOV COM,A ;设置页地址LCALL PRoLCALL PR3POP COLUMN ;取列地址值MOV A,COLUMN ;读列地址寄存器CLR CSUBB A,#PD1 ;列地址-模块参数JC CCW_2 ;<0为左半屏显示区域(E1)MOV COLUMN,A ;≥0为右半屏显示区域(E2)MOV A,PAGE_SETB ACC.3 ;设置区域标志位。

51单片机实验报告

51单片机实验报告

51单片机实验报告
实验目的:
本实验旨在让学生熟悉并掌握51单片机的基本知识和编程能力,进一步了解单片机的原理和应用。

实验内容:
本次实验主要包括以下几个内容:
1.熟悉51单片机的基本原理和结构;
2.学习51单片机的汇编语言编程;
3.使用51单片机进行简单的I/O控制;
4.学习串口通信的原理和编码。

实验步骤:
1. 配置开发环境:安装Keil C编译器和Proteus电路仿真软件;
2.学习汇编语言编程基础知识,包括寄存器的使用、指令的执行等;
3.编写第一个程序:实现将一个数字显示在数码管上;
4.学习I/O控制:通过按键来控制LED灯的亮灭;
5.学习串口通信:通过串口与计算机进行通信,实现数据的发送与接收。

实验结果:
在实验过程中,我成功编写了几个基本的程序,并在Proteus中进行
了仿真。

通过按键来控制LED灯的亮灭,也成功地使用串口进行了数据的
发送和接收。

通过实验,我更深入地理解了51单片机的工作原理和编程
方法。

实验总结:
通过本次实验,我对51单片机有了更深的理解,并掌握了一些基本
的编程技巧。

通过实际操作,我培养了自己的动手能力和问题解决能力。

作为一门基础课程,51单片机为我今后的学习打下了坚实的基础。

我相信,在今后的学习和实践中,我能够更加熟练地运用51单片机进行各种
应用和项目的设计。

该报告共计1200字。

参考资料:
[1]《单片机技术与应用》.吕春阳、吕立民、钱锋.电子工业出版社,2024年。

51单片机实验报告

51单片机实验报告

51单片机实验报告
根据所提供的信息,我可以为您提供一个基本的51单片机实验报告的样例。

以下是一个可能的实验报告结构:
实验名称:51单片机的基本使用
实验目的:掌握51单片机的基本使用方法和功能。

实验器材:51单片机开发板、USB接口线、计算机、电源。

实验步骤:
1. 连接电源,将开发板与计算机连接。

2. 打开软件IDE,新建一个工程。

3. 在工程中编写代码,实现将LED灯进行亮灭交替的功能。

4. 将编写好的代码下载到51单片机开发板中。

5. 检查电路连接是否正确,确保没有问题。

6. 启动51单片机开发板,观察LED灯的亮灭情况。

7. 记录实验结果。

8. 关闭开发板和计算机。

实验结果:
通过编写的代码,成功地实现了LED灯的亮灭交替功能。

LED灯每隔一段时间亮起,然后又灭掉,不断循环。

实验分析:
实验结果表明,51单片机因其高性价比和广泛应用领域,可以使用简单的代码实现一些基本功能。

在这个实验中,我们使
用了51单片机的GPIO口控制LED灯的亮灭,通过不断循环的方式实现了交替闪烁的效果。

实验总结:
通过这次实验,我了解了51单片机的基本使用方法,学会了如何编写简单的代码来控制外部设备。

这对于我以后的学习和应用起到了很好的基础作用。

51单片机定时器实验内容

51单片机定时器实验内容

51单片机定时器实验内容
51单片机定时器实验的内容可以根据不同的需求和目的进行调整,以下是
一些可能的实验内容:
1. 定时器初始化实验:实验目标是了解如何初始化51单片机的定时器,包括设置定时器的工作模式、计数值、初始值等。

实验中可以编写代码,让定时器在初始化后自动开始计时,并在达到指定时间后产生中断或输出信号。

2. 定时器中断实验:实验目标是了解如何使用51单片机的定时器中断功能,实现定时器在达到指定时间后自动触发中断,并在中断服务程序中执行特定的操作。

实验中可以编写代码,让定时器在达到指定时间后自动进入中断服务程序,并在其中执行特定的操作,如点亮LED灯等。

3. 定时器PWM输出实验:实验目标是了解如何使用51单片机的定时器PWM输出功能,实现定时器输出PWM波形。

实验中可以编写代码,让定时器输出不同占空比的PWM波形,并通过调整占空比来控制LED灯的亮
度等。

4. 定时器与外部事件同步实验:实验目标是了解如何使用51单片机的定时器与外部事件同步,实现定时器在外部事件发生时自动开始计时或停止计时。

实验中可以编写代码,让定时器在外部事件发生时自动开始计时或停止计时,并在达到指定时间后执行特定的操作。

以上是一些常见的51单片机定时器实验内容,通过这些实验可以深入了解51单片机的定时器工作原理和用法,并提高编程技能和硬件控制能力。

51单片机实验报告

51单片机实验报告

.51单片机实验报告实验一点亮流水灯实验现象Led灯交替亮,间隔大约10ms。

实验代码#include <reg51.h>void Delay10ms(unsigned int c); void main(){while(1){P0 = 0x00;Delay10ms(50);P0 = 0xff;Delay10ms(50);}}void Delay10ms(unsigned int c) {unsigned char a, b;for (;c>0;c--){for (b=38;b>0;b--){for (a=130;a>0;a--);}}}实验原理While(1)表示一直循环。

循环体内首先将P0的所有位都置于零,然后延时约50*10=500ms,接着P0位全置于1,于是LED全亮了。

接着循环,直至关掉电源。

延迟函数是通过多个for循环实现的。

实验2 流水灯(不运用库函数)实验现象起初led只有最右面的那一个不亮,半秒之后从右数第二个led 也不亮了,直到最后一个也熄灭,然后led除最后一个都亮,接着上述过程#include <reg52.h>#include <intrins.h>void Delay10ms(unsigned int c); main(){unsigned char LED;LED = 0xfe;while (1){P0 = LED;Delay10ms(50);LED = LED << 1;if (P0 == 0x00){LED = 0xfe;}}}void Delay10ms(unsigned int c) {unsigned char a, b;for (;c>0;c--){for (b=38;b>0;b--){for (a=130;a>0;a--);}}}实验原理这里运用了C语言中的位运算符,位运算符左移,初始值的二进制为1111 1110,之后左移一次变成1111 1100,当变成0000 0000时通过if语句重置1111 11110.延迟函数在第一个报告已经说出了,不再多说。

51单片机(四位数码管的显示)程序[1]

51单片机(四位数码管的显示)程序[1]

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管 上显示P ”个字符;2)等待按键,如按了任何一个键,则将这 4个字符清除, 改为显示0000”个字符(为数字的0)。

E3最佳答案下面这个程序是4x4距阵键盘丄ED 数码管显示,一共可以到0-F 显示,你可以稍微 改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#i nclude<at89x52.h> un sig ned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang 数码管 0-F 代码void key_delay(void) {int t;for(t=0;t<500;t++);}un sig nedchar k;//设置全局变量k 为键盘的键值键盘延时函数键盘扫描函数 ***************************** *///延时函数voidkeyscan(void)//键盘初始化 //有键按下? //延时 //确认真的有键按下? //使行线 P2.4 为低电平,其余行为高电平 //a 作为缓存 //开始执行行列扫描 {case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd;//使行线 P2.5 为低电平,其余行为高电平a = P2;switch (a)//键盘扫描函数 {unsigned char a;P2 = 0xf0;if(P2!=0xf0){key_delay();if(P2!=0xf0){P2 = 0xfe;key_delay();a = P2;switch (a)case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线 P2.6 为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}} break;}}}}void main(void){while(1){keyscan(); switch(k){case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;**************************** ***主函数 * ********************************** //调用键盘扫描函数 //查找按键对应的数码管显示代码case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case10:P0=Dig[10];break;case11:P0=Dig[11];break;case12:P0=Dig[12];break;case13:P0=Dig[13];break;case14:P0=Dig[14];break;case15:P0=Dig[15];break;default:break; // 退出}}}endWelcome ToDownload !! !欢迎您的下载,资料仅供参考!。

实验二51单片机点亮流水灯

实验二51单片机点亮流水灯
E、压 力:充分认识,合理调节
卒中、心脏病、偏头疼、过敏、哮喘等
(4)体检常用风险评估指标及意义
? 体重与体质指数(BMI)
?血

? 总胆固醇(TC)
? 高密度脂蛋白胆固醇(HDL-C)
? 总胆固醇(TC)/HDL之比:
? 低密度脂蛋白胆固醇(LDL-C)
? 甘油三酯
? 激素替代疗法
? 左心室肥大(LVH)
点评价指标的变化,可对健康干预措施的有效性 进行实时评价和修正。
(5)健康管理人群分类
? 分类标准:
? 健康风险高低:危险因素多少、危险性高低等
? 医疗花费高低:卫生服务利用水平、阈值标准
?目 的:提高干预的针对性和有效性,通过对不同
风险人群采取不同等级的干预手段,达到资源最大利用 、健康的最大效果。
二、健康风险识别 1.健康危险因素 2.评估的一般原理 3.评估的操作方法
二、健康危险因素的概念及分类
? 概念:指机体内外存在的、使疾病发生和死亡概率增加的
诱发因素。 包括: ?个人特征:不良的行为、疾病家族史、职业等 ?环境因素:不良的生活环境和生产环境 ?生理参数:实验室检查结果、体型测量和其他资料 ?疾病或亚临床疾病状态等
果摄入量不足及吸烟,是引起慢性病的重要危险因素。 特点:慢病无法治愈,危险因素可预防控制。与人们的生
活方式密切相关。 ? 主要风险因素:不健康的生活习惯-不健康的饮食、缺乏 运动和体力活动、吸烟和无节制的饮酒等。 ? 预防慢性病最好方法:改善生活方式,减少危险因素。
(3)生活方式相关的危险因素
A、吸 烟:
个人特征、环境因素、生理参数、疾病或临床前疾病状态等
(2)鼓励和帮助人们修正不健康的行为

51单片机实验报告总结

51单片机实验报告总结

51单片机实验报告总结51单片机实验是必修课程之一,目的是让学生了解和掌握嵌入式系统开发的基本原理和方法。

本次实验涵盖了单片机的基本操作、输入输出控制、时序控制、通信技术、中断处理、PWM技术等内容,让我们一步步进入嵌入式系统的世界。

通过这些实验,我们深刻体会到嵌入式系统开发的艰辛和复杂程度。

在每个实验中,我们需要认真思考实验目的,设计符合要求的电路,编写精确并且有效的程序。

我们还要学会阅读芯片数据手册,并对不同的芯片进行适配,合理利用芯片的资源。

这些实战经验对我们今后从事嵌入式系统开发会有很大帮助。

在这些实验中,我们学会了使用单片机进行输入输出控制。

通过外部电路(比如数码管、LED灯、按键等),让单片机可以感知外界的状态变化,并根据程序控制输出对应的信号。

我们实现了按键控制LED灯亮灭、数码管显示数字和摆动等功能。

在实验中我们还学习了流水灯和矩阵键盘控制的实现方法,这给我们后续实验和项目提供了很好的思路和解决方案。

在时序控制实验中,我们掌握了计时器和定时器的基本原理和使用方法。

它们可以精确地生成特定频率和宽度的高低电平,也能间歇性地输出脉冲信号,这为摆线电机的控制和PWM驱动电机等实际应用打下了基础。

通过这些实验,我们更加深入地了解到计时器、定时器和中断的运作原理和使用方法。

在串口通信和I2C通信实验中,我们还学习了如何使用串口和I2C通信实现数据传输,可以将单片机与其他设备进行沟通和交流。

在日常工程开发中,这样的应用场景非常广泛,例如单片机与PC的数据传输、I2C总线上多个设备之间的通信等。

在PWM技术实验中,我们学习了如何使用定时器和PWM输出控制电机转速,这些技术可以实现高精度的电机控制和驱动,这是在机器人控制、智能家居等应用中必不可少的技术。

在这些实验中,我们不仅学会了单片机的基本原理和使用方法,而且也经历了从理论到实践的探索和体验。

这些实验的收获在于训练我们的动手实践能力,增强我们的团队合作精神,提高我们的问题解决能力,也让我们更加深入地了解嵌入式系统的精髓。

51单片机实验

51单片机实验

51单片机实验1、LED灯闪烁实验2、LED流水灯实验3、无源蜂鸣器实验4、继电器控制实验5、数码管显示实验6、独立按键实验1、LED灯闪烁实验#includevoid Delay(unsigned int i) //延时程序,i是形式参数,i为1时延时约1MS{unsigned int j;for(;i>0;i--) //变量i由实际参数传入一个值,因此i不能赋初值for(j=0;j<125;j++) //j由0自增到125 所用的时间大约是1MS{;}}void main() //主函数{P0=0xff; //初始化端口全部置1高电平LED熄灭P1=0xff; //初始化端口全部置1 高电平LED熄灭while(1) //无限循环一直执行以下程序{P0=0x00; //灯亮P1=0x00; //灯亮Delay(500); // 将实际参数500传递给形式参数i,延时500ms 也就是0.5SP0=0xff; //灯灭P1=0xff; //灯灭Delay(500); //将实际参数500传递给形式参数i,延时500ms 也就是0.5S}}2、LED流水灯实验#include函数功能:延时一段时间void Delay(unsigned int i) //延时程序,i是形式参数,i为1时延时约1MS{unsigned int j;for(;i>0;i--) //变量i由实际参数传入一个值,因此i不能赋初值for(j=0;j<125;j++){;}}void main(void){P0=0xff;P1=0xff;while(1) //无限循环执行程序{P0=0xfe; //P0第一个灯亮P1=0xfe; //P1第一个灯亮Delay(200); //调用延时函数P0=0xfd; //P0第二个灯亮P1=0xfd; //P1第二个灯亮Delay(200); //调用延时函数P0=0xfb; //P0第三个灯亮P1=0xfb; //P1第三个灯亮Delay(200); //调用延时函数P0=0xf7; //P0第四个灯亮P1=0xf7; //P1第四个灯亮Delay(200); //调用延时函数P0=0xef; //P0第五个灯亮P1=0xef; //P1第五个灯亮Delay(200); //调用延时函数P0=0xdf; //P0第六个灯亮P1=0xdf; //P1第六个灯亮Delay(200); //调用延时函数P0=0xbf; //P0第七个灯亮P1=0xbf; //P1第七个灯亮Delay(200); //调用延时函数P0=0x7f; //P0第八个灯亮P1=0x7f; //P1第八个灯亮Delay(200); //调用延时函数}}3、无源蜂鸣器实验#includesbit BEEP=P3^6; //定义蜂鸣器控制端P36sbit L00=P0^0; //定义L0.0 LED灯void Delayst(unsigned int i) //延时程序,i是形式参数,i 为1时延时约250US{unsigned int j;for(;i>0;i--) /变量i由实际参数传入一个值,因此i不能赋初值for(j=0;j<31;j++) // 此数值为125时大约延时1MS 由此计算出为1时延时大约8US 31X8=248US≈250US {;}}void Delay(unsigned int i) //延时程序,i是形式参数,i为1时延时约1MS{unsigned int j;for(;i>0;i--) //变量i由实际参数传入一个值,因此i不能赋初值for(j=0;j<125;j++){;}}void main() //主函数{unsigned int j;while(1) //无限循环一直执行以下程序{L00=0; //点亮L00 LED灯for(j=1000;j>0;j--) //蜂鸣器响大约500MS{BEEP = ~BEEP;Delayst(2); //延时500US 发出大约1KHZ频率的响声}L00=1; //熄灭L00 LED灯BEEP=1; //蜂鸣器不响Delay(500); //将实际参数500传递给形式参数i,延时500ms 也就是0.5S}}4、继电器控制实验#include //包含单片机头文件sbit Reley=P3^7; //定义继电器控制端P37sbit L00=P0^0; //定义L0.0 LED灯sbit K5=P1^4; //定义K5独立按键sbit K6=P1^5; //定义K6独立按键void Delay(unsigned int i) //延时程序,i是形式参数,i为1时延时约1MS{unsigned int j;for(;i>0;i--) //变量i由实际参数传入一个值,因此i不能赋初值for(j=0;j<125;j++){;}}void main() //主函数{while(1) //无限循环一直执行以下程序{if(K5==0) //按键K5按下{Delay(20); //延时20MS 按键消抖if(K5==0) //再次确认按键是否按下{L00=0; //点亮L00 LED灯Reley=0; //继电器吸合}}if(K6==0) //按键K6按下{Delay(20); //延时20MS 按键消抖if(K6==0) //再次确认按键是否按下{L00=1; //熄灭L00 LED灯Reley=1; //继电器释放}}}}5、数码管显示实验#include //包含52单片机寄存器定义的头文件void delay(void) //延时函数,延时约0.6毫秒{unsigned char i;for(i=0;i<200;i++); //空循环起延时作用}void main(void){P0=0xff; //初始化端口P2=0xff; //初始化端口while(1) //无限循环//假定数码管从左到右依次是DS0-DS7{P2=0xfe; //P2.0引脚输出低电平,DS0点亮P0=0xf9; //数字1的段码delay();P2=0xfd ; //P2.1引脚输出低电平,DS1点亮P0=0xa4; //数字2的段码delay();P2=0xfb; //P2.2引脚输出低电平,DS2点亮P0=0xb0; //数字3的段码delay();P2=0xf7; //P2.3引脚输出低电平,DS3点亮P0=0x99; //数字4的段码delay();P2=0xef; //P2.4引脚输出低电平,DS4点亮P0=0x92; //数字5的段码delay();P2=0xdf ; //P2.5引脚输出低电平,DS5点亮P0=0x82; //数字6的段码delay();P2=0xbf; //P2.6引脚输出低电平,DS6点亮P0=0xf8; //数字7的段码delay();P2=0x7f; //P2.7引脚输出低电平,DS7点亮P0=0x80; //数字8的段码delay();P2=0xff;}}6、独立按键实验#include#define uchar unsigned char#define uint unsigned int //数据类型的宏定义sbit K1 = P3^2; //定义独立按键K1sbit K2 = P3^3; //定义独立按键K2sbit K3 = P3^4; //定义独立按键K3sbit K4 = P3^5; //定义独立按键K4sbit K5 = P1^4; //定义独立按键K5sbit K6 = P1^5; //定义独立按键K6sbit K7 = P1^6; //定义独立按键K7sbit K8 = P1^7; //定义独立按键K8sbit BEEP = P3^6; //蜂鸣器控制端口P36/* 延时子程序*/void delay1(uchar x){ uchar j;while((x--)!=0){ for(j=0;j<125;j++){;}}}------------------------------------------------- void delay0(uchar x) //x*0.14MS{unsigned char i;while(x--){for (i = 0; i<13; i++) {}}}------------------------------------------------- void delay(uint ms){uchar t;while(ms--){for(t = 0; t < 120; t++);}}-------------------------------------------------void beep() //蜂鸣器响一声函数{unsigned char i;for (i=0;i<100;i++){delay0(4);BEEP=!BEEP; //BEEP取反}BEEP=1; //关闭蜂鸣器delay1(250); //延时}-------------------------------------------------main(){P1 = 0xff; //初始化端口P2 = 0x7f; //初始化端口选通数码管最右侧点亮while(1){P0 = 0xbf; //显示“-”if(K1==0){delay(20);if(K1==0){beep(); //调用蜂鸣器响一声函数告知有按键按下P0 = 0xf9; //显示”1“delay(1000); //延时大约1秒维持显示状态}}else if(K2==0){delay(20); //延时20MS 按键消抖if(K2==0){beep(); //调用蜂鸣器响一声函数告知有按键按下P0 = 0xa4; //显示”2“delay(1000); //延时大约1秒维持显示状态}}else if(K3==0){delay(20); //延时20MS 按键消抖if(K3==0){beep(); //调用蜂鸣器响一声函数告知有按键按下P0 = 0xb0; //显示“3”delay(1000); //延时大约1秒维持显示状态}}else if(K4==0){delay(20); //延时20MS 按键消抖if(K4==0){beep(); //调用蜂鸣器响一声函数告知有按键按下P0 = 0x99; //显示“4”delay(1000); //延时大约1秒维持显示状态}}else if(K5==0){delay(20); //延时20MS 按键消抖if(K5==0){beep(); //调用蜂鸣器响一声函数告知有按键按下P0 = 0x92; //显示“5”delay(1000); //延时大约1秒维持显示状态}}else if(K6==0){delay(20); //延时20MS 按键消抖if(K6==0){beep(); //调用蜂鸣器响一声函数告知有按键按下P0 = 0x82; //显示“6”delay(1000); //延时大约1秒维持显示状态}}else if(K7==0){delay(20); //延时20MS 按键消抖if(K7==0){beep(); //调用蜂鸣器响一声函数告知有按键按下P0 = 0xf8; //显示“7”delay(1000); //延时大约1秒维持显示状态}}else if(K8==0){delay(20); //延时20MS 按键消抖if(K8==0){beep(); //调用蜂鸣器响一声函数告知有按键按下P0 = 0x80; //显示“8”delay(1000); //延时大约1秒维持显示状态}}} }。

51单片机实验报告

51单片机实验报告

实验一数据传送实验实验内容:将8031内部RAM 40H—4FH单元置初值A0H—AFH, 然后将片内RAM 40H—4FH单元中的数据传送到片内RAM 50H—5FH单元。

将程序经模拟调试通过后, 运行程序, 检查相应的存储单元的内容。

源程序清单:ORG 0000HRESET: AJMP MAINORG 003FHMAIN: MOV R0, #40HMOV R2, #10HMOV A, #0A0HA1:MOV @R0, AINC R0INC ADJNZ R2, A1MOV R1,#40HMOV R0, #50HMOV R2, #10HA3: MOV A, @R1MOV @R0, AINC R0INC R1DJNZ R2, A3LJMP 0000H思考题:1.按照实验内容补全程序.2.CP.对8031内部RAM存储器有哪些寻址方式?直接寻址, 立即寻址, 寄存器寻址, 寄存器间接寻址。

3.执行程序后下列各单元的内容是什么?内部RAM 40H~4FH ___0A0H~0AFH______________________内部RAM 50H~5FH___0A0H~0AFH_______________________实验二多字节十进制加法实验实验内容:多字节十进制加法。

加数首地址由R0 指出, 被加数和结果的存储单元首地址由R1指出,字节数由R2 指出。

将程序经模拟调试通过后, 运行程序, 检查相应的存储单元的内容。

源程序清单: ORG 0000HRESET: AJMP MAINORG 0100HMAIN: MOV SP, #60HMOV R0, #31HMOV @R0, #22HDEC R0MOV @R0, #33HMOV R1, #21HMOV @R1, #44HDEC R1MOV @R1, #55HMOV R2, #02HACALL DACNHERE: AJMP HEREDACN: CLR CDAL: MOV A, @R0ADDC A, @R1DA AMOV @R1, AINC R0INC R1DJNZ R2, DALCLR AMOV ACC.0 , CRET思考题:1.按照实验内容补全程序。

51单片机实验报告

51单片机实验报告

51单片机实验报告
摘要
本实验为51单片机模拟实验,在实验中,用单片机程序控制使得
LED灯按一定程序闪烁,以达到模拟的目的。

本实验利用单片机采用闪烁
程序编写实现LED灯和蜂鸣器的模拟输出,实现LED灯按照一定规律闪烁,蜂鸣器产生指定频率。

关键词:51单片机;LED;蜂鸣器;模拟
1实验目的
本实验旨在利用51单片机模拟LED灯和蜂鸣器的闪烁,利用串口助
手模拟输出。

2实验原理
本实验的实验原理主要是利用51单片机程序实现LED的模拟输出,
利用定时器控制LED灯的闪烁,实现LED按规律闪烁;利用PWM控制蜂鸣器,设置频率实现蜂鸣器的模拟输出。

3实验设备
(1)51单片机开发全套组件,包括51单片机主板、串口助手、编
程器;
(2)LED灯;(3)蜂鸣器。

4实验过程
(1)硬件接线:
将51单片机主板的LED0、LED1、LED2和蜂鸣器接到P2口,符合接线图的要求。

(2)编写并烧写程序:
编写程序完成LED灯和蜂鸣器的模拟输出,将程序烧写到51单片机中,实现输出模拟过程。

5实验结果
实验结果表明,实验中所编写的51单片机程序能够正确地控制LED 灯和器的输出,LED灯按一定程序闪烁。

51实验指导书

51实验指导书

《单片机原理及应用》实验指导书温州大学物理与电子信息工程学院2009年9月目录实验一指令和汇编语言 (1)实验二C51序程序设计 (4)实验三I/O和中断实验 (6)实验四定时器计数器实验 (9)实验五键盘显示电路实验 (11)实验六综合设计实验 (21)附录1 Keil 工程文件的建立、设置与目标文件的获得 (27)附录2 C51编程简介 (34)附录3 Keil C51常用库函数原型 (37)实验一指令和汇编语言一、实验目的1、了解单片机开发系统的各主要组成部分,包括PC、仿真器和实验开发系统;2、掌握仿真器及其软件的使用,初步掌握程序的调试方法,包括跟踪、单步运行和断点设置等;3、熟悉51单片机的指令系统,掌握汇编语言程序的设计方法。

二、实验仪器1、自制的C51实验开发板 1块2、直流稳压电源 1台3、仿真器(EASYPROBE) 1只4、PC机 1台三、实验内容1、认识51单片机开发系统的结构。

图1-1 51单片机开发系统的结构2、初步认识仿真器软件和Keil C51软件界面。

3、简单程序调试(1) 传送指令设置内部RAM的值,(30H)=40H, (40H)=10H,单步执行下列程序,检查结果。

MOV R0,#30HMOV A,@R0MOV R1, AMOV B, @R1STOP: SJMP STOP执行后:(R0)= ,(R1)= ,(A)= ,(B)= ,(30H)= ,(40H)= 。

(2) 运算指令4、多字节十进制数加法被加数加数结果低位20H21H22H23H 高位图1-2 4字节十进制数相加两个4字节十进制数1234567和89987265相加,将其8421-BCD码按低位到高位存放在地址为20-23H、30-33H的RAM中,运算结果存放在20-23H的地址中,如上图示。

运算程序如下,ADD_BCD为多字节十进制数加法子程序的首地址。

分别按“跟踪”、“单步”和“全速”方式调试程序。

51单片机数码管显示实验报告

51单片机数码管显示实验报告

51单片机数码管显示实验报告实验目的:1.学习51单片机的编程方法和硬件连接方法;2.掌握使用51单片机驱动数码管显示的方法。

实验器材:1.51单片机开发板;2.公共阳极共阳向数码管一个;3.若干杜邦线。

实验原理:数码管是一种数字显示器件,由7个发光二极管和若干个选通器件构成。

每个发光二极管可以发出两种颜色的光,通常使用红色和绿色。

这篇实验报告以共阳数码管为例,共阳数码管的每个发光二极管的阳极都连接到电源VCC上,而七个阴极分别用来选择一些数字进行显示。

当要选择一些数码管显示时,需要对对应的阴极进行低电平使能,而使能其他阴极保持高电平,这样就可以通过控制每个数码管的阴极低电平使能来选择要显示的数字。

实验步骤:1.将51单片机开发板上的数码管连接到51单片机开发板的P1口和P0口上,连接方式如下图所示:```-----------------VCC-P0.0--,a,-----------------P0.1--,b,------P0.2--,c,---,数字2P0.3--,d,------P0.4--,e,------P0.5--,f,---,数字1P0.6--,g,------P0.7--,h,-----------------------P1.0P1.1```2. 在Keil µVision中新建工程,编写程序。

3.利用P0口控制数码管的阴极,利用P1口选择数码管要显示的数字。

4.在主程序中循环选择每个数码管,并通过P0口设置要显示的数字。

实验结果:```---------------------------------P1.0P1.1P0.6P0.7空空数字2数字1abcdefgh---------------------------------```实验结论:通过本次实验,学习了51单片机的编程方法和硬件连接方法,并掌握了使用51单片机驱动数码管显示的方法。

同时,还了解了数码管的工作原理和编程的基本步骤。

51单片机的40个实验(实例介绍)

51单片机的40个实验(实例介绍)

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,#202个机器周期2D1:MOV R7,#2482个机器周期22+2×248=49820×DJNZ R7,$2个机器周期2×248498DJNZ R6,D12个机器周期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.汇编源程序ORG0START: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-子空间直和的判定与证明

51-子空间直和的判定与证明

51-⼦空间直和的判定与证明⼦空间直和的判定与证明⼀、直和的定义:设V1,V2是线性空间V的⼦空间,如果和V1+V2中每个向量α的分解式α=α1+α2,α1?V1,α2?V2,是惟⼀的,这个和就称为直和,记为V1⊕V2.⼆、判定定理:1.定理:和V1+V2是直和的充分必要条件是等式α1+α2=0,αi?Vi (i=1,2)只有在αi全为零向量时才成⽴.证明:要证明零向量的分解式是唯⼀的即可。

必要性:显然成⽴;充分性:设α?V1+V2,它有两个分解式α=α1+α2=β1+β2,αi,βi?Vi (i=1,2)于是(α1-β1)+(α2-β2)=0.其中αi-βi?Vi (i=1,2).由定理的条件,应有α1-β1=0,αi=βi (i=1,2).这就是说,向量α的分解式是唯⼀的。

2.定理:和V1+V2为直和的充分必要条件是 V1∩V2={0}.证明:充分性:假设α1+α2=0,αi?Vi (i=1,2)那么α1=-α2? V1∩V2.由假设α1=α2=0.这就是证明了V1+V2是直和。

必要性:任取向量α?V1∩V2,于是零向量可以表成0=α+(-α),α?V1,—α?V2.因为是直和,所以α=-α=0,这就证明了V1∩V2={0}.3.定理:设V1,V2是线性空间V的⼦空间,令W= V1+V2,则W= V1⊕V2的充分必要条件是维(W)=维(V1)+维(V2).证明:充分性:维(W)=维(V1)+维(V2),由维数公式知,维(V1∩V2)=0,则 V1∩V2={0},由定理2得,V1+V2是直和。

必要性:因为维(W)+维(V1∩V2)=维(V1)+维(V2),由定理2得,V1+V2是直和的充分必要条件是V1∩V2={0},这与维(V1∩V2)=0等价,则维(W)=维(V1)+维(V2).4.定理:设U是线性空间V的⼀个⼦空间,那么⼀定存在⼀个⼦空间W,使V=U⊕W.证明:取U得⼀组基α1,……,αm,把它扩充为V的⼀组基α1,……,αm,αm+1,……,αn,令W=L(αm+1,……,αn).W即满⾜条件。

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。

最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。

51单片机动态数码管实验报告

51单片机动态数码管实验报告

51单片机动态数码管实验报告
本文介绍了51单片机动态数码管实验的步骤和结果。

动态数码管是一种常用的数字显示器件,它可以显示数字、字母和一
些图形。

在51单片机中,为了控制动态数码管的显示,我们需要使用定
时器和中断。

作为一个经典的单片机实验,动态数码管实验是初学者熟悉51单片机开发的重要步骤之一。

本次实验使用的是常见的4位共阳极动态数码管。

电路图如下:
在电路中使用了四个PNP三极管作为驱动器,共阳极接Vcc(5V),
母线接0V,通过控制每个数码管对应的位选引脚(EN1、EN2、EN3、EN4)来实现选定要显示的数码管,再由程序向选定的数码管的a、b、c、d、e、f、g引脚发送对应的信号,以实现数字显示的功能。

程序上,我们需要使用定时器和中断来驱动动态数码管的显示。

具体
步骤如下:
1.定义计数器和数组,数组定义每位数码管显示的数字,计数器控制
当前轮到哪个数码管显示。

2.初始化定时器和中断,并启动定时器。

3.在中断函数中,将数码管的位选引脚依次拉高并依次向数码管a、
b、c、d、e、f、g中发送数据信号。

4.在每个数码管的对应位选时间内,通过对控制数组的操作,改变数
码管显示的数字。

5.循环执行第3~4步,显示不同的数字。

最后,我们通过改变控制数组的值,实现了动态数码管显示不同数字和字母的功能。

总之,通过动态数码管实验,我们进一步熟悉了51单片机的定时器和中断,了解了动态数码管的驱动原理和程序设计方法,为后续更复杂的单片机实验和应用打下了基础。

51V2.3学习开发板实验指导书

51V2.3学习开发板实验指导书

51V2.3学习开发板实验指导书海创电子科技 V2.3 51单片机开发板实验指导书淘宝网店:/淘宝网店:/淘宝网店:/技术支持:************************@***********************联系电话:189********(陈工)135********(肖工) 137********(谢工)联系 Q Q:89219054 289190987 1271965118 目录海创电子科技 (1)实验指导简要介绍 (4)发光二极管的流水灯实验 (5)一.基本原理 (5)二.软件指导 (5)8位数码管控制显示实验 (6)一.基本原理 (6)二.软件指导 (7)蜂鸣器发声、音乐及继电器实验 (8)一.基本原理 (8)二.软件指导 (8)键盘控制实验 (9)独立键盘 (9)一.基本原理 (9)二.软件指导 (9)4X4矩阵键盘扫描实验 (9)一.基本原理 (10)二.软件指导 (10)定时器使用实验 (10)一.基本原理 (10)二.软件指导 (11)使用定时器产生PWM调制波形的实验 (11)一.基本原理 (11)二.软件指导 (11)18B20温度传感器实验 (12)一.基本原理 (12)二.软件指导 (13)DS1302实时时钟芯片控制与读写实验 (13)一.基本原理 (13)二.软件指导 (13)读写片内EEPROM的实验 (14)一.基本原理 (14)二.软件指导 (14)1602字符型液晶显示器实验 (14)一.基本原理 (14)二.软件指导 (15)12864带字库图形点阵型液晶显示器实验 (16)一.基本原理 (16)二.软件指导 (17)PS2键盘与单片机通信实验 (18)一.基本原理 (18)二.软件指导 (18)8位ADC转换实验 (19)一.基本原理 (19)二.软件指导 (19)10位串行电压型DAC转换实验 (20)一.基本原理 (20)二.软件指导 (21)结束语 (22)实验指导简要介绍V1.4-51单片机学习开发板资源丰富,接口设计灵活,共提供完成大约16个基本模块实验以及综合实验(这些实验只是基本的实验,实际能完成的远远不止这些,用户可以自行设计),下面将详细介绍相关实验模块的硬件连接情况、使用和软件开发等。

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

MCS-51单片机实验指导书编者:朱飞鹏赵勇2009.11.25目录目录.实验一IO口的输出应用 (1)一实验目的 (1)二实验内容 (1)三实验器材 (1)四实验步骤 (1)五附注 (1)六附注例程 (1).实验二IO口的输入应用 (3)一实验目的 (3)二实验内容 (3)三实验器材 (3)四实验步骤 (3)五附注 (3)六实验附注例程 (3).实验三定时器中断实验(PERIODIC INTERRUPT TIMER) (5)一实验目的 (5)二实验内容 (5)三实验器材 (5)四实验步骤 (5)五附注实验例程: (5).实验四外部中断的应用 (9)一实验目的 (9)二实验内容 (9)三实验器材 (9)三实验步骤 (9)四附注 (9)五实验附注例程 (9).实验五单片机串口的应用 (12)一实验目的 (12)二实验内容 (12)三实验器材 (12)四实验步骤 (12)五附注 (12)六附注例程 (12).实验一IO口的输出应用一实验目的通过此次实验学习普通IO口作为输出口的应用。

二实验内容我们通过普通IO口驱动一个LED灯闪烁。

(采用灌电流方式)三实验器材STC89C52RC单片机、LED灯或实验箱。

四实验步骤1在Keil开发环境下建立一个工程。

2程序的编写。

3程序下载调试(可先进行仿真)。

五附注采用灌电流的方式原因:因为单片机输出的电流比较小,当然可以驱动发光二极管,但是在很多时候,例如:我们驱动数码管的时候,会因为输出电流比较小,所以发光二极管不够亮,所以当我们采用灌电流的方式的时候可以避免这一点。

为了防止电流过大烧坏二极管,一般应接200Ω左右的限流电阻。

六附注例程#include <reg51.h>#define unint unsigned int#define unchar unsigned charsbit Led = P1^0; //位定义void delay(unint k) //延时函数{unint i;for(k;k>0;k--)for(i=0;i<121;i++);}void main(){while(1) //死循环{Led = 0; //灌电流方式,低电平点亮delay(1000);Led = 1;delay(1000);}}汇编源代码:LED EQU P1.0 ;宏定义ORG 0000H ;起始地址JMP MAINORG 0100H ;主程序起始地址MAIN: CLR LED ;点亮二极管LCALL DELAY ;延时SETB LED ;息灭二极管LCALL DELAYSJMP MAIN ;相当于C语言中的死循环DELAY: MOV R6,#200 ;延时函数DEL1: MOV R7,#221NOPDEL2: DJNZ R7,DEL2DJNZ R6,DEL1RETEND附实验仿真图:.实验二IO口的输入应用一实验目的通过此次实验学习普通IO口作为输入口的应用,并结合输入输出方式熟练掌握IO口的应用二实验内容采用按键控制一个LED灯的亮灭。

三实验器材STC89C52RC 单片机、LED灯,独立按键或实验箱。

四实验步骤1在Keil开发环境下建立一个工程。

2程序的编写,采用查询方式判断键是否按下,并确定是否点亮二极管。

3程序下载调试(可先进行仿真)。

五附注按键控制LED灯的亮灭,我们可以采用外部中断的方式(实验四会讲),独立按键的接法希望大家注意,直接接地,在没有按键的情况下IO口为高电平(注:因为本实验中按键接P1口,内部集成上拉电阻。

若使用P0口作为通用IO口使用时必须外接500Ω左右的上拉电阻。

见实验四附图2),当有按键按下时IO口为低电平。

六实验附注例程#include <reg51.h>#define unint unsigned int#define unchar unsigned charsbit Led = P1^0;sbit Key = P1^1; //位定义void main(){while(1) //死循环{if(!Key) //判断是否按下按键,按下为0Led = 0; //点亮灯elseLed = 1;}}汇编代码:LED EQU P1.0KEY EQU P1.1ORG 0000JMP MAINORG 0100MAIN: JB KEY,LIGHT ;判断键是否按下CLR LEDSJMP MAINLIGHT: SETB LEDSJMP MAINEND附实验仿真电路:注:若使用实验箱,开关接P1.1即可。

.实验三定时器中断实验(Periodic Interrupt Timer)一实验目的掌握定时器相关寄存器的配置,以及定时时间的计算等二实验内容定期器中断及查询方式控制P1.0口输出方波,用实验箱上的示波器观察波形,不同定时值对其影响。

三实验器材STC89C51RC或实验箱。

四实验步骤1在Keil开发环境下建立一个工程。

2程序的编写,a.定时常数的确定定时器/计数器的输入脉冲周期与机器周期一样,为振荡频率的1/12。

本实验中时钟频率为6.0 MHZ,现要采用中断方法来实现0.5秒延时,要在定时器1中设置一个时间常数,使其每隔0.1秒产生一次中断,CPU响应中断后将R0中计数值减一,令R0=05H,即可实现0.5秒延时。

时间常数可按下述方法确定:机器周期=12÷晶振频率=12/(6×106)=2us设计数初值为X,则(2e+16-X)×2×106=0.1,可求得X=15535化为十六进制则X=3CAFH,故初始值为TH1=3CH,TL1=AFHb.初始化程序包括定时器初始化和中断系统初始化,主要是对IE、TCON、TMOD的相应位进行正确的设置,并将时间常数送入定时器中。

由于只有定时器中断,IP便不必设置。

c.设计中断服务程序和主程序中断服务程序除了要完成计数减一工作外,还要将时间常数重新送入定时器中,为下一次中断做准备。

3 程序下载调试4 附注:定时器常用方式1和方式2(在实验五单片机串口的应用中用到),方式2 为自动重装计数初值的8位定时器,主要用于串行通信中波特率的产生和短时精确定时(因为不必软件重装初值所以更精确)。

五附注实验例程:#include <reg52.h>#define unchar unsigned char#define unint unsigned intsbit fangbo = P1^0;void main(){TMOD = 0x01; //定时器0工作方式1TH0 = 0x3c;TL0 = 0xb0; //装入定时器初值定时50msET0 = 1; //定时器0中断允许EA = 1; //总中断允许TR0 = 1; //定时器0开始计时while(1); //等待}void time0() interrupt 1 //定时器0中断服务函数{TH0 = 0x3c;TL0 = 0xb0; //重装计数器值fangbo=~fangbo; //P1.0取反,产生方波}对应汇编代码:FANGBO EQU P1.0ORG 0000HLJMP MAINORG 000BHLJMP TIMEORG 0010HMAIN: MOV TMOD,#01HMOV TH0,#03CHMOV TL0,#0B0HSETB ET0SETB EASETB TR0SJMP $ ;等待TIME: MOV TH0,#03CHMOV TL0,#0B0HCPL FANGBORETIEND查询方式C代码:#include <reg52.h>#define unchar unsigned char#define unint unsigned intsbit fangbo = P1^0;void main(){TMOD = 0x01; //定时器0工作方式1TH0 = 0x3c;TL0 = 0xb0; //装入定时器初值定时50msET0 = 1; //定时器0中断允许EA =0; //总中断允许TR0 = 1; //定时器0开始计时while(1) //死循环{while(!TF0); //查询中断标志并等待TF0 = 0; //清除标志TH0 = 0x3c;TL0 = 0xb0; //重装初值fangbo=~fangbo; //P1.0取反,产生方波}}对应汇编代码:FANGBO EQU P1.0ORG 0000HLJMP MAINORG 0010HMAIN: MOV TMOD,#01HMOV TH0,#03CHMOV TL0,#0B0HSETB ET0SETB TR0TIME: JNB TF0,$MOV TH0,#03CHMOV TL0,#0B0HCLR TF0CPL FANGBOSJMP TIMEEND附实验仿真电路:注:实验箱中有模拟示波器,可通过电脑观察波形。

.实验四外部中断的应用一实验目的通过此次实验学习51单片机外部中断的使用,并结合输入输出方式熟练掌握外部中断的应用二实验内容采用按键以中断方式控制一个LED灯的亮灭。

三实验器材STC89C52RC 单片机、LED灯,独立按键或实验箱。

三实验步骤1在Keil开发环境下建立一个工程。

2程序的编写,采用中断方式判断键是否按下,并确定是否点亮二极管。

3程序下载调试(可先进行仿真)。

四附注中断方式可以提高CPU的效率,当发生中断事件时处理器可快速响应中断,没有中断事件时处理器正常工作,不必时刻查询中断事件的发生与否,提高代码效率。

本例中,若采用电平触发方式,则Key为低电平时Led亮,否则Led息灭;若采用边沿触发方式,则Key的每个下降沿,即Key由高变为低时,Led的状态改变一次。

五实验附注例程#include <reg52.h>#define unchar unsigned char#define unint unsigned intsbit Led = P1^0;sbit Key = P3^2; //外部中断0引角void main(){IT0 = 0; //外部中断0采用电平触发方式;边沿触发为1下降沿有效EA = 1; //中断允许EX0 = 1; //开外部中断0while(1);}void int0() interrupt 0{Led = 0; //Led 亮while(Key == 0); //等待键释放Led = 1; // Led 灭}/*void int0() interrupt 0 //边沿触发方式中断函数。

每次Key下降沿改变Led状态{Led = ~Led; //改变Led状态}*/对应汇编代码:KEY EQU P3.2LED EQU P1.0ORG 0000HLJMP MAINORG 0003HLJMP INITORG 0010MAIN: CLR IT0 ;电平触发方式,边沿触发为SETB IT0 SETB EASETB EX0SJMP $INIT: CLR LEDJNB KEY,$SETB LEDRETI;INIT: CPL LED ;边沿触发方式中断程序END附实验仿真电路:附图1附图2 P0口上拉电阻.实验五单片机串口的应用一实验目的通过此次实验学习单片机串口的应用,掌握串口相关寄存器的配置,并学会用串口做简单的双机通信。

相关文档
最新文档