📄 f-test.c
字号:
/* ---------------------------------------------------------------------------------------- */
/* */
/* */
/* */
/* 说明:DS1624测温程序,包含MAX7219控制数码管显示模块 */
/* */
/* I2C通信协议 */
/* -----------------------------------------------------------------------------------------*/
#include <absacc.h>
#include <reg51.h>
#include <stdio.h>
#include <math.h>
#include <intrins.h>
sbit CLK = P1^5;
sbit _CS = P1^6;
sbit DIN = P1^7;
sbit DQ=P1^4;
unsigned int prf;
float f;
int flag; //标志位
unsigned int led3,led2,led1,led0,f100;
#define DECODE_MODE 0x09 //译码控制寄存器
#define INTENSITY 0x0A //亮度控制寄存器
#define SCAN_LIMIT 0x0B //扫描界限寄存器
#define SHUT_DOWN 0x0C //关断模式寄存器
#define DISPLAY_TEST 0x0F //测试控制寄存器
/*
void resetTS () // 发送复位和初始化
{
unsigned int i;
DQ = 0;
i = 103;
while (i>0) i--; // 延时
DQ = 1;
i = 4;
while (i>0) i--;
}
bit tmpread () // 读取数据的一位
{
unsigned int i;
bit dat;
DQ = 0; i++;
DQ = 1; i++; i++; //延时
dat = DQ;
i = 8; while (i>0) i--; // 延时
return (dat);
}
unsigned char readBTS () //读一个字节
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j = tmpread ();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}
void writeBTS (unsigned char dat) //写一个字节
{
unsigned int i;
unsigned char j;
bit testb;
for (j=1;j<=8;j++)
{
testb = dat & 0x01;
dat = dat >> 1;
if (testb)
{
DQ = 0; // 写0
i++; i++;
DQ = 1;
i = 8; while (i>0) i--;
}
else
{
DQ = 0; // 写0
i = 8; while (i>0) i--;
DQ = 1;
i++; i++;
}
}
}
*/
void delay15() //延时15us
{
unsigned char i;
for(i=0;i<4;i++);
}
void delay60() //延时60us
{
unsigned char i;
for(i=0;i<15;i++);
}
void delay(unsigned int k) //
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<60;j++);
}
void write0TS() //写入DS1821数据位0
{
DQ=1;
DQ=0;
delay15();delay15();delay15();delay15();
DQ=1;
_nop_();
_nop_();
}
void write1TS() //写入DS1821数据位1
{
DQ=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
delay15();delay15();delay15();
}
bit readTS() //读取数据位
{
bit b;
DQ=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
b=DQ;
delay15();delay15();delay15();
_nop_();_nop_();
return b;
}
void resetTS() //复位
{
unsigned char i;
DQ=1;
DQ=0;
for(i=0;i<8;i++)
delay60();
DQ=1;
while(DQ);
for(i=0;i<8;i++)
delay60();
}
void writeBTS(unsigned char byte) //写1字节
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byte&0x01)
write1TS();
else
write0TS();
byte=byte>>1;
}
}
unsigned char readBTS() //读1字节
{
unsigned char i,j;
bit b;
j=0;
for(i=0;i<8;i++)
{
b=readTS();
if(b) j+=1;
j=_cror_(j,1);
}
return j;
}
unsigned char gettempTS() //读取温度数据
{
unsigned char temp1;
resetTS();
writeBTS(0xEE); //发送温度转换命令
delay(200); //预留温度转换时间
resetTS();
writeBTS(0xaa); //发送温度读取命令
temp1=readBTS();
return temp1;
}
// 函数声明
void Write7219(unsigned char address,unsigned char dat);
//MAX7219初始化。设置MAX7219内部的控制寄存器
/*
void Initial()
{
Write7219(SHUT_DOWN,0x01); //开启正常工作模式
Write7219(DISPLAY_TEST,0x00); //选择工作模式
Write7219(DECODE_MODE,0x0f); //选用0~3译码模式
Write7219(SCAN_LIMIT,0x03); //4只LED全用
Write7219(INTENSITY,0x04); //设置初始亮度9/32
}
*/
// 地址、数据发送子程序
void Write7219(unsigned char address,unsigned char dat)
{
unsigned char i;
_CS=0; // 拉低片选线.选中器件
//发送地址
for(i=0;i<8;i++) //移位循环8次
{
CLK=0; //清零时钟总线
DIN=(bit)(address&0x80); //每次取高字节
address<<=1; //左移一位
CLK=1; //时钟上升沿.发送地址
}
//发送数据
for(i=0;i<8;i++)
{
CLK=0;
DIN=(bit)(dat&0x80);
dat<<=1;
CLK=1;
}
//时钟上升沿.发送数据
_CS=1; //发送结束。上升沿锁存数据
}
/*
//测试程序
void main()
{
unsigned char i;
Initial(); //MAX7219初始化
while(1)
{
for(i=1;i<5;i++)
{
Write7219(i,i);//数码管依次显示1—4
}
}
}
*/
//void sendata(uint a,uint b,uint point);
/*
unsigned int count(void)
{
TMOD = 0x15; // T0 计数器方式1(C/T = 1, M1 = 0, M0 = 1) ,T1 定时器方式1(C/T = 0, M1 = 0, M0 = 1)
TH0 = 0X00; //计数器赋初值
TL0 = 0X00;
/* ----------------------------------------------------------------------- */
/* CLK = 12MHz, */
/* 产生50ms定时, T1初值 = 65536-50000*12/12=15536=0x3CB0 */
/* ----------------------------------------------------------------------- */
/* TH1 = 0x3C;
TL1 = 0xB0;
TR0 = 1; //启动计数器T0
TR1 = 1; //启动定时器T1
ET1 = 1; //开定时器T1中断,即定时器加计数到溢出时进入定时器T1的中断部分
ET0 = 0; //关计数器T0中断
while(tf!=1); //等待500ms定时到
TR1 = 0; //关定时器T1
TR0 = 0; //关计数器T0
return(TH0*256+TL0); //返回记数值
}
void timer1(void) interrupt 3
{
TH1 = 0x3C;
TL1 = 0xB0;
msn--;
if(msn==0)
{
msn=A;
tf=1;
}
}
*/
/*
void ResetT()
{
TR0 = 0;
TR1 = 0;
TMOD = 0x15; // T0 计数器方式1(C/T = 1, M1 = 0, M0 = 1) ,T1 定时器方式1(C/T = 0, M1 = 0, M0 = 1)
TH0 = 0; //计数器赋初值
TL0 = 0;
/* ----------------------------------------------------------------------- */
/* CLK = 12MHz, */
/* 产生60ms定时, T1初值 = 65536-60000*12/12=5536=0x15A0 */
/* ----------------------------------------------------------------------- */
/* TH1 = 0x15;
TL1 = 0xA0;
TR0 = 1; //启动计数器T0
TR1 = 1; //启动定时器T1
ET1 = 1; //开定时器T1中断,即定时器加计数到溢出时进入定时器T1的中断部分
ET0 = 0; //关计数器T0中断
}
*/
void Init()
{
_CS=1;
CLK=1;
DIN=1;
// flag=0;
Write7219(SHUT_DOWN,0x01); //开启正常工作模式
Write7219(DISPLAY_TEST,0x00); //选择工作模式
Write7219(DECODE_MODE,0x0f); //选用0~3译码模式
Write7219(SCAN_LIMIT,0x03); //4只LED全用
Write7219(INTENSITY,0x04); //设置初始亮度9/32
resetTS();
writeBTS(0x01); //写温度上限命令
writeBTS(0x78); //写温度TH为120度
resetTS();
writeBTS(0x02); //写温度下限命令
writeBTS(0xCE); //写温度TL为-50度
resetTS();
writeBTS(0x0C); //写状态寄存器
writeBTS(0x42); //设置1线工作方式
// ResetT();
// EA = 1; //开总中断
}
void LED_Display()
{
unsigned char temp2;
temp2=gettempTS();
if(temp2>128)
{
if(temp2>246)
{
led1=0x0f;
led2=0x0a;
led3=256-temp2;
}
else
{
led1=0x0a;
led2=(256-temp2)/10;
led3=(256-temp2)%10;
}
}
else
{
if(temp2>99)
{
led1=0x01;
led2=(temp2-100)/10;
led3=(temp2-100)%10;
}
else
{
if(temp2>9)
{
led1=0x0f;
led2=temp2/10;
led3=temp2%10;
}
else
{
led1=0x0f;
led2=0x0f;
led3=temp2;
}
}
}
// f100=(int)f*100;
// led0=f100/1000; //数据最高位,
// led1=(f100/100)%10; //数据次高位
// led2=(f100/10)%10; //数据次低位
// led3=f100%10; //数据低位
// Write7219(1,led0);
// Write7219(2,led1+128);
led0=0x0f;
Write7219(1,led0);
Write7219(2,led1);
Write7219(3,led2);
Write7219(4,led3);
}
void main()
{
Init ();
/* if(flag==1)
{
LED_Display(); //送数码管显示频率信息
flag=0;
} */
while (1)
{
LED_Display();
}
}
/*
void T1Routing() interrupt 3 //定时器T1中断函数
{
EA=0; //关外部中断
ET1 = 0; //关定时器T1中断
TR1 = 0; //关定时器T1
TR0 = 0; //关计数器T0
TF1 = 0;
prf = TH0 * 256 + TL0;
f=1/(60/prf); //计算得到脉冲频率,单位为KHz
LED_Display(); //送数码管显示频率信息
// flag=1; //设置标志位,表示为1时在主程序中送数码管显示
TH1 = 0x15; //定时器T1重初始化
TL1 = 0xA0;
TH0 = 0; //计数器T0重初始化
TL0 = 0;
EA=1; //开外部中断
ET1 = 1; //开定时器T1中断
TR1 = 1; //启动定时器
TR0 = 1; //启动计数器
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -