这是学校的一次单片机实验要求,自己修改的程序,可以实现时钟,计算器与温度在1602显示,附件包含原始keil程序及proteus仿真。希望大家能够采纳。
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DSPORT=P3^7;
- void Delay1ms(uint );
- uchar Ds18b20Init();
- void Ds18b20WriteByte(uchar com);
- uchar Ds18b20ReadByte();
- void Ds18b20ChangTemp();
- void Ds18b20ReadTempCom();
- int Ds18b20ReadTemp();
- #define LCD1602_DATAPINS P2
- sbit lcde=P1^4;
- sbit w=P1^5;
- sbit rs=P1^6;
- void Lcd1602_Delay1ms(uint c); //误差 0us
- void LcdWriteCom(uchar com);
- void LcdWriteData(uchar dat);
- void wendu();
- void LcdInit();
- void LcdDisplay(int);
- void init_jsq();
- void init_sz();
- void write_data(uchar date);
- void delay(uint z);
- void write_com(uchar com);
- void write_sfm(uchar add,uchar date);
- sbit k1=P3^3;
- sbit k2=P3^4;
- sbit k3=P3^5;
- uchar num,count,k1num,miao1,miao2,ki;
- char miao,fen,shi;
- uchar code table2[]=" 2018-12-10 SAT" ;
- uchar code table21[]=" 00:00:00";
- char i,j,temp,num_1;
- long a,a1,a2,b,b1,b2,c,c1,c2;//a,第一个数 b第二个数 c第三个数
- uchar flag1,fuhao; //flag1表示是否有符号按下,fuhao表示按下哪个符号
- uchar code table[]={
- 1,2,3,0,
- 4,5,6,0,
- 7,8,9,0,
- 0,0,0,0,
- };
- uchar code table1[]={
- 1,2,3,0x2f-0x30,
- 4,5,6,0x2a-0x30,
- 7,8,9,0x2d-0x30,
- 0x01-0x30,0,0x3d-0x30,0x2b-0x30,
- };
- void jisuanqi();
- void shizhong();
- sbit ky1=P3^2;
- sbit d1=P0^0;
- sbit d2=P0^1;
- sbit d3=P0^2;
- void main()
- {
-
- i=50;
- ki=0;
- while(1)
- {
- if(ky1==0)
- {
- while(ky1==0);
- ki++;
- }
-
- if(ki>5)
- {
- ki=0;
- }
-
- ///////////温度//////////////////
- if(ki==0)
- {
- LcdInit();
- LcdWriteCom(0x88); //写地址 80表示初始地址
- LcdWriteData('C');
- if(ki==0)
- {
- ki++;
- }
- }
-
- if(ki==1)
- {
- d1=0;
- d2=1;
- d3=1;
- wendu();
- }
-
-
- ////////////计算器////////////////
- if(ki==2)
- {
- init_jsq();
- if(ki==2)
- {
- ki++;
- }
- }
- if(ki==3)
- {
- d1=1;
- d2=0;
- d3=1;
- jisuanqi();
- }
-
- //////////时钟////////////////
- if(ki==4)
- {
- init_sz(); //初始化
- for(num=0;num<16;num++)
- {
- write_data(table2[num]);
- delay(5);
- }
- write_com(0x80+0x40); //开始时第二行显s
- for(num=0;num<10;num++)
- {
- write_data(table21[num]);
- delay(5);
- }
- if(ki==4)
- {
- ki++;
- }
-
- write_sfm(2,shi);
- write_sfm(5,fen);
- write_sfm(8,miao);
- }
-
- if(ki==5)
- {
- d1=1;
- d2=1;
- d3=0;
- shizhong();
- }
- }
- }
- void wendu()
- {
- LcdDisplay(Ds18b20ReadTemp());
- }
- void LcdDisplay(int temp) //lcd显示
- {
-
- unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
- float tp;
- if(temp< 0) //当温度值为负数
- {
- LcdWriteCom(0x80); //写地址 80表示初始地址
- LcdWriteData('-'); //显示负
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- }
- else
- {
- LcdWriteCom(0x80); //写地址 80表示初始地址
- LcdWriteData('+'); //显示正
- tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
- temp=tp*0.0625*100+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]); //百位
-
- LcdWriteCom(0x83); //写地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //十位
- LcdWriteCom(0x84); //写地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //个位
- LcdWriteCom(0x85); //写地址 80表示初始地址
- LcdWriteData('.'); //显示 ‘.’
- LcdWriteCom(0x86); //写地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //显示小数点
- LcdWriteCom(0x87); //写地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //显示小数点
- }
-
- void Delay1ms(uint y)
- {
- uint x;
- for( ; y>0; y--)
- {
- for(x=110; x>0; x--);
- }
- }
- uchar Ds18b20Init()
复制代码
原理图: 无
仿真: 无
代码:
时钟·温度显示及计算器.7z
(267.79 KB, 下载次数: 44)
|