历史上的今天
返回首页

历史上的今天

今天是:2024年12月23日(星期一)

正在发生

2020年12月23日 | 51单片机5110液晶显示屏实现时间温度串口发送

2020-12-23 来源:51hei

制作出来的实物图如下:


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

单片机源程序如下:

/**

P2.7置低电平时,开机接入串口,自动进入时间设置界面

每秒钟自动检测温度一次,并在LCD上显示

每分钟自动刷新日期、时间、温度,在LCD上显示,并在串口中输出(方便电脑读取)


*/



#include

//#include

#include

#include"ds1302.h"

#include"temp.h"

#include



//***********************************

#define                delay_time        25767


sbit SETTIME = P2^7;        //为0时,开机进入设置时间界面

uchar TIME[7];

char word2[10];


//毫秒级延时函数

void delay(unsigned int x)

{

        unsigned char i;

        while(x--)

        {

                for(i = 0;i < 120;i++);

        }

}


char* tempDisplay(int temp)          //lcd显示

{

   

         unsigned char datas[5]; //定义数组

        float tp;

        unsigned char ReturnTemp[9],x;  

        if(temp< 0)                                //当温度值为负数

          {


                ReturnTemp[0]='-';

                //因为读取的温度是实际温度的补码,所以减1,再取反求出原码

                temp=temp-1;

                temp=~temp;

                tp=temp;

                temp=tp*0.0625*100+0.5;        

                //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

                //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

                //算由?.5,还是在小数点后面。


          }

         else

          {                        

//                  LcdWriteCom(0x80);                //写地址 80表示初始地址

//            LcdWriteData('+');                 //显示正

                ReturnTemp[0]='+';

                tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量

                //如果温度是正的那么,那么正数的原码就是补码它本身

                temp=tp*0.0625*100+0.5;        

                //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

                //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

                //算加上0.5,还是在小数点后面。

        }

        datas[0] = temp / 10000;

        datas[1] = temp % 10000 / 1000;

        datas[2] = temp % 1000 / 100;

        datas[3] = temp % 100 / 10;

        datas[4] = temp % 10;           


//        LcdWriteCom(0x82);                  //写地址 80表示初始地址

//        LcdWriteData('0'+datas[0]); //百位

//        ReturnTemp[1]=datas[0]+48;

        if(datas[0]!=0)

        {

        ReturnTemp[1]=48+datas[0];

        x=1;

        } else {

        x=0;

        }

        //putchar(ReturnTemp[1]);

//        LcdWriteCom(0x83);                 //写地址 80表示初始地址

//        LcdWriteData('0'+datas[1]); //十位

        if(( datas[1])!=0)

        {

        ReturnTemp[1+x]=datas[1]+48;

        x=x+1;

        } else {

                if(x!=0)

                {

                        ReturnTemp[1+x]='0';

                        x=x+1;

                }

        }        


//        LcdWriteCom(0x84);                //写地址 80表示初始地址

//        LcdWriteData('0'+datas[2]); //个位

        ReturnTemp[1+x]='0'+datas[2];

//        putchar(ReturnTemp[1+x]);

//        LcdWriteCom(0x85);                //写地址 80表示初始地址

//        LcdWriteData('.');                 //显示 ‘.’

        ReturnTemp[2+x]='.';


//        LcdWriteCom(0x86);                 //写地址 80表示初始地址

//        LcdWriteData('0'+datas[3]); //显示小数点

        ReturnTemp[3+x]=48+datas[3];

//        putchar(ReturnTemp[3+x]);

//        LcdWriteCom(0x87);                 //写地址 80表示初始地址

//        LcdWriteData('0'+datas[4]); //显示小数点

        ReturnTemp[4+x]=datas[4]+48;

        ReturnTemp[5+x]='C';

        ReturnTemp[6+x]='';

//        printf("n xx %sn",ReturnTemp);

        return ReturnTemp;


}



//设置日期,格式为: setdate 2015-2-21, 可以省略0

int setdate()

{

        char year[5],month[3],day[3],i,

                 y,m,d;                                                                   //y存放年,m存放月, d存放日

        for(i=0;i<4;i++)        

                 year[i]=word2[i];

               

        for(i=0; i<10; i++)                                                //检查WORD2中字符的合法性,只能有数字或者-

        {

                if((word2[i]-48)<0 | word2[i]-48>9)

                {

                        if(word2[i] == '')

                                break;

                        if(word2[i] != '-')

                        {

                                return 0;

                        }

                }

        }        


        if(word2[7]!='-' & word2[6] != '-')

        {

                return 0;

        }


        if(word2[7] == '-')

        {

                month[0]=word2[5];

                month[1]=word2[6];

                m = 1;         //m=1的话,表示月份是2位,否则是1位,节约内存,借变量用一下

        }


        if(word2[6] == '-')

        {

                month[0] = '0';

                month[1] = word2[5];

                m = 0;

        }


        if(word2[9+m]!='' & word2[8+m] != '')

        {

                return 0;

        }


        if(word2[9+m] == '')                        //处理日期,因为要考虑1位的情况,使情况复杂多了

        {

                day[0] = word2[7+m];

                day[1] = word2[8+m];

        }


        if(word2[8+m]=='')

        {

                day[0] = '0';

                day[1] = word2[7+m];

        }


        year[4]='',month[2]='',day[2]='';

        y = (year[2]-48)*10 + (year[3]-48);

推荐阅读

史海拾趣

问答坊 | AI 解惑

急求数控开关电源的程序!

用单片机控制开关电源,谁有程序啊,帮下忙啊…

查看全部问答>

25美分能买到什么MCU?

不可否认的是,TI还是有钱人~~ 说做MCU,这回又砸向了8位单片机市场: 起价仅 25 美分的 MSP430G2xx 系列 旨在用16位MCU的性能、8位MCU的价格攻城略地。 据称第一批产品现在已经可以提供样片了。昨天还和朋友聊,朋友也觉得:16位机这样的价 ...…

查看全部问答>

别对老板说的10句傻话

1.有好几家公司都想挖我过去。 2.为什么XX的工资比我高? 3.为什么升他不升我? 4.我没法和他一起工作? 5.这件事的责任不在我。 6.我行吗?我真怕做不好。 7.我们有必要做这个项目吗? 8.这个指标太高,我不可能完成。 9.我追求的是生活和 ...…

查看全部问答>

GPRS模块开发求助(高分求助)

上次发了个帖子关于GPRS模块用LM317做稳压电源的问题(想自己搭建开发平台)问题已经解决,感谢大虾们的指点。现在平台已经搭起来了(语音部分没接)。测试发现能正常发送和接受短信。但是不能打电话。我用的是SIM300的模块。打电话的指令是这样发 ...…

查看全部问答>

联想p50手机系统坏了。我想从写系统,请问哪里可以下载到p50的手机系统

我的联想p50手机系统坏了。我想从写系统,请问哪里可以下载到p50的手机系统…

查看全部问答>

插上USB线,系统就很慢

插上USB线,系统就很慢 而且开发板上显示“已经连接” 但PC机上却是一直显示“正在连接” Why? …

查看全部问答>

关于wince下IIC驱动中的中断线程问题?

请问各位高手: 这段在IIC驱动中的中断线程的作用是什么啊? 能否详细解释一下里面的重要代码?? 谢谢各位啦! DWORD I2C_IntrThread(PVOID pArg) {         DWORD ret;         // ???¨I2C????? ...…

查看全部问答>

常用MCU存储器IC

常用存储器IC 型号(规格) 厂商 器件简介 24C01 ATMEL/ST/MICROCHIP 串行EEPROM(1K,128×8) 24C02 ATMEL/ST/MICROCHIP 串行EEPROM(2K,256×8) 24C04 ATMEL/ST/MICROCHIP 串行EEPROM(4K,512×8)&n ...…

查看全部问答>

还是有关于AD的问题

这个参考电压代表的含义是什么? VREF?/VeREF? (internal or external)…

查看全部问答>

自产自用的无线遥控灯系统

之前有做过无线温度检测器\\无线温度信息采集终端等东西,后来也零零碎碎做了无线遥控器,这个可在我的前期的博文中看到,后来也为家人买过无线遥控开关,就是采用PT2262/2272编解码芯片做的那种,之前也有留意过采用这种芯片的产品很容易被破解及复制, ...…

查看全部问答>