登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 单片机中断与数码管显示

[复制链接]
发表于 2022-1-30 21:48:10 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 中断,T0初值的计算
开始时间: 2022-01-27
结束时间: 2022-01-30
单片机中断



数码管依次显示000000~999999


#include<reg52.h>
sbit A2=P2^2;
sbit A1=P2^1;
sbit A0=P2^0;
sbit ENLED=P1^1;


unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                                                                                                                0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char ledbuff[6]={0xff,0xff,0xff,0xff,0xff,0xff};


unsigned int m=0;
unsigned char n=0;
unsigned char i=0;


void main()
{
        unsigned long sec=0;
        EA=1;                                                                        //ê1&#196;ü×ü&#214;D&#182;&#207;
        ENLED=0;
        TMOD=0x01;                                                //T0&#206;a&#196;£ê&#189;1
        TH0=0xfc;                                                        //&#184;&#248;T0&#184;33&#245;&#214;μ0xfc18(T0&#206;a16&#184;&#246;×&#214;&#189;ú)
        TL0=0x18;
        ET0=1;                                                                //ê1&#196;üT0&#214;D&#182;&#207;
        TR0=1;                                                                //T0&#198;&#244;&#182;ˉ
        while(1)
        {
                if(n==1)
                {
                        n=0;
                        sec++;
                        ledbuff[0]=table[sec%10];
                        ledbuff[1]=table[sec/10%10];
                        ledbuff[2]=table[sec/100%10];
                        ledbuff[3]=table[sec/1000%10];
                        ledbuff[4]=table[sec/10000%10];
                        ledbuff[5]=table[sec/100000%10];
                }
        }
}


/*&#182;¨ê±&#198;÷0μ&#196;&#214;D&#182;&#207;·t&#206;&#241;oˉêy*/
void time()interrupt 1
{
        TH0=0xfc;                                                        //&#214;&#216;D&#194;&#188;ó&#212;&#216;3&#245;&#214;μ
        TL0=0x67;
        m++;
        if(m>=1000)
        {
                m=0;
                n=1;
        }
        P0=0xff;                                                  //ò2&#191;é&#184;&#196;&#206;aP0=0x00  &#207;&#212;ê&#190;&#207;&#251;òt
        switch(i)
        {
                case 0:
                        A2=1;A1=0;A0=1; i++; P0=ledbuff[0];
                        break;
                case 1:
                        A2=1;A1=0;A0=0; i++; P0=ledbuff[1];
                        break;
                case 2:
                        A2=0;A1=1;A0=1; i++; P0=ledbuff[2];
                        break;
                case 3:
                        A2=0;A1=1;A0=0; i++; P0=ledbuff[3];
                        break;
                case 4:
                        A2=0;A1=0;A0=1; i++; P0=ledbuff[4];
                        break;
                case 5:
                        A2=0;A1=0;A0=0; i=0; P0=ledbuff[5];
                        break;
                default:break;
        }
}



T0初始值的计算
公式:(2^16 -x)×12÷晶振频率=定时时间(默认单位为:us)
1s=1000ms    1ms=1000us
当晶振频率一定时,若最大定时时间仍小于所需定时时间,那么就需要退一步计算,先找到在范围内
合适的定时时间,再通过循环,来得到所需得定时时间。





好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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