📄 stc5410_ad.c
字号:
#pragma NOAREGS
#include <reg52.h>
#include <string.h>
#include<intrins.h>
#include <stdlib.h> //for exit() function
#include <ctype.h> //for toupper() function
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
//*******************************************************
double Temperature;
uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节
uchar *p;
sbit tem_A = P1^7;
bit flag;
uchar tem10,tem1,tem_1,tem_11;
bit flag;
uchar polarity;
//*****************************************************************
uchar LED_code_09[11]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B,0x00};
//****************************************************************************************************
/* 延时1uS子程序,主要用于2线接口,与单片机速度有关 */
#define DELAY_1US {_nop_();}
/* 2线接口的连接,与实际电路有关 */
sbit CH452_SCL=P2^0;
sbit CH452_SDA=P2^1; // 如果使用真正的2线接口,那么SDA接中断引脚P3^3/INT1,用SDA直接做中断输出
/* 2线接口的位操作,与单片机有关 */
#define CH452_SCL_SET {CH452_SCL=1;}
#define CH452_SCL_CLR {CH452_SCL=0;}
#define CH452_SDA_SET {CH452_SDA=1;}
#define CH452_SDA_CLR {CH452_SDA=0;}
uchar data_H,data_L;
uchar display[13]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40,0x3E};//显示:0--9 ,"""-""V" 共阴
//****************************************************************************************
//*函 数 名: delay **********
//*功能描述: 毫秒延时 **********
//****************************************************************************************
dealayms(int xxxx)
{
uint dlay ;
//**************************************************************
for(dlay=xxxx;dlay>0;dlay--);
}
//************************************************************************************************************
void CH452_WrByte(uchar data_4B,uchar data_8B) //写一个字节数据 data_4B的低四位为数据(有效)
{
uchar i;
data_4B*=16;
//****************************************************
CH452_SDA_SET; /*发送起始条件的数据信号*/
CH452_SCL_SET;
dealayms(100);
CH452_SDA_CLR; /*发送起始信号*/
dealayms(100);
CH452_SCL_CLR; /*钳住I2C总线,准备发送或接收数据 */
dealayms(100);
//*****************************************************
CH452_SDA_CLR; //DA0=0
CH452_SCL_SET;
dealayms(100);
CH452_SCL_CLR;
//*****************************************************
CH452_SDA_SET; //DA1=1
CH452_SCL_SET;
dealayms(100);
CH452_SCL_CLR;
//*****************************************************
CH452_SDA_SET; //ADDR=1
CH452_SCL_SET;
dealayms(100);
CH452_SCL_CLR;
//*****************************************************
for(i=0;i!=4;i++) // 输出4位数据 D11-D8
{
if(data_4B&0x80) {CH452_SDA_SET;}
else {CH452_SDA_CLR;}
CH452_SCL_SET;
data_4B<<=1;
dealayms(100);
dealayms(100);
CH452_SCL_CLR;
dealayms(100);
}
//*****************************************************
CH452_SDA_CLR; //R/W=0 表示继续写数据
CH452_SCL_SET;
dealayms(100);
CH452_SCL_CLR;
//*****************************************************
CH452_SDA_SET; //接受应答
CH452_SCL_SET;
dealayms(100);
CH452_SCL_CLR;
//*****************************************************
for(i=0;i!=8;i++) // 输出8位数据 D7-D0
{
if(data_8B&0x80) {CH452_SDA_SET;}
else {CH452_SDA_CLR;}
CH452_SCL_SET;
data_8B<<=1;
dealayms(100);
dealayms(100);
CH452_SCL_CLR;
dealayms(100);
}
//**************************************************
CH452_SCL_SET;
CH452_SDA_SET;
dealayms(100);
dealayms(100);
}
//****************************************************************************************************88
//*******************************************************************************************************
//显示函数
void Temp_display()
{
//*******************************************************************************************************/
//**********************设置显示参数 四位显示
data_H=0x03; //0x03表示显示4位
data_L=0x40;
CH452_WrByte(data_H,data_L);
//**************************************************
data_H=0x0B; //第1位显示
data_L=display[polarity];
CH452_WrByte(data_H,data_L);
//**************************************************
//**************************************************
data_H=0x0A; //第2位显示
data_L=display[tem10];
CH452_WrByte(data_H,data_L);
//**************************************************
//**************************************************
data_H=0x09; //第3位显示
data_L=display[tem1]|0x80; //显示小数点
CH452_WrByte(data_H,data_L);
//**************************************************
data_H=0x08; //第4位显示
data_L=display[tem_1];
CH452_WrByte(data_H,data_L);
//**************************************************
//******************************************************************************************************* data_H=0x04;
data_H=0x04;
data_L=0x11;
CH452_WrByte(data_H,data_L);
dealayms(5);
}
//*****************************************************************************************
void delay(uint number) //毫秒延时
{
for(;number!=0;number--);
}
//*****************************************************************************************
void serialset (void) //串口设置
{
TMOD=0x21; //定义串行口 (T1波特率发生器)
TL1=0xFA; //波特率为9600
TH1=0xFA;
EA = 1;
PCON=0x80;
ET1=0;
TR1=1;
TI=0;
ES=1;
SCON=0x50;
PS=1; //串口中断优先级设置最高
}
//****************************************************************************************
void sendchar(unsigned int sendsign)// //单字节发送子程序
{
ES=0;
SBUF=sendsign;
while(TI==0);
TI=0;
ES=1;
}
//****************************************************************************************************88
/************************************************************
*Function:延时处理
*parameter:
*Return:
*Modify:
*************************************************************/
void TempDelay (uchar us)
{
uchar uss=us;
uint i;
for(i=0;i<10;i++)
{
while(--us);
us=uss;
}
}
/************************************************************
*Function:18B20初始化
*parameter:
*Return:
*Modify:
*************************************************************/
void Init18b20_A ()
{
tem_A=1;
TempDelay(1);
tem_A=0;
TempDelay(242); //delay 530 uS//80
tem_A=1;
TempDelay(42); //delay 49 uS//7
if(tem_A==0)
flag = 1; //detect 1820 success!
else
flag = 0; //detect 1820 fail!
TempDelay(20); //20
tem_A = 1;
}
/************************************************************
*Function:向18B20写入一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte_A (uchar wr) //单字节写入
{
uchar i;
for (i=0;i<8;i++)
{
tem_A = 0;
TempDelay(1);
tem_A=wr&0x01;
TempDelay(8); //delay 45 uS //5
tem_A=1;
wr >>= 1;
}
}
/************************************************************
*Function:读18B20的一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
uchar ReadByte_A () //读取单字节
{
uchar i,u=0;
for(i=0;i<8;i++)
{
tem_A = 0;
TempDelay(1);
u >>= 1;
tem_A = 1;
if(tem_A==1)
u |= 0x80;
TempDelay (6);
tem_A = 1;
}
return(u);
}
/************************************************************
*Function:读18B20
*parameter:
*Return:
*Modify:
*************************************************************/
void read_bytes_A (uchar j)
{
uchar i;
for(i=0;i<j;i++)
{
*p = ReadByte_A();
p++;
}
}
/************************************************************
*Function:读取温度
*parameter:
*Return:
*Modify:
*************************************************************/
void GemTemp_A ()
{
read_bytes_A (2);
Temperature = temp_buff[1]*0x100 + temp_buff[0];
//Temperature *= 0.625;
Temperature /= 16;
TempDelay(1);
}
/************************************************************
*Function:18B20ID全处理
*parameter:
*Return:
*Modify:
*************************************************************/
void TemperatuerResult_A()
{
Init18b20_A ();
WriteByte_A(0xCC); //skip rom
WriteByte_A(0x44); //Temperature convert
Init18b20_A ();
TempDelay(30);
WriteByte_A(0xCC); //skip rom
WriteByte_A(0xBE); //read Temperature
p = temp_buff;
GemTemp_A();
}
//****************************************************************************************
Temperature_js()
{
//*******************************************************
tem10=Temperature/10;
tem1=Temperature-tem10*10;
Temperature-=(tem10*10+tem1);
Temperature*=10;
tem_1=Temperature;
//**********************************************************
}
main()
{
delay( 50000);
delay( 50000);
delay( 50000);
delay( 50000);
delay( 50000);
delay( 50000);
serialset ();
while (1)
{
TemperatuerResult_A();
Temperature_js();
sendchar(tem10);
sendchar(tem1);
sendchar(85);
Temp_display();
delay( 50000);
delay( 50000);
delay( 50000);
delay( 50000);
delay( 50000);
delay( 50000);
delay( 50000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -