📄 main.c
字号:
//-----------------------------------------------------------------
// 名称: DS1621温度传感器实验
//-----------------------------------------------------------------
// 说明: 传感器可检测温度范围为-55.0℃- 125.0℃.
// 程序运行过程中,可通过动态调节温度来模拟外界温度变化,
// 本例中温度通过虚拟终端显示,当模拟外界温度超过上限时,
// Tout将呈现高电平,继电器吸合,直到温度重新下降到TL之下时,
// Tout才呈现低电平,断电器断开.
//
//-----------------------------------------------------------------
#include <pic.h>
#include <string.h>
#include <stdio.h>
#define INT8U unsigned char
#define INT16U unsigned int
#define _XTAL_FREQ 4000000UL
//DS1621子器件地址
#define SUB_DEV_ADDR 0x90
//时钟,数据线定义,数据线方向定义
#define SCL RD0
#define SDA RD1
#define SDA_IN() TRISD1 = 1
#define SDA_OUT() TRISD1 = 0
char Prompt[] = "Starting...\r";
INT8U d[2] = {0x00,0x00}; //读取两字节温度数据
INT8U SET_CONFIG[] = {0xAC,0x02}; //写配置字节
INT8U SET_TH[] = {0xA1,0,0}; //设置TH
INT8U SET_TL[] = {0xA2,0,0}; //设置TL
INT8U START_CONV[]= {0xEE}; //启动转换
bit RD_ACK; INT8U a,b,c;
// IIC启动宏定义
#define Start() {SDA_OUT(); SCL = 1; NOP(); SDA = 1; NOP(); SDA = 0; NOP();}
//IIC停止宏定义
#define Stop() {SDA_OUT(); SCL = 1; NOP(); SDA = 0; NOP(); SDA = 1; NOP();}
//-----------------------------------------------------------------
// 发送一字节
//-----------------------------------------------------------------
void SendByte(INT8U dat)
{
SDA_OUT();//数据方向设为输出
//8个时钟周期串行输出输出8位(1字节)
for(INT8U i = 0x80; i != 0x00; i >>= 1)
{
}
//第9个时钟周期拉高SDA,然后读取应答
//数据线设为输入,读取SDA为低电平时表示从机应答,否则为无应答
}
//-----------------------------------------------------------------
// 接收一字节
//-----------------------------------------------------------------
INT8U RecvByte(INT8U cnt)
{
INT8U dat = 0x00;
SDA_IN(); //设置数据方向为输入
//8个时钟周期读取1字节数据
for(INT8U i = 0x80; i != 0x00; i >>= 1)
{
}
//第9个时钟周期发送应答或非应答(温度高字节应答,低字节非应答)
return dat;
}
//-----------------------------------------------------------------
// 向IIC总线写入多字节
//-----------------------------------------------------------------
void Write_IIC(INT8U slave_addr,INT8U *buff, INT8U n)
{
}
//-----------------------------------------------------------------
// 串口初始化
//-----------------------------------------------------------------
void Serial_port_init()
{
SYNC = 0; //选择异步通信模式
BRGH = 1; //选择高速波特率发生模式
TXEN = 1; //允许发送数据
SPBRG = _XTAL_FREQ/16/9600 - 1; //设置波特率为9600
SPEN = 1; //串行通信端口打开
CREN = 1; //使能连续接收串行数据
}
//------------------------------------------------------------------
// 通过串口发送一个字符
//------------------------------------------------------------------
void putchar(char c)
{
//发送一个字符,然后等待发送结束
}
//-----------------------------------------------------------------
// 向串口发送读取的温度
//-----------------------------------------------------------------
void USART_Show()
{
}
//-----------------------------------------------------------------
// 读取温度
//-----------------------------------------------------------------
void Read_Temp()
{
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
INT8U i = 0;
TRISD0 = TRISD1 = 0; //SCL,SDA输出
Serial_port_init(); //初始化串口
while (Prompt[i] != '\0') putchar(Prompt[i++]); //输出提示字符串
//配置寄存器的8位配置位为:DONE THF TLF NVB X X POL 1SHOT
//下面的语句置位POL和1SHOT,设置报警输出时极性为高电平
//1SHOT设为1时,仅在接收到转换命令时开始转换,设为0时将持续进行转换
//-------------------------------------------------------------
// 设置温度上下限,温度高于上限时Tout变为高电平,低于下限时Tout变为低电平
//-------------------------------------------------------------
//循环读取并发送串口显示温度
while(1)
{ //读取温度,送串口显示,延时200ms
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -