這是學校的一次單片機實驗要求,自己修改的程序,可以實現時鐘,計算器與溫度在1602顯示,附件包含原始keil程序及proteus仿真。希望大家能夠采納。
qq_pic_merged_1545973250946.jpg (154.19 KB, 下載次數: 64)
下載附件
2019-4-27 19:58 上傳
- #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)
2023-11-9 14:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|