51hei.png (32.26 KB, 下載次數: 84)
下載附件
2020-5-19 17:59 上傳
51hei.png (6.63 KB, 下載次數: 98)
下載附件
2020-5-19 17:59 上傳
單片機源程序如下:
- #include <reg52.h>//頭文件
- #include <intrins.h>
- #include <math.h>
- #define uchar unsigned char//宏定義
- #define uint unsigned short int//宏定義
- #define sint short int
- #define nop _nop_()
- void delay(uint z);//延時1MS
- void delay1(uchar x2);//延時7us左右;
- void write_Directive(uchar a);//寫LCD指令
- void write_Data(uchar a);//寫LCD數據
- void write_lcd_com_date(uchar addr,uchar date);//實現LCD寫指令及數據
- void LCD_init();//LCD初始化
- void start(); //AT24C02開始程序
- void send(uchar send_data);//AT24C02發送一個字節
- uchar receive();//AT24C02接收一個程序
- void ack();//AT24C02是否應答
- void yack();//AT24C02應答
- void nack();//AT24C02無應答
- void stop();//AT24C02停止
- void write(uchar xaddress,sint temp);//AT24C02寫入溫度
- uint read(uchar daddress);//AT24C02讀出溫度
- void send_str(sint cc,uchar chflag); // 傳送字串
- void DB18B20_init_1();//DB18B20_1復位
- void write_DB18B20_1(uchar dat);//寫DB18B20_1
- uchar read_DB18B20_1();//讀DB18B20_1
- void DB18B20_init_1();//DB18B20_2復位
- void write_DB18B20_1(uchar dat);//寫DB18B20_2
- uchar read_DB18B20_1();//讀DB18B20_2
- void tempzh_1(); //溫度轉換1
- void tempzh_2(); //溫度轉換2
- void tempread_1(); //讀取溫度1
- void tempread_2(); //讀取溫度2
- void temp(sint TEMPS,uchar t,bit fuflag);//顯示溫度函數
- void readcc(); //讀取存儲芯片中最高及最低溫度
- void keyscan(); //鍵掃描程序
- void write_ds1302(uchar addr, uchar date);//寫DS1302
- uchar read_ds1302(uchar addr);//讀DS1302
- void init_ds1302();//DS1302初始化
- void time();//時間顯示
- void timekey();//時間部分功能鍵
- void tempkey();//溫度部分功能鍵
- void shuma(uchar addr,uchar xz,bit flag);//1302調節函數及轉換
- void flash(uchar bz);//字符閃爍函數
- void tempbj(); //溫度比較
- uchar bdata ch;//定義可位尋址空間,用于24c02的讀取
- sbit RS=P1^4;//1602數據/命令選擇
- sbit RW=P1^5;//1602讀寫命令選擇
- sbit E=P1^6;//1602使能端
- sbit led=P0^1;//發光二極管
- sbit beep=P0^0;//蜂鳴器
- sbit SDA=P0^2;//24c02數據總線
- sbit SCL=P0^3;//24c02時鐘總線
- sbit DQ1=P1^0;//溫度傳感器1
- sbit DQ2=P3^2;//溫度傳感器2
- sbit DSIO=P1^2;//1302輸入輸出口
- sbit DSCLK=P1^1;//1302脈沖
- sbit DSRST=P1^3;//1302復位
- sbit key1=P3^7;//五個按鍵及其標志
- sbit key2=P0^7;
- sbit key3=P0^6;
- sbit key4=P0^5;
- sbit key5=P0^4;
- bit k1flag=0;
- bit k2flag=0;
- bit k3flag=0;
- bit k4flag=0;
- bit k5flag=0;
- sbit a0=ch^0;//定義ch各位
- sbit a1=ch^1;
- sbit a2=ch^2;
- sbit a3=ch^3;
- sbit a4=ch^4;
- sbit a5=ch^5;
- sbit a6=ch^6;
- sbit a7=ch^7;
- bit fuflag1=0;//負溫度標志1
- bit fuflag2=0;//負溫度標志2
- bit ackflag=0;//24c02應答是否標志
- bit sendflag=0;//串口發送標志
- sint temps1,temps2,tempd1,tempd2,tempx1,tempx2,uptem1,downtem1,uptem2,downtem2;//溫度參數
- uchar count=0,tcount=0,scount=0,t=0;
- uchar secondh,secondl,minuteh,minutel,hourh,hourl,second,minute,hour;//時鐘參數
- uchar monthl,monthh,month,dayl,dayh,day,year,yearl,yearh,week;
- uchar code DispTab_1[12]={'0','1','2','3','4','5','6','7','8','9',' ','-'};//1602:0-9 數字
- uchar DispBuf[5]; //5字節的顯示緩沖區
- uchar code zzz[] = {"Made In Gao J C"};//定義字符串
- uchar code cc1[4] = {"DQ1:"};
- uchar code cc2[4] = {"DQ2:"};
- uchar code cc3[14] = {"DQ1 is so high"};
- uchar code cc4[13] = {"DQ1 is so low"};
- uchar code cc5[14] = {"DQ2 is so high"};
- uchar code cc6[13] = {"DQ2 is so low"};
- void delay(uint z)//1ms延時
- {
- uchar i;
- while(z--)
- for(i = 120;i > 0;i--);
- }
- void delay1(uchar x2)//短延時,由于18b20
- {
- while(x2--);
- }
- void write_Directive(uchar a)//寫LCD指令
- {
- RS = 0;
- RW = 0;
- delay(1);
- E = 0;
- P2 = a;
- delay(1);
- E = 1;
- delay(1);
- E = 0;
- delay(1);
- }
- void write_Data(uchar a)//寫LCD數據
- {
- RS = 1;
- RW = 0;
- delay(1);
- E = 0;
- P2 = a;
- delay(1);
- E = 1;
- delay(1);
- E = 0;
- delay(1);
- }
- void write_lcd_com_date(uchar addr,uchar date)//實現LCD寫指令及數據
- {
- write_Directive(addr);
- delay(1);
- write_Data(date);
- }
- void LCD_init()//LCD初始化
- {
- uchar i;
- delay(15);
- write_Directive(0x38);
- delay(5);
- write_Directive(0x38);
- delay(5);
- write_Directive(0x38);
- write_Directive(0x01);
- write_Directive(0x02);//光標復位
- write_Directive(0x0c);//不顯示光標
- //write_Directive(0x0f);//顯示光標
- write_Directive(0x84);//顯示字符串
- for(i = 0;i < 7;i++)
- write_Data(zzz[i]);
- write_Directive(0xc3);
- for(i = 8;i < 15;i++)
- write_Data(zzz[i]);
- }
- void start() //AT24C02開始程序
- {
- SCL = 1;
- SDA = 1;
- nop;
- nop;
- SDA = 0;
- nop;
- nop;
- SCL = 0;
- }
- void send(uchar send_data)//AT24C02發送一個字節
- {
- ch = send_data;
- SDA = a7; SCL = 1; nop;nop; SCL = 0;
- SDA = a6; SCL = 1; nop;nop; SCL = 0;
- SDA = a5; SCL = 1; nop;nop; SCL = 0;
- SDA = a4; SCL = 1; nop;nop; SCL = 0;
- SDA = a3; SCL = 1; nop;nop; SCL = 0;
- SDA = a2; SCL = 1; nop;nop; SCL = 0;
- SDA = a1; SCL = 1; nop;nop; SCL = 0;
- SDA = a0; SCL = 1; nop;nop; SCL = 0;
- }
- uchar receive()//AT24C02接收一個程序
- {
- SDA = 1;
- SCL = 1; nop;nop; a7 = SDA; SCL = 0;
- SCL = 1; nop;nop; a6 = SDA; SCL = 0;
- SCL = 1; nop;nop; a5 = SDA; SCL = 0;
- SCL = 1; nop;nop; a4 = SDA; SCL = 0;
- SCL = 1; nop;nop; a3 = SDA; SCL = 0;
- SCL = 1; nop;nop; a2 = SDA; SCL = 0;
- SCL = 1; nop;nop; a1 = SDA; SCL = 0;
- SCL = 1; nop;nop; a0 = SDA; SCL = 0;
- return(ch);
- }
- void ack()//AT24C02是否應答
- {
- SDA = 1;
- SCL = 1;
- nop;
- nop;
- if(SDA)
- ackflag = 1;
- else
- ackflag = 0;
- SCL=0;
- }
- void yack()//AT24C02應答
- {
- SDA = 0;
- SCL = 1;
- nop;
- nop;
- SCL = 0;
- SDA = 1;
- }
- void nack()//AT24C02無應答
- {
- SDA = 1;
- SCL = 1;
- nop;
- nop;
- SCL = 0;
- SDA = 0;
- }
- void stop()//AT24C02停止
- {
- SDA = 0;
- SCL = 1;
- nop;
- nop;
- SDA = 1;
- nop;
- nop;
- SCL = 0;
- SDA = 0;
- }
- void write(uchar xaddress,sint temp)//AT24C02寫入溫度
- {
- uchar a,b;
- do{
- start();
- send(0xa0);
- ack();
- } while(ackflag);
- do{
- send(xaddress);
- ack();
- }while(ackflag);
- a = temp;
- temp >>= 8;
- b = temp;
- do{
- send(a);
- ack();
- }while(ackflag);
- do{
- send(b);
- ack();
- }while(ackflag);
- stop();
- }
- uint read(uchar daddress)//AT24C02讀出溫度
- {
- uchar a,b;
- sint temp;
- do{
- start();
- send(0XA0);
- ack();
- }while(ackflag);
- do{
- send(daddress);
- ack();
- }while(ackflag);
- do{
- start();
- send(0XA1);
- ack();
- }while(ackflag);
- a = receive();
- yack();
- b = receive();
- yack();
- nack();
- stop();
- temp = b;
- temp <<= 8;
- temp |= a;
- return temp;
- }
- void send_str(sint cc,uchar chflag) // 傳送字串
- {
- uchar i,a,b,ch[4];
- ES=0;
- cc = abs(cc);
- a = cc / 100;
- b = cc % 100;
- ch[1] = b;
- ch[2] = a;
- ch[3] = chflag;
- for(i = 3;i > 0;i--){
- SBUF = ch[i];
- while(!TI); // 等特數據傳送
- TI = 0; // 清除數據傳送標志
- ES=1;
- }
- }
- /*void serial() interrupt 4
- {a=SBUF;
- RI=0;
- flag=1;
- }
- */
- void DB18B20_init_1()//DB18B20復位
- {
- DQ1 = 1;
- delay1(20);
- DQ1 = 0;
- delay1(80);
- DQ1 = 1;
- delay1(15);
- }
- void write_DB18B20_1(uchar dat)//寫DB18B20
- {
- uchar i;
- for(i = 8;i > 0;i--){
- DQ1 = 1;
- delay1(10);
- DQ1 = 0;
- nop;
- DQ1 = dat&0x01;
- delay1(10);
- DQ1 = 1;
- dat >>= 1;
- }
- delay1(7);
- }
- uchar read_DB18B20_1()//讀DB18B20
- {
- uchar i,date;
- for(i = 8;i > 0;i--){
- DQ1 = 0;
- date >>= 1;
- DQ1 = 1;
- if(DQ1)
- date |= 0x80;
- delay(4);
- }
- return date;//返回溫度值
- }
- void DB18B20_init_2()//DB18B20復位
- {
- DQ2=1;
- delay1(20);
- DQ2=0;
- delay1(80);
- DQ2=1;
- delay1(15);
- }
- void write_DB18B20_2(uchar dat)//寫DB18B20
- {
- uchar i;
- for(i = 8;i > 0;i--){
- DQ2 = 1;
- delay1(10);
- DQ2 = 0;
- nop;
- DQ2 = dat&0x01;
- delay1(10);
- DQ2 = 1;
- dat >>= 1;
- }
- delay1(7);
- }
- uchar read_DB18B20_2()//讀DB18B20
- {
- uchar i,date;
- for(i = 8;i > 0;i--){
- DQ2 = 0;
- date >>= 1;
- DQ2 = 1;
- if(DQ2)
- date |= 0x80;
- delay(4);
- }
- return date;//返回溫度值
- }
- void tempzh_1() //溫度轉換
- {
- DB18B20_init_1();//DB18B20復位
- write_DB18B20_1(0xcc);//寫DB18B20;0xcc 跳過 ROM 指令
- write_DB18B20_1(0x44);//寫DB18B20;0x44 啟動溫度轉換指令
- }
- void tempzh_2() //溫度轉換
- {
- DB18B20_init_2();//DB18B20復位
- write_DB18B20_2(0xcc);//寫DB18B20;0xcc 跳過 ROM 指令
- write_DB18B20_2(0x44);//寫DB18B20;0x44 啟動溫度轉換指令
- }
- void tempread_1()//溫度讀取
- {
- uint temp;
- uchar a,b;
- fuflag1 = 0;
- DB18B20_init_1();//DB18B20復位
- write_DB18B20_1(0xcc);//寫DB18B20;0xcc 跳過 ROM 指令
- write_DB18B20_1(0xbe);//寫DB18B20;0xbe 讀溫度指令
- a = read_DB18B20_1(); //a為低字節8位
- b = read_DB18B20_1(); //b為高字節8位
- temp = b; //temp為溫度值UINT 16bit
- temp <<= 8; //兩個字節組合到一起
- temp |= a;//此處可以直接把補碼轉換過來,只是關于負數標志的問題需要考慮
- if(b > 7){ //判斷正負,因為負溫度高五位是1,故而可得
- fuflag1 = 1;
- temps1 = (temp*0.0625-4096)*10-0.5;
- }
- else{
- fuflag1 = 0;
- temps1 = temp*0.0625*10+0.5;
- }
- if(tempd1 < temps1){
- tempd1 = temps1;
- write(0x00,tempd1);
- }
- else if(tempx1 > temps1){
- tempx1 = temps1;
- write(0x04,tempx1);
- }
- if(sendflag){
- t++;
- if(t == 5){
- send_str(temps1,1);
- send_str(tempd1,2);
- send_str(tempx1,3);
- }
- }
- }
- void tempread_2()
- {
- uint temp;
- uchar a,b;
- fuflag2 = 0;
- DB18B20_init_2();//DB18B20復位
- write_DB18B20_2(0xcc);//寫DB18B20;0xcc 跳過 ROM 指令
- write_DB18B20_2(0xbe);//寫DB18B20;0xbe 讀溫度指令
- a = read_DB18B20_2(); //a為低字節8位
- b = read_DB18B20_2(); //b為高字節8位
- temp = b; //temp為溫度值UINT 16bit
- temp <<= 8; //兩個字節組合到一起
- temp |= a;//此處可以直接把補碼轉換過來,只是關于負數標志的問題需要考慮
- if(b>7){
- fuflag2 = 1;
- temps2=(temp*0.0625-4096)*10-0.5;
- }
- else{
- fuflag2=0;
- temps2=temp*0.0625*10+0.5;
- }
- if(tempd2<temps2){
- tempd2=temps2;
- write(0x08,tempd2);
- }
- else if(tempx2>temps2){
- tempx2=temps2;
- write(0x0c,tempx2);
- }
- if(sendflag){
- if(t == 5){
- t = 0;
- send_str(temps2,4);
- send_str(tempd2,5);
- send_str(tempx2,6);
- }
- }
- }
- void temp(sint temps,uchar t,bit fuflag)//顯示溫度函數
- {
- uchar i;
- uint mm;
- temps = abs(temps);
- DispBuf[0] = temps / 1000;//顯示百位
- mm = temps % 1000;
- DispBuf[1] = mm / 100;//顯示十位
- mm = mm % 100;
- DispBuf[2] = mm / 10;//顯示個位
- DispBuf[3] = mm % 10;//顯示小數點:0.1
- i = DispBuf[0];//百位判斷,如果為0,則消隱
- if(i == 0) i = 10;
- if(fuflag)//負溫度判斷,如果為0,則溫度為負的,顯示負號
- i = 11;
- DispBuf[0] = DispTab_1[i];//查表,取字符
- i = DispBuf[1];
- DispBuf[1] = DispTab_1[i];
- i = DispBuf[2];
- DispBuf[2] = DispTab_1[i];
- i = DispBuf[3];
- DispBuf[3] = DispTab_1[i];
- i = DispBuf[4];
- DispBuf[4] = DispTab_1[i];
- write_Directive(0x84+t);//第一行,第五個位置地址
- write_Data(DispBuf[0]);//第一行,第五個位置
- write_Data(DispBuf[1]);//第一行,第六個位置
- write_Data(DispBuf[2]);//第一行,第八個位置
- write_Data('.');//第一行,第七個位置
- write_Data(DispBuf[3]);//第一行,第九個位置
- }
- void readcc()//讀24c02中最高和最低溫度并顯示
- {
- bit flag;
- tempd1 = read(0x00);
- if(tempd1 > 0) flag = 0;
- else flag = 1;
- temp(tempd1,0x00,flag);
- tempx1 = read(0x04);
- if(tempx1 > 0) flag = 0;
- else flag=1;
- temp(tempx1,0x06,flag);
- tempd2 = read(0x08);
- if(tempd2 > 0) flag = 0;
- else flag = 1;
- temp(tempd2,0x40,flag);
- tempx2 = read(0x0c);
- if(tempx2 > 0) flag = 0;
- else flag = 1;
- temp(tempx2,0x46,flag);
- }
- void keyscan() //鍵掃描程序
- {
- bit flag = 0;
- if(!key1){ //按鍵1
- delay(30);
- if(!key1){
- while(!key1);
- k1flag = 1;
- flag = 1;
- }
- }
- if(!key2){ //按鍵2
- delay(30);
- if(!key2){
- while(!key2);
- k2flag = 1;
- flag = 1;
- }
- }
- if(!key3){ //按鍵3
- delay(30);
- if(!key3){
- while(!key3);
- k3flag = 1;
- flag = 1;
- }
- }
- if(!key4){ //按鍵4
- delay(30);
- if(!key4){
- while(!key4);
- k4flag = !k4flag;
- flag = 1;
- }
- }
- if(!key5){ //按鍵5
- delay(30);
- if(!key5){
- while(!key5);
- k5flag=!k5flag;
- flag=1;
- write_Directive(0x01);
- }
- }
- if(flag){
- beep=0;
- delay(100);
- beep=1;
- }
- }
- uchar read_ds1302(uchar addr)//讀DS1302
- {
- uchar i,temp = 0x00;
- DSRST = 0;
- DSIO = 1;
- DSCLK = 0;
- DSRST = 1;
- for(i = 8;i > 0;i--){ //循環8次 寫入地址數據
- DSCLK = 0;
- DSIO = addr&0x01; //每次傳輸低字節
- addr >>= 1; //右移一位
- DSCLK = 1;
- }
- delay(1);
- if(DSIO)
- temp |= 0x80; //每次傳輸低字節
- DSCLK = 0;
- temp >>= 1;
- for(i = 7;i > 0;i--){ //循環7次 讀取數據此處如果讀8次就會出現亂碼
- DSCLK = 0;
- if(DSIO)
- temp |= 0x80; //每次傳輸低字節
- DSCLK = 1;
- temp >>= 1; //右移一位
- }
- DSCLK = 1;
- DSRST = 0;
- DSIO = 0;
- return temp;
- }
- void write_ds1302(uchar addr, uchar date)//寫DS1302
- {
- uchar i;
- DSRST = 0;
- DSCLK = 0;
- DSRST = 1;
- for (i = 8;i > 0;i--){ //循環8次 寫入地址數據
- DSCLK = 0;
- nop;
- DSIO = addr&0x01; //每次傳輸低字節
- addr >>= 1; //右移一位
- DSCLK = 1;
- nop;
- }
- for (i = 8;i > 0;i--){ //循環8次 寫入數據
- DSCLK = 0;
- nop;
- DSIO = date&0x01; //每次傳輸低字節
- date >>= 1; //右移一位 DSCLK=1
- DSCLK = 1;
- nop;
- }
- DSRST = 0;
- delay(1);
- }
- void init_ds1302()//DS1302初始化
- {
- write_ds1302(0x8e,0x00);
- write_ds1302(0x90,0xa5);
- /*write_ds1302(0x80,0x00); //00秒
- write_ds1302(0x82,0x54); //54分
- write_ds1302(0x84,0x17); //17點
- write_ds1302(0x86,0x13); //13日
- write_ds1302(0x88,0x03); //3月
- write_ds1302(0x8a,0x05); //星期五
- write_ds1302(0x8c,0x12); //2012年*/
- }
- void time()//時間顯示
- {
- write_lcd_com_date(0x81,'2');
- write_lcd_com_date(0x82,'0');
- second = read_ds1302(0x81);
- secondl = second & 0x0f;
- secondh = second >> 4;
-
- minute = read_ds1302(0x83);
- minutel = minute & 0x0f;
- minuteh = minute >> 4;
-
- hour = read_ds1302(0x85);
- hourl = hour & 0x0f;
- hourh = hour >> 4;
- month = read_ds1302(0x89);
- monthl = month & 0x0f;
- monthh = month >> 4;
-
- year = read_ds1302(0x8d);
- yearl = year & 0x0f;
- yearh = year >> 4;
- day = read_ds1302(0x87);
- dayl = day & 0x0f;
- dayh = day >> 4;
- week = read_ds1302(0x8b);
- week = week&0x0f;
- write_lcd_com_date(0xca,0x30 + secondl);
- write_lcd_com_date(0xc9,0x30 + secondh);
- write_lcd_com_date(0xc8,':');
- write_lcd_com_date(0xc7,0x30 + minutel);
- write_lcd_com_date(0xc6,0x30 + minuteh);
- write_lcd_com_date(0xc5,':');
- write_lcd_com_date(0xc4,0x30 + hourl);
- write_lcd_com_date(0xc3,0x30 + hourh);
- write_lcd_com_date(0x84,0x30 + yearl);
- write_lcd_com_date(0x83,0x30 + yearh);
- write_lcd_com_date(0x85,'-');
- write_lcd_com_date(0x87,0x30 + monthl);
- write_lcd_com_date(0x86,0x30 + monthh);
- write_lcd_com_date(0x88,'-');
- write_lcd_com_date(0x8a,0x30 + dayl);
- write_lcd_com_date(0x89,0x30 + dayh);
- write_lcd_com_date(0x8c,0x30 + week);
- }
- void shuma(uchar addr,uchar xz,bit flag)
- {
- char date;
- uchar day=0;
- date = read_ds1302(addr + 1); //讀分寄存器上的數據
- date = ((date >> 4) * 10) + (date & 0x0f); //BCD Convert to shi
- if(flag == 0) date++;
- else date--;
- switch(xz)
- {
- case 0:if(date > 59) date=0;if(date < 0) date = 59;break;//分秒
- case 1:if(date > 23) date=0;if(date < 0) date = 23;break;//時
- case 2:if(date > 12) date=0;if(date < 0) date = 12;break;//月
- case 3:if(date > 99) date=0;if(date < 0) date = 99;break;//年
- case 4:if(date > 7) date=1;if(date < 1) date = 7;break;//星期
- case 5:
- day = read_ds1302(0X87);
- day = ((day >> 4) * 10) + (day & 0x0f);
- if(day != 2){
- if(day % 2 == 1){
- if(date > 31)
- date = 0;
- else if(date < 0)
- date = 31;
- }
- else{
- if(date > 30)
- date = 0;
- else if(date < 0)
- date = 30;
- }
- }
- else{
- if(date > 29)
- date = 0;
- else if(date < 0)
- date = 29;
- }
- break;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.png (12.23 KB, 下載次數: 83)
下載附件
2020-5-19 18:02 上傳
以上是仿真報錯,求大神指導修改一下
所有資料51hei提供下載:
資料.7z
(4.42 MB, 下載次數: 91)
2020-5-19 18:02 上傳
點擊文件名下載附件
包括源程序 下載積分: 黑幣 -5
|