单 片 机 原 理 应
实 验 指 导 书
(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
{}}
}
**********************************
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
{}}
}
**********************************
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
{}}
}
**********************************
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(i0i
{}}
}
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(i0i
{}}
}
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)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档