找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1991|回复: 0
收起左侧

单片机点阵时钟源码

[复制链接]
ID:130000 发表于 2016-7-11 12:21 | 显示全部楼层 |阅读模式
#include <reg52.h>
#define uint unsigned int        //数据类型宏定义,表示范围从0~65535
#define uchar unsigned char       //数据类型宏定义,表示值范围从0~255

uchar aa, bb, cc;
uchar miao, fen, shi;
uchar a_1, a_2, a_3, a_4;
uchar num1, num2;

sbit a = P0 ^ 0;//定义管脚
sbit b = P0 ^ 1;//
sbit c = P0 ^ 2;//
sbit d = P0 ^ 3;//
sbit e = P0 ^ 4;//
sbit f = P0 ^ 5;//
sbit g = P0 ^ 6;//
sbit h = P0 ^ 7;//

sbit zuo_1 = P1 ^ 0;//定义管脚
sbit zuo_2 = P1 ^ 1;//
sbit zuo_3 = P1 ^ 2;//
sbit zuo_4 = P1 ^ 3;//

sbit s1 = P1 ^ 4;//定义按键
sbit s2 = P1 ^ 5;//

void chushihua();
void guanjiao(uchar n);
void yanshi(uint z);
void xianshi();
void jianpan();
void write_shi(uchar shu);
void write_fen(uchar shu);
void xiaodou();

void main()
{
        chushihua();

        for (;;)
        {
               
                        if (miao == 60)
                        {
                                miao = 0; fen++;
                        }
                        write_fen(fen);
                        if (fen == 60)
                        {
                                fen = 0; shi++;
                        }
                        write_shi(shi);
                        if (shi == 24)
                        {
                                shi = 0;
                        }

                }
                jianpan();
                xianshi();
        }


void jianpan()//键盘扫描
{
        if (s2 == 0)           //判断s2是否被摁下,如果是则进入if循环语句
        {
                xiaodou();
        }     
        if (s2 == 0)        //再次判断s2是否被摁下

        {               
                fen++;                        
        }
        if (s1 == 0)           //判断s1是否被摁下,如果是则进入if循环语句
        {
                xiaodou();
        }
        if (s1 == 0)        //再次判断s1是否被摁下
        {
        shi++;
        }        
}
void xianshi()//显示函数
{
        zuo_1 = 0;
        guanjiao(a_1);
        yanshi(2);
        zuo_1 = 1;

        guanjiao(11);
        yanshi(1);


        zuo_2 = 0;
        guanjiao(a_2);
        yanshi(2);
        zuo_2 = 1;

        guanjiao(11);
        yanshi(1);


        zuo_3 = 0;
        guanjiao(a_3);
        yanshi(2);
        guanjiao(bb);
        yanshi(2);
        zuo_3 = 1;

        guanjiao(11);
        yanshi(1);


        zuo_4 = 0;
        guanjiao(a_4);
        yanshi(2);
        zuo_4 = 1;

        guanjiao(11);
        yanshi(1);
}
void chushihua()//初始化函数
{
        TMOD = 0x01;        //设定时器0为工作方式1
        EA = 1;             //开总中断
        ET0 = 1;            //开定时器0中断
        TH0 = (65535 - 50000) / 256;       //对定时器0
        TL0 = (65535 - 50000) % 256;       //赋予初值

        TR0 = 1;                       //启动定时器0

        aa = 0, bb = 10, cc = 0, miao = 0, fen = 0, shi = 0;
        zuo_1 = 1; zuo_2 = 1; zuo_3 = 1; zuo_4 = 1;
        num1 = 0; num2 = 0;



}
void yanshi(uint z)//延时函数
{
        uint x, y;
        for (x = z; x>0; x--)                //若for循环中数值为真,则维持循环,一旦为假,
                for (y = 110; y>0; y--);         //则退出循环语句,以此来达到延时的目的
}
void guanjiao(uchar n)//管脚显示函数
{
        switch (n)
        {
        case 0:a = 0; b = 0; c = 0; d = 0; e = 0; f = 0; break;
        case 1:b = 0; c = 0; break;
        case 2:a = 0; b = 0; g = 0; e = 0; d = 0; break;
        case 3:a = 0; b = 0; g = 0; c = 0; c = 0; d = 0; break;
        case 4:f = 0; g = 0; b = 0; c = 0; break;
        case 5:a = 0; f = 0; g = 0; c = 0; d = 0; break;
        case 6:a = 0; f = 0; e = 0; d = 0; c = 0; g = 0; break;
        case 7:a = 0; b = 0; c = 0; break;
        case 8:a = 0; b = 0; c = 0; d = 0; e = 0; f = 0; g = 0; break;
        case 9:a = 0; b = 0; c = 0; d = 0; f = 0; g = 0; break;
        case 10:h = 0; break;
        case 11:a = 1; b = 1; c = 1; d = 1; e = 1; f = 1; g = 1; g = 1; f = 1; g = 1, h = 1; break;
        case 12:h = 1; break;
        }
}
void xiaodou()//消抖函数
{
        uchar x;
        for (x = 15; x > 0; x--) //若for循环中数值为真,则维持循环,一旦为假,则退出循环语句,以此来达到延时的目的
        {
                xianshi();
        }
}
void write_shi(uchar shu)//写小时函数
{
        uchar shiwei, gewei;       //定义十位和个位数据类型
        shiwei = shu / 10;          //将一个数进行十位和
        gewei = shu % 10;//小时的拆分

        a_4 = shiwei;
        a_3 = gewei;
}
void write_fen(uchar shu)//写分钟函数
{
        uchar shiwei, gewei;       //定义十位和个位数据类型
        shiwei = shu / 10;          //将一个数进行十位和
        gewei = shu % 10;           //分钟的拆分

        a_2 = shiwei;
        a_1 = gewei;

}
void timer()interrupt 1//中断服务函数
{
        TH0 = (65535 - 50000) / 256;        // 对定时器0的高8位
        TL0 = (65535 - 50000) % 256;       //和低8位赋予初值
        aa++;     //定时器0每溢出一次aa的值加1,时间为50000*12/12M=0.05S
        
        if (aa >= 10)
        {
                bb = 10, cc = 0;
                if (aa == 20)
                {
                        aa = 0; miao++; bb = 12, cc = 1;
                }
        }

}



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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