找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3752|回复: 7
打印 上一主题 下一主题
收起左侧

时钟+温度+程序

  [复制链接]
跳转到指定楼层
楼主


#include <STC12C2052AD.h>  
#include <intrins.h>
/*-----------------------------------接口定义-------------------------------------*/
sbit vcc1=P3^1;
sbit vcc2=P3^4;
sbit vcc3=P3^5;
sbit vcc4=P1^1;
         
sbit LEDa=P3^2;
sbit LEDb=P1^0;
sbit LEDc=P1^3;
sbit LEDd=P1^5;
sbit LEDe=P1^6;
sbit LEDf=P3^3;     
sbit LEDg=P1^2;
sbit LEDp=P1^4;

sbit key=P3^7;                           
sbit beep=P3^0;                        
/*-------------------------------------变量定义-------------------------------------*/
unsigned char menu;        
unsigned char code numtab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};        
unsigned char sec,min,hour,T_time;
bit p_sw;
/*-------------------------------------延时函数-------------------------------------*/
void delayms (unsigned int a){
        unsigned int i;
        while( --a != 0){
                for (i = 0; i < 12; i++);
        }
}
/*----------------------------------数码管驱动函数----------------------------------*/
void displayoff (void)                 
{                  
        vcc1=0;
        vcc2=0;
        vcc3=0;
        vcc4=0;
        
        LEDa=1;
        LEDb=1;
        LEDc=1;
        LEDd=1;
        LEDe=1;
        LEDf=1;
        LEDg=1;
        LEDp=1;

//        delayms(1);
}
/***********************************************************************************/
void bit1 (unsigned char d)        
{
        unsigned char i;
        i=d&0x01;
        if (i==0x01){
                vcc1=1;LEDa=0;}delayms(15);displayoff();
        i=d&0x02;
        if (i==0x02){
                vcc1=1;LEDb=0;}delayms(15);displayoff();
        i=d&0x04;
        if (i==0x04){
                vcc1=1;LEDc=0;}delayms(15);displayoff();
        i=d&0x08;
        if (i==0x08){
                vcc1=1;LEDd=0;}delayms(15);displayoff();
        i=d&0x10;
        if (i==0x10){
                vcc1=1;LEDe=0;}delayms(15);displayoff();
        i=d&0x20;
        if (i==0x20){
                vcc1=1;LEDf=0;}delayms(15);displayoff();
        i=d&0x40;
        if (i==0x40){
                vcc1=1;LEDg=0;}delayms(15);displayoff();
        i=d&0x80;
        if (i==0x80){
                vcc1=1;LEDp=0;}delayms(15);displayoff();
}
/***********************************************************************************/
void bit2 (unsigned char d)
{
        unsigned char i;
        i=d&0x01;
        if (i==0x01){
                vcc2=1;LEDa=0;}delayms(15);displayoff();
        i=d&0x02;
        if (i==0x02){
                vcc2=1;LEDb=0;}delayms(15);displayoff();
        i=d&0x04;
        if (i==0x04){
                vcc2=1;LEDc=0;}delayms(15);displayoff();
        i=d&0x08;
        if (i==0x08){
                vcc2=1;LEDd=0;}delayms(15);displayoff();
        i=d&0x10;
        if (i==0x10){
                vcc2=1;LEDe=0;}delayms(15);displayoff();
        i=d&0x20;
        if (i==0x20){
                vcc2=1;LEDf=0;}delayms(15);displayoff();
        i=d&0x40;
        if (i==0x40){
                vcc2=1;LEDg=0;}delayms(15);displayoff();
        i=d&0x80;
        if (i==0x80){
                vcc2=1;LEDp=0;}delayms(15);displayoff();
}
/***********************************************************************************/
void bit3 (unsigned char d)
{
        unsigned char i;
        i=d&0x01;
        if (i==0x01){
                vcc3=1;LEDa=0;}delayms(15);displayoff();
        i=d&0x02;
        if (i==0x02){
                vcc3=1;LEDb=0;}delayms(15);displayoff();
        i=d&0x04;
        if (i==0x04){
                vcc3=1;LEDc=0;}delayms(15);displayoff();
        i=d&0x08;
        if (i==0x08){
                vcc3=1;LEDd=0;}delayms(15);displayoff();
        i=d&0x10;
        if (i==0x10){
                vcc3=1;LEDe=0;}delayms(15);displayoff();
        i=d&0x20;
        if (i==0x20){
                vcc3=1;LEDf=0;}delayms(15);displayoff();
        i=d&0x40;
        if (i==0x40){
                vcc3=1;LEDg=0;}delayms(15);displayoff();
        i=d&0x80;
        if (i==0x80){
                vcc3=1;LEDp=0;}delayms(15);displayoff();
}
/***********************************************************************************/
void bit4 (unsigned char d)
{
        unsigned char i;
        i=d&0x01;
        if (i==0x01){
                vcc4=1;LEDa=0;}delayms(15);displayoff();
        i=d&0x02;
        if (i==0x02){
                vcc4=1;LEDb=0;}delayms(15);displayoff();
        i=d&0x04;
        if (i==0x04){
                vcc4=1;LEDc=0;}delayms(15);displayoff();
        i=d&0x08;
        if (i==0x08){
                vcc4=1;LEDd=0;}delayms(15);displayoff();
        i=d&0x10;
        if (i==0x10){
                vcc4=1;LEDe=0;}delayms(15);displayoff();
        i=d&0x20;
        if (i==0x20){
                vcc4=1;LEDf=0;}delayms(15);displayoff();
        i=d&0x40;
        if (i==0x40){
                vcc4=1;LEDg=0;}delayms(15);displayoff();
        i=d&0x80;
        if (i==0x80){
                vcc4=1;LEDp=0;}delayms(15);displayoff();
}
/***********************************************************************************/
void display(unsigned char l,unsigned char d)
{
        switch (l)                        
        {                                       
                case 1:                          
                        bit1(d);                 
                        break;               
                case 2:                        
                        bit2(d);               
                        break;        
                case 3:                        
                        bit3(d);                 
                        break;        
                case 4:                        
                        bit4(d);                 
                        break;        
        }
}
/*--------------------------------A/D转换初始化函数--------------------------------*/
void read_init (unsigned char CHA)
{
        unsigned char AD_FIN=0; //存储A/D转换标志
    CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)
    ADC_CONTR = 0x40;                //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
    _nop_();
    ADC_CONTR |= CHA;       //选择A/D当前通道
    _nop_();
    ADC_CONTR |= 0x80;      //启动A/D电源
    delayms(1);            //使输入电压达到稳定(1ms即可)
}
/*-----------------------------------A/D读取函数-----------------------------------*/
unsigned char T_read (void){
        unsigned char AD_FIN=0; //存储A/D转换标志
    ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    while (AD_FIN ==0){     //等待A/D转换结束
        AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
    }
    ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,
return (ADC_DATA/2);          //返回A/D转换结果(8位)
}
/*--------------------------------------主函数--------------------------------------*/        
void main(void)
{                                                                           
        unsigned char temp,j,temperature;
        unsigned char ahour,amin;
        bit        a_sw,a_temp;

        TMOD=0x01;//定时器工作方式1
        
        TH0=0x3C;//定时器初始产生50ms时基信号
        TL0=0xB0;//定时器初始产生50ms时基信号
        
        EA=1;//开总中断

        read_init(7);

        temperature=T_read();

        P1M0=0x80;
        P1M1=0x02;
        P3M0=0x00;
        P3M1=0x32;
/************************************************************************************/
        while(1)
        {
                if (ahour==hour&&amin==min&&sec==0&&a_sw&&a_temp&&menu!=2&&menu!=3&&menu!=7&&menu!=8)
                {                                                                                                         
                        menu=9;
                }

                if (sec==1&&min==0&&menu!=9)               
                {
                        beep=1;
                }
/*-----------------------------------菜单切换程序-----------------------------------*/
                if (menu==0)
                {
                        display(1,0x40);
                        display(2,0x40);
                        display(3,0x40+0x80);
                        display(4,0x40+0x80);                          

                        if (key==0)               
                        {
                                temp++;
                                if (temp>10)                                       
                                {
                                        temp=0;
                                        ET0=1;//开定时器中断
                                        TR0=1;//启动定时器
                                        menu=1;
                                        while (key==0);
                                }
                        }                        
                }
/************************************************************************************/
                if (menu==1)                                
                {                                       
                        if (hour<10)                                
                        {
                                display(1,0x00);
                        }        
                        else
                        {
                                display(1,numtab[hour/10]);
                        }
                        display(2,numtab[hour%10]);               
                        display(3,numtab[min/10]+(sec%2)*0x80);        
                        display(4,numtab[min%10]+(sec%2)*0x80);        

                        if (T_time>7)
                        {
                                menu=5;
                        }
               
                        if (key==0)                                                        
                        {                                
                                temp++;
                                T_time=0;
                                if (temp>150)
                                {
                                        temp=0;
                                        menu=2;
                                        while (key==0);
/*                                        {
                                                if (hour<10)                                    
                                                {                                       
                                                        display(1,0x00);                                
                                                }
                                                else
                                                {
                                                        display(1,numtab[hour/10]);
                                                }
                                                display(2,numtab[hour%10]);               
                                                display(3,0x80);                        
                                                display(4,0x80);
                                        }                         */
                                }
                        }
                        if (key==1&&temp>10)        
                        {
                                temp=0;
                                T_time=0;
                                menu=6;
                        }
                }
/************************************************************************************/
                if (menu==2)
                {
                        if (hour<10)                                    
                        {                                       
                                display(1,0x00);                                
                        }
                        else
                        {
                                display(1,numtab[hour/10]);
                        }
                        display(2,numtab[hour%10]);               
                        display(3,0x80);                        
                        display(4,0x80);
               
                        if (key==0)                                       
                        {                                       
                                temp++;
                                if (temp>150)
                                {
                                        temp=0;
                                        menu=3;
                                        while (key==0);
/*                                        {
                                                display(3,numtab[min/10]+0x80);                 
                                                display(4,numtab[min%10]+0x80);                  
                                        }                                                                                  */
                                }
                        }
                        if (key==1&&temp>10)        
                        {
                                temp=0;
                                hour++;
                                if (hour>23)
                                {
                                        hour=0;
                                }
                                sec=0;
                        }
                }
/************************************************************************************/
                if (menu==3)                                       
                {                                       
                        display(3,numtab[min/10]+0x80);                 
                        display(4,numtab[min%10]+0x80);
        
                        if (key==0)                                       
                        {                                       
                                temp++;
                                if (temp>150)
                                {
                                        temp=0;
                                        menu=4;
                                        while (key==0);
/*                                        {
                                                if (hour<10)                                
                                                {
                                                        display(1,0x00);
                                                }        
                                                else
                                                {
                                                        display(1,numtab[hour/10]);
                                                }
                                                display(2,numtab[hour%10]);               
                                                display(3,numtab[min/10]+(sec%2)*0x80);        
                                                display(4,numtab[min%10]+(sec%2)*0x80);        
                                        }                                                  */
                                }
                        }
                        if (key==1&&temp>10)        
                        {
                                temp=0;
                                min++;
                                if (min>59)
                                {
                                        min=0;
                                }
                                sec=0;
                        }         
                }
/************************************************************************************/
                if (menu==4)
                {
                        if (p_sw)
                        {
                                display(1,0x73);        
                                display(2,0x00);               
                                display(3,0x3f);        
                                display(4,0x37);               
                        }
                        else
                           {
                                display(1,0x73);               
                                display(2,0x3f);               
                                display(3,0x71);        
                                display(4,0x71);        
                        }

                        if (key==0)                                       
                        {                                       
                                temp++;
                                if (temp>150)
                                {
                                        temp=0;
                                        menu=1;
                                        while (key==0);
                                }
                        }
                        if (key==1&&temp>10)        
                        {
                                temp=0;
                                p_sw=~p_sw;
                        }         
                }
/************************************************************************************/
                if (menu==5)
                {
                        if (T_time>9)
                        {
                                T_time=0;
                                menu=1;
                        }
                        if (sec%2)
                        {
                                temperature=T_read();
                        }
                        if (temperature<10)
                        {
                                display(1,0x00);
                        }
                        else
                        {
                                display(1,numtab[temperature/10]);
                        }
                        display(2,numtab[temperature%10]);  
                        display(3,0xD8);

                        while(key==0)
                        {
                                if (sec%2)
                                {
                                        temperature=T_read();
                                }
                                if (temperature<10)
                                {
                                        display(1,0x00);
                                }
                                else
                                {
                                        display(1,numtab[temperature/10]);
                                }
                                display(2,numtab[temperature%10]);  
                                display(3,0xD8);
                        }
                }
/************************************************************************************/
                if (menu==6)                                
                {
                        if (T_time>2)
                        {
                                T_time=0;
                                menu=1;
                        }                                       
                        if (key==0)
                        {
                                T_time=0;
                        }                                       
               
                        if (a_temp)                                       
                        {                                       
                                if (ahour<10)                        
                                {
                                        display (1,0x00);
                                }
                                else
                                {
                                        display (1,numtab[ahour/10]);
                                }
                                display (2,numtab[ahour%10]);        
                                display (3,numtab[amin/10]+0x80);
                                display (4,numtab[amin%10]+0x80);
                        }
                        else                                                               
                        {                                                        
                                display (1,0x40);
                                display (2,0x40);
                                display (3,0x40+0x80);
                                display (4,0x40+0x80);
                        }

                        if (key==0)                        
                        {
                                temp++;
                                if (temp>150)                                
                                {
                                        temp=0;
                                        a_temp=1;
                                        menu=7;
                                        while (key==0);
                                }
                        }                                                

                        if (key==1&&temp>10)
                        {
                                temp=0;
                                a_sw=~a_sw;
                                if (a_sw)
                                {
                                        for (j=0;j<100;j++)               
                                        {               
                                                display (1,0x77);               
                                                display (2,0x00);        
                                                display (3,0x3f);        
                                                display (4,0x37);        
                                        }
                                }
                                else
                                   {
                                        for (j=0;j<100;j++)               
                                        {               
                                                display (1,0x77);        
                                                display (2,0x3f);               
                                                display (3,0x71);        
                                                display (4,0x71);        
                                        }
                                }
                        }                          
                }
/************************************************************************************/
                if (menu==7)                                       
                {                                       
                        if (ahour<10)                        
                        {
                                display (1,0x00);
                        }
                        else
                        {
                                display (1,numtab[ahour/10]);
                        }
                        display (2,numtab[ahour%10]);        
                        display (3,0x80);                        
                        display (4,0x80);

                        if (key==0)                                       
                        {                                       
                                temp++;
                                if (temp>150)
                                {
                                        temp=0;
                                        menu=8;
                                        while (key==0);
                                }
                        }
                        if (key==1&&temp>10)
                        {
                                temp=0;
                                ahour++;
                                if (ahour>23)
                                {
                                        ahour=0;                                          
                                }
                                a_sw=1;
                                a_temp=1;
                        }         
                }
/************************************************************************************/
                if (menu==8)                                
                {                                       
                        display (1,0x00);                        
                        display (2,0x00);               
                        display (3,numtab[amin/10]+0x80);        
                        display (4,numtab[amin%10]+0x80);
        
                if (key==0)                                                        
                {                                       
                        temp++;
                        if (temp>150)
                        {
                                temp=0;
                                T_time=0;
                                menu=6;
                                while (key==0);
                        }
                }
                if (key==1&&temp>10)
                        {
                                temp=0;
                                amin++;
                                if (amin>59)
                                {
                                        amin=0;
                                }
                                a_sw=1;
                                a_temp=1;
                        }         
                }
/************************************************************************************/
                if (menu==9)                                       
                {               
                        if (hour<10)                        
                        {
                                display (1,0x00);
                        }
                        else
                        {
                                display (1,numtab[hour/10]);
                        }
                        display (2,numtab[hour%10]);        
                        display (3,numtab[min/10]+(sec%2)*0x80);
                        display (4,numtab[min%10]+(sec%2)*0x80);        

                        beep=sec%2;

                        if (key==0)
                        {
                                temp++;
                                if (temp>10)
                                {
                                        temp=0;
                                        beep=1;                                         
                                        T_time=0;
                                        menu=1;        
                                        while (key==0);                                       
                                }
                        }
                        if (sec==59)                                                
                        {
                                beep=1;                                         
                                menu=1;                                                
                                T_time=0;
                        }
                }                  
        }                          
}
/*-----------------------------------中断服务程序-----------------------------------*/        
void Timer0_Routine(void) interrupt 1
{
        unsigned char count;
        TH0=0x3C;                        
        TL0=0xB0;                        
    count++;
        if (count==20)
        {                 
                count=0;               
                sec++;
                T_time++;         
                if (sec>59)
                {
                        sec=0;
                        min++;
                        if (min>59)
                        {
                                min=0;
                                hour++;
                                if (p_sw&&menu!=3)
                                {                 
                                        beep=0;
                                }         
                                if (hour>23)
                                {
                                        hour=0;
                                }
                        }
                }
        }
}

时钟 温度 程序.zip

1.77 MB, 下载次数: 55, 下载积分: 黑币 -5

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:90084 发表于 2015-9-28 01:32 | 只看该作者
楼主太给力了,我半夜都把楼主的程序看完了,不过还在消化中,不知道楼主有做成实物吗?有的话能分享几张图片不
回复

使用道具 举报

板凳
ID:19715 发表于 2015-9-28 17:17 | 只看该作者
我靠,这样的扫描效益非常低,任何时刻只能点亮4位数码管其中之一的当中的一段,
也就是说一般4位数码管其中一位点亮的时间可以接近1/4,
现在变成了1/32.这样扫描时间长,数码管亮度低。
建议分开P1、P3两次赋值段码,8段一起处理之后,同时延时,这样每一段点亮的时间大大增加。
这样就需要两个数码段码表,分别用于P1、P3输出
回复

使用道具 举报

地板
ID:92231 发表于 2015-10-31 00:10 来自手机 | 只看该作者
学习一下程序,菜鸟一个需要参考例程
回复

使用道具 举报

5#
ID:94279 发表于 2015-11-1 11:09 | 只看该作者
不错的,仿真有点,,,
回复

使用道具 举报

6#
ID:94340 发表于 2015-11-1 19:17 | 只看该作者
要是有仿真图就好了
回复

使用道具 举报

7#
ID:154547 发表于 2016-12-13 22:02 | 只看该作者
真的是解决了我的一个大难题啊,感谢楼主
回复

使用道具 举报

8#
ID:154547 发表于 2016-12-13 22:32 | 只看该作者
楼主有仿真图没啊,我画出来有问题啊,拜托
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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