|
使用15單片機+1602+ds1302+18b20+串口。因為是15沒有仿真圖圖,有pro的設計圖,可以看一下。引腳的連線在子程序里有。
制作出來的實物圖如下:
IMG_20201104_203641.jpg (4.38 MB, 下載次數: 17)
下載附件
2020-11-4 20:43 上傳
Proteus畫的電路圖:
51hei.png (23.31 KB, 下載次數: 25)
下載附件
2020-11-4 21:15 上傳
單片機源程序如下:
- #include "STC15.h"
- #include "LCD1602.h"
- #include "ds18b20.h"
- #include "ds1302.h"
- #include "delay.h"
- u16 dispbuf[]={0,0,0,0}; //存放溫度值
- uchar CNCHAR[6] = "WenDu ";
- //函數聲明
- void temp_dis(); //溫度顯示
- void LcdDisplay(); //時間顯示
- void LCD1602xianshi(); //屏幕顯示
- void GPIO(); //端口
- void Delay200us(); //延時
- void UartInit(); //串口
- void main() //主函數
- {
- GPIO(); //串口初始化
- LCD_init(); //屏幕初始化
- UartInit();
- LCD1602xianshi(); //屏幕顯示
- while(1)
- {
- temp_dis(); //顯示溫度
- Ds1302ReadTime(); //讀取時間
- Delay200us();
- LcdDisplay(); //顯示時間
- }
- }
- //溫度顯示
- void temp_dis()
- {
- u16 j;
- u8 i;
- j=ReadTemperature();
- for(i=0; i<6; i++)
- {
- SBUF = CNCHAR[i];//將接收到的數據放入到發送寄存器
- while (!TI); //等待發送數據完成
- TI = 0;
- }
- if(j<0)
- {
- dispbuf[0]= j/100; //十位
- dispbuf[1]= j%100/10; //個位
- dispbuf[2]= j%100%10; //取溫度小數點1位
- LCD1602_char(2,3,'-');
- {SBUF='-'; //將接收到的數據放入到發送寄存器
- while(!TI);
- TI=0;}
- LCD1602_char(2,4,dispbuf[0]+'0');
- {SBUF = dispbuf[0]+'0';//將接收到的數據放入到發送寄存器
- while (!TI);
- TI = 0;}
- LCD1602_char(2,5,dispbuf[1]+'0');
- {SBUF = dispbuf[1]+'0'; //將接收到的數據放入到發送寄存器
- while (!TI);
- TI = 0;}
- LCD1602_char(2,6,'.');
- {SBUF='.'; //將接收到的數據放入到發送寄存器
- while(!TI);
- TI=0;}
- LCD1602_char(2,7,dispbuf[2]+'0');
- {SBUF = dispbuf[2]+'0';//將接收到的數據放入到發送寄存器
- while (!TI);
- TI = 0;}
- }
- else
- {
- dispbuf[0]= j/100; //十位
- dispbuf[1]= j%100/10; //個位
- dispbuf[2]= j%100%10; //取溫度小數點1位
- LCD1602_char(2,3,'+');
- {SBUF='+'; //將接收到的數據放入到發送寄存器
- while(!TI); //等待發送數據完成
- TI=0;}
- LCD1602_char(2,4,dispbuf[0]+'0');
- {SBUF = dispbuf[0]+'0';//將接收到的數據放入到發送寄存器
- while (!TI);
- TI = 0;}
- LCD1602_char(2,5,dispbuf[1]+'0');
- {SBUF = dispbuf[1]+'0'; //將接收到的數據放入到發送寄存器
- while (!TI);
- TI = 0;}
- LCD1602_char(2,6,'.');
- {SBUF='.'; //將接收到的數據放入到發送寄存器
- while(!TI); //等待發送數據完成
- TI=0;}
- LCD1602_char(2,7,dispbuf[2]+'0');
- {SBUF = dispbuf[2]+'0';//將接收到的數據放入到發送寄存器
- while (!TI);
- TI = 0;}
- }
- }
- //時間顯示
- void LcdDisplay()
- {
- LCD1602_char(1,3,'0'+TIME[6]/16); //年
- LCD1602_char(1,4,'0'+(TIME[6]&0x0f));
- LCD1602_char(1,5,'0'+TIME[4]/16); //月
- LCD1602_char(1,6,'0'+(TIME[4]&0x0f));
- LCD1602_char(1,7,'0'+TIME[3]/16); //日
- LCD1602_char(1,8,'0'+(TIME[3]&0x0f));
-
-
- LCD1602_char(1,10,'0'+TIME[2]/16); //時
- LCD1602_char(1,11,'0'+(TIME[2]&0x0f));
- LCD1602_char(1,12,'0'+TIME[1]/16); //分
- LCD1602_char(1,13,'0'+(TIME[1]&0x0f));
- LCD1602_char(1,15,'0'+TIME[0]/16); //秒
- LCD1602_char(1,16,'0'+(TIME[0]&0x0f));
- }
- void LCD1602xianshi() //1602屏幕顯示
- {
- LCD1602_string(2,1,"Tm");
- LCD1602_string(1,1,"20");
- LCD1602_char(1,9,'-');
- LCD1602_char(1,14,':');
- Ds1302Init();
- }
- void GPIO() //串口初始化
- {
- P0M0=0X00;P0M1=0X00;
- P2M0=0X00;P2M1=0X00;
- P3M0=0X00;P3M1=0X00;
- P4M0=0X00;P4M1=0X00;
- P5M0=0X00;P5M1=0X00;
- }
- void Delay200us() //@11.0592MHz 軟件延時200微秒
- {
- unsigned char i, j;
- i = 3;
- j = 35;
- do
- {
- while (--j);
- } while (--i);
- }
- void UartInit(void) //9600bps@11.0592MHz串口初始化
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位數據,可變波特率
- AUXR |= 0x40; //定時器1時鐘為Fosc,即1T
- AUXR &= 0xFE; //串口1選擇定時器1為波特率發生器
- TMOD &= 0x0F; //清除定時器1模式位
- TMOD |= 0x20; //設定定時器1為8位自動重裝方式
- TL1 = 0xDC; //設定定時初值
- TH1 = 0xDC; //設定定時器重裝值
- ET1 = 0; //禁止定時器1中斷
- TR1 = 1; //啟動定時器1
- }
復制代碼
|
-
-
1602 18b20 ds1302 串口.zip
2020-11-4 20:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
141.08 KB, 下載次數: 30, 下載積分: 黑幣 -5
-
-
電路設計圖.zip
2020-11-4 20:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
16.44 KB, 下載次數: 18, 下載積分: 黑幣 -5
評分
-
查看全部評分
|