xiaxiake 發(fā)表于 2024-2-29 15:24
感謝分享,學(xué)到了很多,但是打不開仿真圖是為什么呀
//-----------------------------------------------------------------
// 名稱: SPI接口溫度傳感器TC72驅(qū)動(dòng)程序
//-----------------------------------------------------------------
#include "STC15xxx.h"
#include <intrins.h>
#include <stdio.h>
#include <math.h>
#define u8 unsigned char
#define u16 unsigned int
//TC72寄存器地址定義
#define TC72_CTRL 0x80 //控制寄存器
#define TC72_TEMP_LSB 0x01 //溫度低字節(jié)
#define TC72_TEMP_MSB 0x02 //溫度高字節(jié)
#define TC72_MANU_ID 0x03 //制造商ID
//SPI接口引腳定義(模擬方式)
sbit SCK = P3^4; //串行時(shí)鐘控制腳
sbit CE = P3^5; //片選
sbit SDI = P3^6; //串行數(shù)據(jù)輸入
sbit SDO = P3^7; //串行數(shù)據(jù)輸出
u8 Temp_Value[2]; //兩字節(jié)溫度值原始數(shù)據(jù)
extern void delay_ms(u16 x);
//-----------------------------------------------------------------
// 從當(dāng)前地址讀取一字節(jié)數(shù)據(jù)(模擬方式)
//-----------------------------------------------------------------
u8 _ReadByte() {
u8 i ,d = 0x00;
for(i = 0; i < 8; i++) //串行讀取8位數(shù)據(jù)
{ //SCK下降沿讀取數(shù)據(jù),讀取的位保存到左移以后的d的低位
SCK = 1; SCK = 0; d = (d << 1) | SDO;
}
return d; //返回讀取的字節(jié)
}
//-----------------------------------------------------------------
// 向當(dāng)前地址寫入一字節(jié)數(shù)據(jù)(模擬方式)
//-----------------------------------------------------------------
void _WriteByte(u8 dat) {
u8 i;
for(i = 0; i < 8; i++) { //串行寫入8位數(shù)據(jù)
dat <<= 1; SDI = CY; //dat左移位,高位被移入CY,發(fā)送高位
SCK = 0; SCK = 1; //時(shí)鐘上升沿向存儲(chǔ)器寫入數(shù)據(jù)
}
}
//-----------------------------------------------------------------
// 向TC72寫入兩字節(jié)(地址,數(shù)據(jù))(模擬方式)
//-----------------------------------------------------------------
void Write_TC72(u8 addr, u8 dat) {
CE = 1; //SPI_EN();
_WriteByte(addr); //SPI_SendData(addr);
_WriteByte(dat); //SPI_SendData(dat);
CE = 0; //SPI_DI();
}
//-----------------------------------------------------------------
// 寫TC72配置數(shù)據(jù)
//-----------------------------------------------------------------
void Config_TC72() {
Write_TC72(TC72_CTRL,0x15); //配置為單次轉(zhuǎn)換與關(guān)斷模式
}
//-----------------------------------------------------------------
// 從TC72讀取兩字節(jié)溫度數(shù)據(jù)并轉(zhuǎn)換為浮點(diǎn)溫度值
//-----------------------------------------------------------------
float Read_TC72_Temperature() {
Config_TC72();
delay_ms(50);
CE = 1; //SPI_EN();
//發(fā)送讀溫度高字節(jié)命令
_WriteByte(TC72_TEMP_MSB); //SPI_SendData(TC72_TEMP_MSB);
//連續(xù)讀取兩字節(jié)(連續(xù)讀取時(shí)先得到的是高字節(jié),后得到的是低字節(jié))
Temp_Value[1] = _ReadByte(); //SPI_SendData(0xFF);//讀高字節(jié)
Temp_Value[0] = _ReadByte(); //SPI_SendData(0xFF);//讀低字節(jié)
CE = 0; //SPI_DI();
//還可以使用以下單字節(jié)讀取的方法
//SPI_EN();
//SPI_SendData(TC72_TEMP_LSB); //發(fā)送讀溫度低字節(jié)命令
//T[0] = SPI_SendData(0xFF); //讀LSB
//SPI_DI();
//SPI_EN();
//SPI_SendData(TC72_TEMP_MSB); //發(fā)送讀溫度高字節(jié)命令
//T[1] = SPI_SendData(0xFF); //讀MSB
//SPI_DI();
return (int)(((int)((Temp_Value[1]<<8)|Temp_Value[0]))>>6) * 0.25;
}
//-------------------------- DS1302.c -----------------------------
// 名稱:1602字符液晶(HD44780)工作于4位模式顯示DS1302時(shí)鐘
//-----------------------------------------------------------------
#include "DS1302.h"
u8 DateTime[7]; //保存所讀取的日期時(shí)間數(shù)據(jù)
//-----------------------------------------------------------------
// 向DS1302寫入一字節(jié)
//-----------------------------------------------------------------
void Write_A_Byte_TO_DS1302(u8 x) {
u8 i;
for(i=0x01;i!=0x00;i<<=1){IO=x&i;SCLK=1;SCLK=0;}
}
//-----------------------------------------------------------------
// 從DS1302讀取一字節(jié)
//-----------------------------------------------------------------
u8 Get_A_Byte_FROM_DS1302() {
u8 i,dat=0x00;
for(i=0x01;i!=0x00;i<<=1)
{ if(IO) dat|= i; SCLK=1;SCLK=0;}
return dat;//返回所讀取的BCD碼
//將BCD碼轉(zhuǎn)換為十進(jìn)制數(shù)返回時(shí),使用下面的語句之一
//return dat/16*10+dat%16;
//return (dat>>4)*10+(dat&0x0F);
//注意使用不同的編碼返回時(shí),主程序中的格式化日期時(shí)間函數(shù)Format_DateTime要使用不同的語句進(jìn)行分解
}
//-----------------------------------------------------------------
// 從DS1302指定位置讀取數(shù)據(jù)
//-----------------------------------------------------------------
u8 Read_Data(u8 addr) {
u8 dat;
RST=0;SCLK=0;RST=1;
Write_A_Byte_TO_DS1302(addr);
dat=Get_A_Byte_FROM_DS1302();
SCLK=1;RST=0;
return dat;
}
//-----------------------------------------------------------------
// 讀取當(dāng)前日期時(shí)間
//-----------------------------------------------------------------
void GetDateTime() {
u8 i,addr=0x81;
for(i=0;i<7;i++,addr+=2) DateTime[i ]=Read_Data(addr);
}
發(fā)表于 2024-3-2 11:38
DS1302的驅(qū)動(dòng)
無標(biāo)題.png (168.44 KB, 下載次數(shù): 0)
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |