做出实验五定时器的应用的原理图及代码
时间: 2024-11-25 10:33:30 浏览: 9
基于STM32F103C8T6芯片的定时器外部中断实验.rar
### 实验五 定时器的应用
#### 实验原理图
**原理图 1:**
- **定时器设计一个叮咚门铃**
- **元件**:
- 51单片机
- 按键 (K7)
- 扬声器 (SP)
- **连接**:
- K7 连接 P1.7
- SP 连接 P3.0
- 电源和地线连接
**原理图 2:**
- **定时器定时每隔 1s 数码管动态显示 0-99 和对应 LED 亮灭**
- **元件**:
- 51单片机
- 4位一体共阳数码管
- 8个 LED 灯
- **连接**:
- 数码管的位选和段选连接到 P3.0 和 P3.1
- 8个 LED 灯连接到 P2 口
- 电源和地线连接
**原理图 3:**
- **集成 8位一体共阳数码管实时显示时分秒**
- **元件**:
- 51单片机
- 8位一体共阳数码管
- **连接**:
- 数码管的位选和段选连接到 P3.0 和 P3.1
- 电源和地线连接
#### 参考代码
**1. 定时器设计一个叮咚门铃**
```c
#include <reg51.h>
sbit k7 = P1^7;
sbit sp = P3^0; // 扬声器
unsigned int a = 0; // 叮咚声音持续多长的变量
void delay(unsigned int i) {
while (i--);
}
void Timer0() interrupt 1 {
sp = !sp;
a++;
if (a < 500) {
TH0 = (65536 - 700) / 256; // 先高音,约 714Hz
TL0 = (65536 - 700) % 256;
} else if (a < 1200) {
TH0 = (65536 - 1000) / 256; // 后低音,500Hz
TL0 = (65536 - 1000) % 256;
} else {
TR0 = 0;
a = 0;
}
}
int main() {
sp = 0; // 蜂鸣器关
IE = 0x82; // 开中断
TMOD = 0x01;
TH0 = (65536 - 700) / 256; // 先高音,约 714Hz
TL0 = (65536 - 700) % 256;
while (1) {
k7 = 1; // 作输入时须先写 1
if (k7 == 0) {
delay(1000);
if (k7 == 0) {
TR0 = 1;
while (k7 == 0);
}
}
}
}
```
**2. 定时器定时每隔 1s 数码管动态显示 0-99 和对应 LED 亮灭**
```c
#include <reg51.h>
#define uchar unsigned char // 宏定义
#define uint unsigned int
sbit wexu = P3^0; // 位选定义(74hc573的 LE)
sbit duxu = P3^1; // 段选定义(74hc573的 LE)
uchar time = 0; // 中断次数统计变量初始化
uchar shu = 0;
uchar shi;
uchar ge;
// 0~9的共阳数码管段码表
uchar code ledmod[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
void delayms(uint y) {
uint i, j;
for (i = y; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display(uchar shu) {
shi = shu / 10; // 获取十位
ge = shu % 10; // 获取各位
wexu = 1; // 打开位选选数据锁存器 U3
P2 = 0x04; // 选中第 3个(共阳)数码管显示即 wei3 (0000 0100)
duxu = 1; // 打开段选选数据锁存器 U2
P0 = ledmod[shi]; // 显示十位
delayms(5);
P0 = 0xff; // 消隐
wexu = 1; // 打开位选选数据锁存器 U3
P2 = 0x08; // 选中第 4个(共阳)数码管显示即 wei4 (0000 1000)
duxu = 1; // 打开段选选数据锁存器 U2
P0 = ledmod[ge]; // 显示个位
delayms(5);
P0 = 0xff; // 消隐
}
void main(void) {
TMOD = 0x01; // 使用定时器 T0,方式 1
TH0 = (65536 - 50000) / 256; // 将定时器计时时间设定为 50ms=50000us
TL0 = (65536 - 50000) % 256;
EA = 1; // 启动总中断
ET0 = 1; // 定时器 T0中断允许
TR0 = 1; // 启动定时器 T0
while (1) {
display(shu);
P1 = shu; // P2口控制 8只灯从 0-99每间隔为 1s显示,共显示 0-99的 100种状态
}
}
void time0() interrupt 1 using 1 // 定时器 T0中断服务函数(1s计时)
{
TR0 = 0; // 关闭定时器 T0
time++; // 每 50ms来一次中断,中断次数 time加 1
if (time == 20) // time=20时,说明每 1s到了
{
time = 0; // 先清零 time次数的计数,为下一秒计数准备
shu++; // 1s到了,shu加 1
if (shu == 100) // shu=100,就清零
shu = 0;
}
TH0 = (65536 - 50000) / 256; // 重新给计数器 T0赋初值
TL0 = (65536 - 50000) % 256;
TR0 = 1; // 启动定时器 T0
}
```
这些代码和原理图可以帮助你在实验中实现定时器的应用,包括叮咚门铃和数码管显示等功能。希望对你有所帮助!
阅读全文