单片机实验记录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)!