自学内容网 自学内容网

单片机实验记录3

定时计数实验

【实验目的】

1)学习使用单片机定时/计数器

2)在程序中添加定时/计数功能,将相关程序部署在仿真环境中,观察运行的情况.

【实验内容】

必做:应用定时器中断和数码管,实现10秒倒计时功能

【实验代码】

必做:应用定时器中断和数码管,实现10秒倒计时功能

#include<reg51.h>  // 包含51单片机的寄存器定义头文件

sbit LED = P1^0;  // 将P1口的第0位定义为LED,用于控制LED灯
unsigned char count = 0;  // 定义一个计数变量count,用于记录定时器中断的次数
unsigned char seconds = 10;  // 定义一个变量seconds,用于记录剩余的秒数

// 数码管段码表(共阳极)
unsigned char code table[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
unsigned char code table10[] = {0xC0,0xF9};
// 延时函数,用于产生一定的延迟时间
void delay(unsigned int i)
{
unsigned int j,k;
for (; i >0; i--)
{       // 外层循环,重复5次,每次约1ms
for (j = 0; j < 142; j++)
for (k = 0; k < 123; k++);
}
}

// 显示数码管函数
void display(unsigned char num)
{
P2 = table[num%10];// 输出段码到P2口,个位
P3 = table10[num/10];// 输出段码到P3口,十位
}

// 主函数
void main()
{
TMOD = 0x01;  // 设置定时器0为模式1(16位定时器)
TH0 = (65536-50000)/256;  // 设置定时器初值高8位
TL0 = (65536-50000)%256;  // 设置定时器初值低8位,50ms
EA = 1;  // 开启总中断
ET0 = 1;  // 开启定时器0中断
TR0 = 1;  // 启动定时器0
while(1)
{
display(seconds);  // 显示当前秒数
}
}

// 定时器0中断服务程序
void time0(void) interrupt 1
{
TH0 = (65536-50000)/256;  // 重新加载定时器初值高8位
TL0 = (65536-50000)%256;  // 重新加载定时器初值低8位
count++;  // 计数器加1
if(count >= 20)  // 如果计数器达到20次,1秒
{
count = 0;  // 重置计数器
seconds--;  // 秒数减1
if(seconds == 0)
{
seconds = 10;  // 重置秒数为10
}
}
}

【原理图】

【实验结果截图及说明】

说明:

初始化:在main函数中,定时器被配置为模式1(16位定时器),并设置了初始值以产生50ms的中断周期。同时,启用了总中断和定时器0中断,并启动了定时器。

显示倒计时:在主循环中,通过调用display函数,将当前的秒数显示在两个七段数码管上。display函数根据输入的数字,从段码表中获取相应的段码,并将其输出到P2和P3端口。

定时器中断:每50ms触发一次定时器中断,中断服务程序会重新加载定时器的初值,并增加计数器count。当计数器达到20次时(即1秒),计数器被重置,秒数seconds减1。如果秒数减到0,则重置为倒计时秒数。

倒计时效果:

必做程序实现了一个从10秒倒计时到0秒的效果,每秒更新一次显示。当倒计时结束时,秒数会重置为10,重新开始倒计时。

选做程序实现了一个从60秒倒计时到0秒的效果,每秒更新一次显示。当倒计时结束时,秒数会重置为60,重新开始倒计时。


原文地址:https://blog.csdn.net/zzl040203/article/details/143837676

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!