登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[学习心得] 定时器与数码管基础

[复制链接]
发表于 2021-1-15 21:28:53 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 定时器与数码管基础
开始时间: 2021-01-12
结束时间: 2021-01-13
     /*我用的是金沙滩的开发版,跟大家的不太一样,但应用的原理应该是一样的。
         这部分是在学校的时候看的,当时没有掌握,回家后有看了一遍才看懂。
         这个是在学完这部分后自己练习的让数码管静态显示秒表的倒计时的代码。
         这是总结的使用定时器的步骤:

   <1>设置特殊功能寄存器TMOD,配置号工作模式。如TMOD= 0x01;
   <2>设置计数寄存器TH0和TL0的初值。                     如TL0=FF,TH0=A5,计算公式:x*12/11059200=0.025(溢出一次所需的时间),y=65535-x,再将得到的y值转换成十六进制就得到了初值
   <3>设置TCON,通过TR0置1来让计时器开始计数。如TR0=1
   <4>判断TCON寄存器的TF0位,检测计时器的溢出情况。  
      */
#include <reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned char code LedChar[]={
           0xC0,  0xF9,   0xA4,  0xB0,   0x99,  0x92,  0x82,  0xF8,  
                                         0x80,  0x90,   0x88,  0x83,   0xC6,  0xA1,  0x86,  0x8E
                                         };     //用数组来储存数码管的真值表
void main()
{
     unsigned char cnt = 0;         //记录T0中断次数
     unsigned char sec = 15;         //记录经过的秒数
                 ENLED = 0;              //使能U3,选择数码管DS1
                 ADDR3 = 1;
                 ADDR2 = 0;
                 ADDR1 = 0;
                 ADDR0 = 0;
                 
                 TMOD = 0x01;         //设置T0为模式1
                 TH0 = 0xA5;        //为T0赋初值为0xA5FF
                 TL0 = 0xFF;
                 TR0 = 1;              //启动定时器
                 while(1)
                 {
                     if(TF0 == 1)             //判断T0是否溢出
                                 {
                                                 TF0 = 0;     //T0溢出后,清零中断标志
                                                 TH0 = 0xA5;        //重新赋初值
                                                 TL0 = 0xFF;
                                                 cnt++;                //记录溢出次数
                                                 if(cnt >= 40)     //判断T0溢出是否达到40次
                                                 {
                                                                 cnt = 0;          //计数值清零
                                                                 P0 = LedChar[sec];      //将当前秒数对应的真值表中的值送到P0
                                                                 sec--;               //对应秒数自加1
                                                                 if(sec<=1)
                                                                 {
                                                                      sec = 15;          //秒数超过15后,重新从0开始
                                                                 }
                                                 }
                                 }
                 }
                 
                 

好懒~~不想说~~~
 楼主| 发表于 2021-1-15 22:04:38 | 显示全部楼层
sec--;后的注释应该是::对应秒数自减1  
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表