《单片机原理及应用》实验指导书(C语言)


    


    单 片 机 原 理 应

    实 验 指 导 书
    (C语言)









    XX学物电学院
    微机教研室 XX
    2011


    前 言


    单片机具高性超型低价格容易产品化等特点仪器仪表智化实时工业控制实时数采集智终端通信设备导航系统家电器等控制应领域具十分广泛途目前国单片机应中MCS51系列单片机然种流单片机实验指导书学MCS51单片机学生配合单片机原理应课程教学结合学院制单片机教学实验板编写实验指导书
    单片机原理应门实践性强课程提高教学质量重环节机实训练学汇编语言程序设计学接口电路外设计算机连接者软硬兼施研制单片机应系统通加强动手获预期效果实验指导书提供实验指导性材料实验定难度选做项目根课时安排教学求进行取舍达某实验目书中提供参考程序实际应中程序会差定优
    时间紧迫需赶课程进度实验时间步加编者学识限妥处欢迎读者批评指正
















    实 验 须 知

    1 实验前必须阅读教科书关部分实验指导书解实验目容步骤做实验前准备工作编写实验中求编修改程序完成实验前求完成准备工作方机实验否机操作
    2 种电源电压极性接错严禁带电接线接插元器件通电前须指导教师检查认方通电
    3 准意拨弄种实验关旋钮开关次实验关设备禁止动摸弄注意安全
    4 严禁手触摸实验系统印制电路板元器件引脚防止静电击穿芯片
    5 实验中损坏仪器元器件应时指导教师报告
    6 实验室保持安静卫生意走动喧哗集中精力完成实验
    7 实验完成关掉电源时整理实验台桌面保持环境整洁
    8 规定认真完成实验报告规定时间缴实验报告
    9 实验实验报告未规定完成学员参加课程考试考查

    单片机实验报告格式


    实验报告标题
    实验目
    二实验容
    三实验设计调试:
    (1)实验分析容
    (2)实验电路:画出实验容关简单实验电路
    (3)实验设计调试步骤:根容写出实验程序调试程序观察结果
    (4)实验调试程中遇问题解决问题思路解决方法
    四实验验教训总结
    五实验课建议

    目 录

    实验 实验板KEIL C51软件 6
    实验二 单片机控制LED灯点亮 12
    实验三 模拟开关灯 16
    实验四 单片机控制数码实验 21
    实验五 中断系统应实验 25
    实验六 LED 数码动态驱动 29
    实验七 定时器计数器 32
    实验八 数字电子钟 36
    实验九 矩阵键盘识实验 37
    实验十 动演奏乐曲 41
    实验十 综合实验 交通信号灯控制器设计 45
    实验十二 教学板检程序设计 46
    实验十三 综合实验:数采集—火灾报警装置软硬件设计 47
    附录:实验教学板电路原理图 48
    实验 实验板Keil C51软件
    实验目
    1 熟悉单片机实验板Keil C51软件
    二实验说明
    实验介绍实验板组成Keil C51软件烧录软件通该实验学生解单片机编程调试方法
    三实验容步骤
    1启动PC机安装Keil C51软件烧录软件串口线连接计算机实验板(USB线提供电源)
    2开Keil uVision2仿真软件首先建立实验项目文件接着建立源程序编译误全速运行程序
    3源程序编译成执行文件烧录器烧录89芯片中
    四Keilc 软件说明


    1开程序: 双击程序

    2新建工程:Project → New Project→保存工程→选择CPU(般选ATMEL公司AT89S51)























    17
    3设置工程右击→Options for Target 1’ →→选择Create HEX (输出HEX文件)


    18
    4新建源文件:选File→New→输入编辑源程序→保存(汇编源程序:文件名asmC源程序:文件名c)

    5工程添加源文件:Project出口File页单击文件组选择Add Files to GroupSource Group 1’选项选择源文件文件类型然点击ADD点击close
    19
















    6编译:点击 右击Target 1 →Build Target F7源程序进行编译程序语法错误时会输出窗口(Output Windows)中显示错误信息警告信息修改编译成功会生成 HEX文件

    7载调试: 编译成功线烧录程序HEX文件载单片机部ROM中运行运行程中发现错误重新修改程序编译载运行


    五烧录软件

    1开线烧录程序
    2选择MCU类型(STC89C51RC)
    1 点击 开工程目录hex文件
    2 选择端口(般COM1)
    3 点击Download烧录程序
    4 开实验板电源(果烧录时候出现问题点击stop)
    注意: 56 两步骤序颠倒点击Download前先关掉实验板电源
















    实验二 单片机控制LED灯点亮

    实验目
    1进步熟悉编程程序调试
    2学P1口方法
    3学延时子程序编写
    二实验说明
    (1)输出控制
    图1示 P1 0端口输出高电P10=1时 根发光二极单导电性 知时发光二极L1熄灭 P1 0端口输出低电 P1 0=0时发光二极L 1亮SETB P10指令 P 1 0端口输出高电 CLR P10指令 P1 0 端口输出低电







    (2)延时子程序设计方法
    作单片机指令执行时间短数量达微秒级果求闪烁时间间隔02秒相微秒说相差太执行某指令时插入延时程序达求样延时程序设计呢?面具体介绍原理:
    石英晶体12MHz1机器周期1微秒
    机器周期 微秒
    MOV R6#20 2机器周期   2
    D1 MOV R7#248 2机器周期   2×20       
    DJNZ R7 2机器周期   2×248×20           
    DJNZ R6D1 2机器周期   2×20=40         10002
    面延时程序时间10002ms
    知R6=10R7=248时延时5msR6=20R7=248时延时10ms基计时单位求02秒=200ms10ms×R5=200msR5=20汇编延时子程序:
    DELAY MOV R5#20
    D1 MOV R6#20
    D2 MOV R7#248
    DJNZ R7
    DJNZ R6D2
    DJNZ R5D1
    RET

    C语言延时子程序:
    void delay02s(void) 延时02秒子程序
    {
    unsigned char ijk
    for(i20i>0i)
    for(j20j>0j)
    for(k248k>0k)
    }

    三实验步骤参考例子
    实验步骤说明:
    实验需单片机应系统
    P1口做输出口程序功发光二极点亮
    1串行数通信线连接计算机实验板USB实验板提供电源
    3开Keil uVision2仿真软件首先建立实验项目文件输入源程序(参考程序1)进行编译直编译误生成hex文件
    5通STC-ISP载软件hex文件载实验板观察发光二极显示情况
    参考例子:
    (1) 点亮板子第灯D0
    (2) 第灯闪烁
    四参考程序
    ()适mini80E实验板
    1)
    #include
    void main()
    {
    P10xfe

    }

    2)
    #include
    #define uint unsigned int
    #define uchar unsigned char
    delay()
    void main()
    {
    while(1)
    { P10xfe
    delay()
    P10xff
    delay()

    }
    }
    void delay()
    {
    uint xy
    for(x100x>0x)
    for(y600y>0y)
    }

    (二)适制系统实验板
    (1)
    #include
    void main (void)
    { P20x00
    P20x10
    P00xfe

    }

    (2)
    #include
    void delay(void)
    void main (void)
    { P20x00
    while(1)
    {P20x10
    P00xfe
    delay()
    P20x00
    P00xff
    delay()

    }

    }

    void delay(void)
    { int xy
    for(x600x>0x)
    for(y100y>0y)
    }


    六实验容
    请keil环境编写程序:
    1)点亮LED(者意LED者意LED)
    2)点亮LED闪烁
    3)点亮板子D0D2D4D6灯D1D3D5D7灯交闪烁
    4)设计出流水灯程序D7—D0D0D7


    实验三 模拟开关灯
    1.实验目
    1进步熟悉编程程序调试
    2学独立键方法
    2.实验说明
    果系统需键直接采IO线构成单键电路键间相互独立根线键状态会影响输入线工作状态称独立式键盘接口电路
    检测否键闭合键闭合键抖动判断键号转入相应键处理编写单片机键盘检测程序时般检测时加入抖延时检测松手时加
    3参考例子
    1)通四键控制LED灯显示情况:
    S1:D0点亮
    S2:D1点亮
    S3:D2点亮
    S4:D3点亮

    4参考程序
    ()适制实验板
    #include
    #define uint unsigned int
    #define uchar unsigned char
    uchar flag
    uchar key_down
    sbit LED2 P0^0
    sbit LED3 P0^1
    sbit LED4 P0^2
    sbit LED5 P0^3
    ****************************
    void delay(uint k)
    {
    uint data ij
    for(i0i{for(j0j<121j++)
    {}}
    }
    **********************************
    uchar scan_key(void)
    {
    uchar temp
    tempP3
    return temp
    }
    ***********************************
    void main(void)
    {
    key_down0
    P30xf7
    P20x10
    P00xff
    while(1)
    {
    P30xf7
    if((P30xf7)&&(key_down0))
    {
    delay(20)
    if((P30xf7)&&(key_down0))
    {
    flagscan_key()
    key_down1
    switch(flag)
    {
    case 0xe7LED2 ~LED2break
    case 0xd7LED3 ~LED3break
    case 0xb7LED4 ~LED4break
    case 0x77LED5 ~LED5break

    default
    break
    }
    }
    }
    if(P30xf7)
    {
    key_down0
    }

    }
    }
    (二)适mini80E板
    #include
    #define uint unsigned int
    #define uchar unsigned char
    uchar flag
    ****************************
    void delay(uint k)
    {
    uint data ij
    for(i0i{for(j0j<121j++)
    {}}
    }
    **********************************
    uchar scan_key(void)
    {
    uchar temp
    tempP3
    return temp
    }
    ***********************************
    void main(void)
    {
    while(1)
    {
    P30xff
    if(P30xff)
    { delay(20)
    if(P30xff) flagscan_key()
    }
    else flag0
    switch(flag)
    {
    case 0xfeP10xfebreak
    case 0xfdP10xfdbreak
    case 0xfbP10xfbbreak
    case 0xf7P10xf7break

    defaultP10xffbreak
    }
    }
    }

    include
    #define uint unsigned int
    #define uchar unsigned char
    uchar flag
    uchar key_down
    sbit LED2 P1^0
    sbit LED3 P1^1
    sbit LED4 P1^2
    sbit LED5 P1^3
    ****************************
    void delay(uint k)
    {
    uint data ij
    for(i0i{for(j0j<121j++)
    {}}
    }
    **********************************
    uchar scan_key(void)
    {
    uchar temp
    tempP3
    return temp
    }
    ***********************************
    void main(void)
    {
    key_down0
    P30xff
    P10xff
    while(1)
    {
    P30xff
    if((P30xff)&&(key_down0))
    {
    delay(20)
    if((P30xff)&&(key_down0))
    {
    flagscan_key()
    key_down1
    switch(flag)
    {
    case 0xfeLED2 ~LED2break
    case 0xfdLED3 ~LED3break
    case 0xfbLED4 ~LED4break
    case 0xf7LED5 ~LED5break

    default
    break
    }
    }
    }
    if(P30xff)
    {
    key_down0
    }

    }
    }

    5实验容
    1)8键分应8盏led灯亮灭(针制教学板)
    2)通四键控制LED灯显示情况:
    S1:D0D3点亮
    S2:D2点亮
    S3:D0D7点亮
    S4:D0D5点亮

    实验四 单片机控制数码实验
    实验目
    1 掌握数码显示出字符
    2 进步掌握延时子程序

    二实验原理
    1数码两种接法











    2 阴极数码编码
    § 0x3f 0x06 0x5b 0x4f 0x66 0x6d
    § 0 1 2 3 4 5
    § 0x7d 0x07 0x7f 0x6f 0x77 0x7c
    § 6 7 8 9 A B
    § 0x39 0x5e 0x79 0x71 0x00
    § C D E F 显示
    请思考阳极数码编码
    三参考例子
    1)第数码显示8字
    A) MINI80E实验板(阴极) 数码选通通P2口控制三八译码器第数码显示8字数码位选关闭开第数码位选控制位选P2口输出数位0xf7(二进制1111 0111)位选确定确定段选显示8dp段0余段1P0口输出0x7f(二进制0111 1111)
    B) 制实验板(阳极)数码选通通P2口控制第数码显示8字数码位选关闭开第数码位选控制位选P2口输出数位0x08(二进制0000 1000)位选确定确定段选显示8dp段1余段0P0口输出0x80(二进制1000 0000)
    2)四数码显示1234

    位选:接P2口
    左边四数码 DS3 DS2 DS1 DS0
    应P2口: 0xf3 0xf2 0xf1 0xf0
    右边四数码 DS3 DS2 DS1 DS0
    应P2口: 0xf7 0xf6 0xf5 0xf4

    段选:接P0口

    四参考程序
    ()mini80e实验板
    1)
    #include

    void main(void)
    {
    while(1)
    {
    P20xf7
    P00x7f

    }
    }

    2)
    #include
    #define uint unsigned int
    #define uchar unsigned char
    void delay()

    void main(void)
    {
    while(1)
    {
    P20xf7
    P00x66
    delay()
    P20xf6
    P00x4f
    delay()
    P20xf5
    P00x5b
    delay()
    P20xf4
    P00x06
    delay()
    }
    }

    void delay() 延时程序1
    {
    uint xy
    for(x2x>0x)
    for(y112y>0y)

    }
    (二)制教学实验板(阳极数码)
    (1)
    #include

    void main(void)
    {
    while(1)
    {
    P20x08
    P00x80

    }
    }

    2)
    #include
    #define uint unsigned int
    #define uchar unsigned char
    void delay()

    void main(void)
    {
    while(1)
    {
    P20x08
    P00x99
    delay()
    P20x04
    P00xb0
    delay()
    P20x02
    P00xa4
    delay()
    P20x01
    P00xf9
    delay()
    }
    }

    void delay() 延时程序1
    {
    uint xy
    for(x2x>0x)
    for(y112y>0y)

    }
    五原理图












    六实验容
    1)位数码循环显示0-9
    2)数码显示字母AF
    3) 交点亮4数码(例:开始时数码显示器右边位显示10字隔05秒0字左移1位直左边位停止显示)
    4)结合实验3实现键数字应

    实验五 中断系统应实验
    实验目
    1掌握外部中断技术基方法
    2掌握中断处理程序编写方法
    二实验说明
    1外部中断初始化设置三项容:中断总允许EA1外部中断允许EXi1(i01)中断触发方式设置中断触发方式设置般两种方式:电触发方式脉(边)触发方式实验选者前次高电次低电时效中断请求高电状态低电状态少维持周期中断请求信号引脚INT0(P32)INT1(P33)引入实验INT0(P32)引入
    2中断控制原理:
    中断控制提供户中断控制手段实际控制寄存器51系列目控制寄存器四:TCON IE SCON IP
    3中断响应程:
    首先中断采样然中断查询中断响应采样中断处理第步实验脉方式中断请求两相邻周期采样先高电低电中断请求效IE0IE1置1否继续0谓查询CPU测试TCONSCON中标志位状态确定没中断请求发生中断请求中断响应中断请求接受中断查询进行查询效中断请求响应次中断
    4 8051中断系统
    8051中断系统包括5中断源提供两优先级允许户中断源进行独立控制中断优先级设置8051支持5中断源分外部中断0定时器0溢出中断外部中断1定时器1溢出中断串口中断 应中断号01234寄存器4工作组切换03C51中中断服务程序中断函数方式时实现
    5中断函数格式:
    void 函数名() interrupt 中断号 using 工作组
    { 中断服务程序容 }
    三参考例子
    1) 右边三数码000开始进行加法计数动键时计数暂停继续计数

    四参考程序
    ()适制教学实验板
    #include
    #define uchar unsigned char
    #define uint unsigned int
    sbit P37P3^7
    uchar code table[10] {0xc00xf90xa40xb00x990x920x820xf80x800x90}
    uchar code wei[4] {0x080x040x020x01}
    ***************************************************************
    uint cnt
    bit flag
    **********************************************
    void init(void)
    {
    bit flag0 设置标志
    EA1开中断
    EX01 外部中断0开中断
    IT01 外部中断0触发方式

    }
    **************************************************
    void delay(uint k)
    {
    uint data ij
    for(i0i {
    for(j0j<121j++){}
    }
    }
    **************************************************
    void main(void)
    { uchar i
    P370
    init()
    while(1)
    {
    if(flag)cnt++
    if(cnt>999)cnt0
    for(i0i<100i++)
    {
    P0table[cnt100]
    P2wei[2]
    delay(1)
    P0table[(cnt100)10]
    P2wei[1]
    delay(1)
    P0table[cnt10]
    P2wei[0]
    delay(1)
    }
    }
    }
    ************************************************
    void extern_int0(void) interrupt 0 using 0
    {
    flagflag
    }

    (二)适MINI80E实验板
    #include
    #define uchar unsigned char
    #define uint unsigned int
    sbit P37P3^7
    uchar code table[10] {0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f}
    uchar code wei[4] {0xf70xf60xf50xf4}
    ***************************************************************
    uint cnt
    bit flag
    **********************************************
    void init(void)
    {
    bit flag0 设置标志
    EA1开中断
    EX01 外部中断0开中断
    IT01 外部中断0触发方式

    }
    **************************************************
    void delay(uint k)
    {
    uint data ij
    for(i0i {
    for(j0j<121j++){}
    }
    }
    **************************************************
    void main(void)
    { uchar i
    P370
    init()
    while(1)
    {
    if(flag)cnt++
    if(cnt>999)cnt0
    for(i0i<100i++)
    {
    P0table[cnt100]
    P2wei[2]
    delay(1)
    P0table[(cnt100)10]
    P2wei[1]
    delay(1)
    P0table[cnt10]
    P2wei[0]
    delay(1)
    }
    }
    }
    ************************************************
    void extern_int0(void) interrupt 0 using 0
    {
    flagflag
    }

    五实验容
    1外部中断1实现述功(注意C51中中断号)
    2数码0000开始计数高两位低两位独立计数采两键应前两位暂停继续应两位暂停继续











    实验六 LED 数码动态驱动
    实验目
    1 学 LED 数码动态驱动编程
    2 学定时计数器
    二实验容
    编写程序实验板4LED数码稳定显示4数字四位数0000开始秒钟加
    三实验说明
    前面实验中已够某 LED 数码显示需数字选第 LED显示1隔较短时间( 5 毫秒)关闭第 LED第二 LED 显示2周复始 4 LED 次显 1234 4 LED 稳定显示 4 数字然瞬间 LED 点亮家亮时间相均 5 毫秒4 LED数码点亮遍需 20 毫秒秒钟亮 50 次会闪烁感亮度实验四中 LED 亮度四分
    实现隔 5 毫秒变换 LED方法定时器中断
    四参考程序
    ()制实验教学板C51参考程序:
    #include
    #define U8 unsigned char
    U8 tab[] {0xc00xf90xa40xb00x990x920x820xf80x800x90}
    U8 scn[] {0x010x020x040x08}先点亮左边数码
    U8 buf[4] {0000} 显示缓区开机先显示0000
    U8 cnt 0 扫描计数
    void main(void)
    { EA 1 允许中断
    TMOD 0x01 设定时器 0 模式 1(16 位)
    ET0 1 定时器 0 中断允许
    TH0 0xee 晶振 110592MHz5mS
    TL0 0
    TR0 1 开始计数
    while(1) 死循环等中断
    }
    void timeint(void) interrupt 1 定时器 0 中断服务程序
    { char i
    TH0 0xee 设置定时器时间常数
    TL0 0
    i cnt & 0x03 求应点亮 LED 号(左右次 0123)
    P0 tab[buf[i]] 笔划代码送 P0 口
    P2 scn[i] 控制扫描码送 P2 口
    if(cnt200)
    { cnt0 1 秒钟显示数字加
    for(i3i>0i)
    { buf[i]++
    if(buf[i]10) buf[i]0 加 10 前进位
    else break
    }
    }
    cnt++
    }

    (二)mini80e实验板C51参考程序:
    #include
    #define U8 unsigned char
    U8 tab[] {0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f}
    U8 scn[] {0xf40xf50xf60xf7}先点亮左边数码
    U8 buf[4] {0000} 显示缓区开机先显示0000
    U8 cnt 0 扫描计数
    void main(void)
    { EA 1 允许中断
    TMOD 0x01 设定时器 0 模式 1(16 位)
    ET0 1 定时器 0 中断允许
    TH0 0xee 晶振 110592MHz5mS
    TL0 0
    TR0 1 开始计数
    while(1) 死循环等中断
    }
    void timeint(void) interrupt 1 定时器 0 中断服务程序
    { char i
    TH0 0xee 设置定时器时间常数
    TL0 0
    i cnt & 0x03 求应点亮 LED 号(左右次 0123)
    P0 tab[buf[i]] 笔划代码送 P0 口
    P2 scn[i] 控制扫描码送 P2 口
    if(cnt200)
    { cnt0 1 秒钟显示数字加
    for(i3i>0i)
    { buf[i]++
    if(buf[i]10) buf[i]0 加 10 前进位
    else break
    }
    }
    cnt++
    }

    五实验容
    1键控制数码意键相应数码实现数字加1
    2 4 LED 数码 0000 开始秒钟动加 1前两位代表分两位代表秒?

    实验七 定时器计数器

    实验目
    1学89C51部定时计数器编程方法
    2进步掌握中断处理程序编写方法
    二实验说明
    151单片机两16位部定时器计数器(TCTimer Counter)计数部晶振驱动时钟定时器计数8051输入引脚脉信号计数器定时器实际工作计数方式固定频率脉计数脉周期固定计数值计算出时间定时功
    定时器关寄存器工作方式寄存器TMOD控制寄存器TCONTMOD设置定时器计数器工作方式03确定定时计数TCON功定时器溢出时设定标志位控制定时器运行停止等
    2TMOD




    1) M1M0工作方式控制位
    2) CT 定时器方式计数器方式选择位
    CT1时 计数器方式 CT 0时 定时器方式 
    3)GATE 定时器计数器运行门控标志位
    GATE1时 TC启动受双重控制求INT0 (INT1)引脚高电TR0(TR1 )置 1 时 相应TC选通工作GATE0 TC启动仅受TR0 ( TR1)控制置 1 TC选通 INT0 ( INT1)电高低
    3TCON




    TF0TF1分定时器计数器T0 T1 溢出中断标志位 加法计数器计满溢出时置1 申请中断 中断响应动复 0TF产生中断申请否接受 需中断否开放决定TR1TR0 分定时器 计数器T1 T0 运行控制位 通软件置 1 定时器 计数器开始工作 系统复位时清 0
    4初始化
    1)初始化步骤
    51系列单片机TC前应进行编程初始化TCONTMOD编程需计算装载TC计数初值般完成步骤:
    (1)确定TC工作方式——编程TMOD寄存
    (2)计算TC中计数初值装载THTL
    (3)TC中断方式工作时必须开CPU中断源中断——编程IE寄存器
    (4)启动定时器计数器——编程TCON中TR1TR0位
    2)计数初值计算
    (1)定时器计数初值:
    定时器方式TC机器周期脉计数fOSC6MHZ机器周期12fOSC2us
    方式0 13位定时器定时间隔213*2us16384ms
    方式1 16位定时器定时间隔216*2us131072ms
    方式2 8位定时器定时间隔28*2us512us
    TC工作定时器方式1时求定时1ms求计数值设计数初值x:
    (216x)*2us1000us 推出x216500
    THTL置65 536500
    (2)计数器计数初值
    计数器方式:
    方式0 13位计数器满计数值2138192
    方式1 16位计数器满计数值21665 536
    方式2 8位计数器满计数值28256
    TC工作计数器方式2时求计数10脉计数初值设计数初值x
    28x10 x 2810
    THTL25610
    三参考例子
    1)设单片机晶振频率 12 MHz利定时器P10脚输出周期 2 ms方波
    分析:选定时器 计数器T0 作定时器 输出P10 引脚 2 ms 方波间隔 1 ms高低电相间成 隔 1 ms P10 取反次方波
    机器周期12÷12MHz 1 μs
    1 msT0 需计数N次 N 1 ms÷1 μs 1000
    计数器计数1000计数定时器溢出必须定时器置初值:65 5361000
    2) P17端接发光二极求利TC控制LED亮1s灭1s周复始
    分析:求定时1sTC三种工作方式满足(什?)较长时间定时应采符合定时方法
    l TC0工作定时器方式1定时100ms定时时间P10反相P10端输出周期200ms方波脉设TC1工作计数器方式2T1输出脉计数计满5次定时1s时间P17端方改变灯状态
    l 采6MHZ晶振方式1定时达100ms100ms机器周期12fOSC2us需计数次数100*1000250 000初值65 53650 000
    方式2满5次溢出中断初值2565

    四参考程序
    ()适制实验教学板
    1)设置周期2ms方波
    查询方式:
    #include
    sbit P1_0P1^0
    void main()
    {
    TMOD0x01 TCO工作定时器方式1 16位定时器
    TR01 启动TC0
    for() 程序循环
    {
    TH0(655361000)256 预置计数初值
    TL0(655361000)256
    do
    {
    P1_0P1_0 P10取反
    TF00 软件清TF0
    }while(TF0) 查询等TF0置位
    }

    }

    中断方式:
    #include
    sbit P1_0P1^0

    void timer0(void) interrupt 1 using 1 TC中断服务程序入口
    {
    TF00 清楚中断标志位
    P1_0P1_0 P10取反
    TH0(655361000)256 计数初值重装载
    TL0(655361000)256
    }
    void main()
    {
    TMOD0x01 TCO工作定时器方式1
    P1_00
    TH0(655361000)256 预置计数初值
    TL0(655361000)256
    EA1 CPU开中断
    TF00
    ET01 TC0开中断
    TR01 启动TC0开始定时
    do
    {}while(1)

    }




    2) 灯闪烁时间间隔1s(P10P35相连作定时器1输入)
    #include
    sbit P1_0P1^0
    sbit P0_7P0^7


    timer0() interrupt 1 using 1 TC0中断服务程序入口
    {
    TF00 清楚中断T0标志位
    P1_0P1_0 P10取反
    TH0(655361000)256 计数初值重装载
    TL0(655361000)256
    }

    timer1() interrupt 3 using 2 TC1中断服务程序入口
    {
    TF10 清楚中断T1标志位
    P0_7P0_7 1s灯改变状态
    }

    void main()
    {
    P20x10 开LED电源开关
    P0_71 置灯初始灭
    P1_01 保证第次方便开始计数
    TMOD0x61 TCO工作定时器方式1TC1工作计数器方式2

    TH0(6553610000)256 预置计数初值 10毫秒
    TL0(6553610000)256
    TH1256100
    TL1256100
    IP0X08 置优先级存储器
    EA1 CPU开中断
    TF00 清中断T0标志位
    TF10 清中断T1标志位
    ET01 TC0开中断
    ET11 TC1开中断
    TR01 启动TC0开始定时
    TR11 启动TC1
    do{}
    while(1)
    }

    (二)适MINI80E实验板
    (2)P07P35相连作定时器1输入
    #include
    sbit P1_0P1^0
    sbit P0_7P0^7

    timer0() interrupt 1 using 1 TC0中断服务程序入口
    {
    TF00 清中断T0标志位
    P0_7P0_7 P10取反
    TH0(655361000)256 计数初值重装载
    TL0(655361000)256
    }

    timer1() interrupt 3 using 2 TC1中断服务程序入口
    {
    TF10 清中断T1标志位
    P1_0P1_0 1s灯改变状态
    }

    void main()
    {
    P20x10 开LED电源开关
    P0_71 置灯初始灭
    P1_01 保证第次方便开始计数
    TMOD0x61 TCO工作定时器方式1TC1工作计数器方式2

    TH0(6553610000)256 预置计数初值 10毫秒
    TL0(6553610000)256
    TH1256100
    TL1256100
    IP0X08 置优先级存储器
    EA1 CPU开中断
    TF00 清中断T0标志位
    TF10 清中断T1标志位
    ET01 TC0开中断
    ET11 TC1开中断
    TR01 启动TC0开始定时
    TR11 启动TC1
    do{}
    while(1)
    }
    五电路图














    六实验容
    1)利定时计数器T1产生定时时钟P1口(P0口)控制8发光二极8指示灯次闪动闪动频率10次秒(8灯次亮遍周期)循环





    实验八 数字电子钟
    实验目
    进步熟悉定时计数器
    二实验容
    实验板编写程序实现电子钟功时间显示格式 HHMM中间数点秒钟闪烁次两键控制分时调整次分者时加1
    三实验说明
    前面实验钟 LED 数码笔划代码均含数点(h 位 1数点亮)第 2 LED 数点秒前半秒亮半秒灭应定时器中断子程序中判断前时间前半秒动态扫描第 2 LED 时笔划代码取出 0xDF 相写入 P0 口

    实验九 矩阵键盘识实验

    实验目
    1掌握矩阵键盘检测原理
    二实验说明
    1矩阵式键盘中行列线分连接键开关两端行线通拉电阻接+5V键时行线处高电状态键时行列线导通时行线电行线相连列线电决定点识矩阵键否关键然矩阵键盘中行线列线键相连键否均影响该键行线列线电键间相互影响必须行线列线信号配合起作适处理确定闭合键位置
    扫描方式利CPU完成工作空余调键盘扫描子程序响应键盘输入求执行键功程序时CPU响应键输入求直CPU重新扫描键盘止键盘扫描程序般应包括容:
    (1)判键
    (2)键盘扫描取闭合键行列值
    (3)计算法查表法键值
    (4)判断闭合键否释放没释放继续等
    (5)闭合键键号保存时转执行该闭合键功

    三参考例子
    1)矩阵键盘面key0key15第数码分显示09AF

    四参考程序
    1)矩阵键盘(适MINI80E板)
    #include
    #define uchar unsigned char
    #define uint unsigned int
    uchar code DIS_SEG7[16]{0x3f0x060x5b0x4f0x66
    0x6d0x7d0x070x7f0x6f0x770x7c0x390x5e0x790x71}
    uchar code DIS_BIT[8]{0xf70xf60xf50xf40xf30xf20xf10xf0}
    uchar code SKEY[16]{1314150910111256781234}
    uchar code act[4]{0xf70xfb0xfd0xfe}

    void delay(uint k)
    {
    uint data ij
    for(i0ifor(j0j<121j++)
    {}}
    }

    char scan_key(void)
    {
    uchar ijininiinj
    bit find0
    for(i0i<4i++)
    {
    P3act[i]
    delay(10)
    inP3
    inin>>4
    inin|0xf0
    for(j0j<4j++)
    {
    if(act[j]in)
    {find1
    injjinii
    }
    }
    }
    if(find0)return 1
    return (ini*4+inj)
    }

    void main(void)
    { char c
    uchar key_value
    while(1)
    {
    cscan_key()
    if(c1)key_valueSKEY[c]
    P0DIS_SEG7[key_value]
    P2DIS_BIT[0]
    delay(2)
    }
    }
    (二)适制教学实验板
    #include
    #define uchar unsigned char
    #define uint unsigned int
    uchar code DIS_SEG7[8]{0xc00xf90xa40xb00x99
    0x920x820xf8}
    uchar code DIS_BIT[4]{0x080x040x020x01}
    uchar code SKEY[8]{45670123}
    uchar code act[4]{0xf70xfb0xfd0xfe}

    void delay(uint k)
    {
    uint data ij
    for(i0ifor(j0j<121j++)
    {}}
    }

    char scan_key(void)
    {
    uchar ijininiinj
    bit find0
    for(i0i<2i++)
    {
    P3act[i]
    delay(10)
    inP3
    inin>>4
    inin|0xf0
    for(j0j<4j++)
    {
    if(act[j]in)
    {find1
    injjinii
    }
    }
    }
    if(find0)return 1
    return (ini*4+inj)
    }

    void main(void)
    { char c
    uchar key_value
    while(1)
    {
    cscan_key()
    if(c1)key_valueSKEY[c]
    P0DIS_SEG7[key_value]
    P2DIS_BIT[0]
    delay(2)
    }
    }


    五电路图
    1)矩阵键盘





    实验十 动演奏乐曲
    实验目
    (1)进步熟悉 89C51 定时器计数器功应
    (2)掌握初始化中断服务程序编程方法
    (3)掌握定时器计数器产生频率方波编程方法
    二实验容
    单片机定时器计数器 0 作定时器工作模式 1中断产生方波发声根
    简谱中音阶频率计算应定时时间常数定时器中断常数赋初值发
    出应音调歌曲音调节拍编成表(数组)音调作定时器初值节
    拍控制发音时间 实现动演奏乐曲
    三实验说明
    产生音阶定时初值计算:
    根表音阶频率计算应音阶周期 T T2 计算定时周期数(晶振110592MHz)填入表中定时器计数初值 65536-定时周期数程序计算产生定时周期数增加 1 倍音阶降低八度定时周期数降低 1 倍音阶升高八度



    音阶表编码规音阶 17 1117 表示高八度音阶 17 2127 表示低八度
    音阶 1.7. 17 表示
    节拍表编码规1 拍 16约 570mS12 拍 814 4类推
    面康定情歌简谱编码行数字音阶编码行数字节拍编码



    动演奏康定情歌乐曲 C51 程序:
    () 适mini80E板
    #include
    #define U8 unsigned char
    sbit SPKP1^2
    sbit P3_2P3^2
    code unsigned int cyc[]{180016001440135112001079960}音阶 17 半周期数
    code U8 tone[]{1315161615161312121315161615161313 131516
    16151613121215131213121112661215131266151312131211
    126560xff} 乐曲康定情歌简谱表
    code U8 time[]{888448812488844816888844881248844
    448248248248168884444816832} 节拍表
    U8 H0L0cnt
    void cntint0(void) interrupt 1 定时器 0 中断产生音阶方波
    { TH0H0
    TL0L0
    SPK~SPK P12 音乐信号输出脚P12 反相产生方波
    }
    void cntint1(void) interrupt 3 定时器 1 中断产生节拍延时
    { cnt++ 计数初值 0赋值
    }
    void main(void)
    { U8 iat
    unsigned int b
    nextTMOD0x11
    EA1
    ET01
    ET11
    cnt0
    TR11
    i0
    while(1)
    { ttone[i] 读音调
    if(t0xff) break 0xff 结束符
    if(t0) 0 休止符
    { bcyc[t101] 根基音阶求出半周期数
    if(t<10) bb*2 低八度音阶半周期数加倍
    if(t>20) bb2 高八度音阶半周期数减半
    H0(65536b)256 根半周期数计算 T0 初值高字节低字节
    L0(65536b)256
    TR01 启动定时器 0 发音
    }
    cnt0
    atime[i] 读节拍
    while(a>cnt)
    TR00
    i++
    for(b0b<1000b++) 稍加延时增强节奏感
    }
    SPK1 关闭喇叭
    while(P3_21) 等 INT 键
    goto next 重放遍
    }

    (二) 适制实验教学板
    #include
    #define U8 unsigned char
    sbit P2_5P2^5
    sbit P3_2P3^2
    code unsigned int cyc[]{180016001440135112001079960}音阶 17 半周期数
    code U8 tone[]{1315161615161312121315161615161313 131516
    16151613121215131213121112661215131266151312131211
    126560xff} 乐曲康定情歌简谱表
    code U8 time[]{888448812488844816888844881248844
    448248248248168884444816832} 节拍表
    U8 H0L0cnt
    void cntint0(void) interrupt 1 定时器 0 中断产生音阶方波
    { TH0H0
    TL0L0
    P2_5~P2_5 P25 音乐信号输出脚P25 反相产生方波
    }
    void cntint1(void) interrupt 3 定时器 1 中断产生节拍延时
    { cnt++ 计数初值 0赋值
    }
    void main(void)
    { U8 iat
    unsigned int b
    nextTMOD0x11
    EA1
    ET01
    ET11
    cnt0
    TR11
    i0
    while(1)
    { ttone[i] 读音调
    if(t0xff) break 0xff 结束符
    if(t0) 0 休止符
    { bcyc[t101] 根基音阶求出半周期数
    if(t<10) bb*2 低八度音阶半周期数加倍
    if(t>20) bb2 高八度音阶半周期数减半
    H0(65536b)256 根半周期数计算 T0 初值高字节低字节
    L0(65536b)256
    TR01 启动定时器 0 发音
    }
    cnt0
    atime[i] 读节拍
    while(a>cnt)
    TR00
    i++
    for(b0b<1000b++) 稍加延时增强节奏感
    }
    P2_50 关闭喇叭
    while(P30x7b) 等 INT 键
    goto next 重放遍
    }

    五思考题
    1)程序改成演奏乐曲
    2)键设计成16(8)音调意弹奏想表达歌曲
    实验十 综合实验 交通信号灯控制器设计
    实验目
    学定时器综合运
    二实验容
    参实验实验二电路实验三程序编写交通信号灯控制器程序实验板
    左边两数码发光二极分作南北方红绿灯时间显示右边两数码
    发光二极分作东西方红绿灯时间显示图示求南北方绿灯亮
    25 秒红灯亮 30 秒东西方绿灯亮 30 秒红灯亮 25 秒
    三实验说明
    时间显示参前面实验程序采动态扫描方式
    四思考题
    1键盘设置红绿灯亮时间
    2设定时间保存 flash 存储器中开机动设定时间运行




    实验十二 教学板检程序设计
    实验目
    1.通实验掌握EEPROM
    2 掌握串行AD应
    3 掌握单片机串行通信收发接口
    4.学系统应程序设计调试方法
    二实验设备
    PC机台 实验教学板块
    三实验容原理
    程序运行前先TXDRXD短接
    程序完成功:
    1.检程序先数码点亮显示0~9秒变换次
    2 编写走马灯程序LED逐位显示次
    3检程序EEPROM单元置0读出检查否0置EEPROM单元FFH读出检查否全1成功显示器显示— — — 1
    4启动串行口进行发收检查发收数否相成功显示— — — 2
    5 启动AD数码显示AD转换值
    6 等键键蜂鸣器发声05秒次
    四实验求
    1.实验题目求设计硬件电路画出电路原理图
    2 求画出程序子程序中断服务程序流程图设计出相应程序程序加较详细注释
    3 Keil C51编译环境完成程序编译
    4 通载线载软件STCISP V39编译程序载单片机
    5 运行程序实验结果验证程序正确性达求分析原查找错误修改源程序次汇编连接载运行直达题目求
    思考题
    1 8路AD原电路应作修改?
    2块实验板串行通信速度高够做少波特率?请出计算方法 初始设置程序

    实验十三 综合实验:数采集—火灾报警装置软硬件设计
    实验目
    1.掌握串行AD应
    2 掌握单总线器件18B20应
    3 掌握温度检测方法
    4.学系统应程序设计调试方法
    二实验设备
    PC机台 实验教学板块18B20芯片块390欧电阻1K电位器
    三实验容原理
    完成火灾数采集系统硬件电路设计编写调试运行程序系统技术指标:
    1系统监测1路燃气体浓度
    注:传感器浓度00~100LEL(Low Expiosion Limit爆炸极限)输出4~20mA信号(电位器代)
    2系统监测1路温度变化值
    3设干位显示设置键进行浓度温度显示转换
    4系统设置气体浓度安全值温度变化安全值
    5旦超出安全范围进入动报警
    四实验求
    1.实验题目求设计硬件电路画出电路原理图
    2 说明电路原理设计指标系统操作方法
    3 求画出程序子程序中断服务程序流程图设计出相应程序程序加较详细注释
    4 Keil C51编译环境完成程序编译
    5 通载线载软件STCISP V39编译程序载单片机
    6 运行程序实验结果验证程序正确性达求分析原查找错误修改源程序次汇编连接重新载运行直达题目求

    附录:实验教学板电路原理图






    仅供参考
    文档香网(httpswwwxiangdangnet)户传

    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 2 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    单片机原理与接口技术实验指导书(2018修订)

    本课程是电子信息工程、通信工程、信息工程和自动化专业必修的专业实验课程。通过本课程的教学,使学生深刻体会到单片机原理与接口技术的应用,掌握汇编和C51语言的语法和技巧,熟悉电子系统的设计和调试过...

    3年前   
    610    0

    编译原理实验指导书

    目 录相关问题说明 1实验题 2实验1 词法分析(2课时) 3实验2 语法分析(2课时) 5实验3 语义分析(2课时) 7实验4 代码生成(2课时) 9参考书目 11相关问题说明本课程共有4个...

    3年前   
    587    0

    汇编原理实验指导书

    第一部分 汇编语言程序的上机过程 1 一、 建立汇编语言的工作环境 1 二、在计算机上运行汇编语言的步骤 1 三、 建立ASM文件 1 四、 用MASM程序产生OBJ文件 3 五、 ...

    5年前   
    1109    0

    电子测量原理实验指导书

    电子测量原理实验指导书XX大学自动化学院目 录电子测量实验系统组成原理及操作………………………… 1电子计数器原理及应用……………………………………… 10示波器原理及应用…………………...

    3年前   
    607    0

    (1小时学会C语言51单片机)C语言入门教程

    △Victor Hugo 维克多?雨果相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚, 更不用说他的英文全称和简称了。...

    4年前   
    743    0

    单片机原理及应用试题答案

    单片机原理及应用试题答案

    4年前   
    1091    0

    单片机原理及应用课程设计

    单片机课程设计数字音频频率测试仪班级:电气姓名:学号:日期:2010年X月X日 目录一、课程设计要求···········································1软硬...

    3年前   
    809    0

    计算机组成原理实验指导书

     计算机组成原理 实验指导书 目 录 实验一 8位算术逻...

    5年前   
    1513    0

    c语言实验报告

    c语言实验报告  学号:__________    姓名:__________    班级:__________    日期:__________   指导教师:__________    成...

    11年前   
    805    0

    C语言实验报告《指针》

    C语言实验报告《指针》  学号:__________    姓名:__________    班级:__________    日期:__________   指导教师:__________ ...

    11年前   
    966    0

    C语言实验报告《数组》

    C语言实验报告《数组》  学号:__________    姓名:__________    班级:__________    日期:__________  指导教师:__________  ...

    11年前   
    889    0

    C语言实验报告《综合实验》

    C语言实验报告《综合实验》  学号:__________    姓名:__________    班级:__________    日期:__________  指导教师:__________...

    10年前   
    872    0

    C语言综合实验2报告

    实验报告实验名称 小型学生信息管理系统 实验项目 编写一学生信息管理系统,用来管理学生基本信息及成绩信息专业班级 姓名 学号 指导教师 成...

    3年前   
    450    0

    C语言实验报告《函数》

    C语言实验报告《函数》  学号:__________    姓名:__________    班级:__________    日期:__________  指导教师:__________  ...

    12年前   
    1374    0

    C语言程序设计实验报告

    C语言程序设计实验报告  实验名称 计算出1000以内10个最大素数之和   实验目的   1、熟练掌握if、if…else、if…else if语句和witch语句格式及使用方法,掌握if语...

    10年前   
    965    0

    c语言综合性实验总结

    华北科技学院计算机学院综合性实验实 验 报 告 课程名称 程序设计语言(C) 实验学期 2011 至 2012 学年 第 二 学期学生所在学...

    4年前   
    601    0

    C语言程序设计实验教案

     《高级语言程序设计》 实验指导书 实验一 顺序结构程序设计 一、实验目的及要求 1. 掌握C语言中使用最多的一种语句—...

    5年前   
    1476    0

    《数据库原理及应用》实验报告

     数据库原理及应用 实验报告 实验课程: 学 号: 学生姓名: ...

    5年前   
    4493    0

    实验2.正规式的定义与应用 编译原理实验报告

    实验2. 正规式的定义与应用一、 实验目的1. 熟悉正规式的构造方法;2. 熟悉从字符串中识别特定字符串的方法;3. 复习对文件的操作。二、 实验内容和要求已知一段C语言程序:#include...

    1年前   
    414    0

    C语言代码大全

     乘法口诀表 #include <stdio.h> #include <conio.h> void main(void) { int i,j,x,y; clrscr(); pr...

    5年前   
    1770    0

    文档贡献者

    文***品

    贡献于2020-11-21

    下载需要 2 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档