📄 tlc549lcd.c
字号:
/********************************************************************
* 文件名 : TLC549LCD.c
* 描述 : TLC549是一个新型的AD转换器,具有8位的分辨率,具有控制简单,体积小的优点。
工程当中的AD是要经过多次采集然后再计算出相对准确的值的。
这里的电压值通过液晶1602显示出来。
* 创建人 : 东流,2009年4月10日
* 版本号 : 2.0
* 技术支持论坛:www.zidh.com/bbs(请进入“赞助商板块”中的“东流电子工作室”)
* 感谢“中国自动化资讯网”对本工作室的大力支持。
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit AD_Out = P3^2; //TLC549输出端
sbit CS = P1^0; //TLC549片选信号
sbit AD_In = P1^1; //TLC549输入端
//这三个引脚参考资料
sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^5; //1602数据/命令选择引脚
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++)
;
}
/********************************************************************
* 名称 : Convert(uchar In_Date)
* 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
* 输入 : 1602资料上的值
* 输出 : 送到1602的值
***********************************************************************/
uchar Convert(uchar In_Date)
{
uchar i, Out_Date = 0, temp = 0;
for(i=0; i<8; i++)
{
temp = (In_Date >> i) & 0x01;
Out_Date |= (temp << (7 - i));
}
return Out_Date;
}
/********************************************************************
* 名称 : enable(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void enable(uchar del)
{
P0 = Convert(del);
RS = 0;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
/********************************************************************
* 名称 : write(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write(uchar del)
{
P0 = Convert(del);
RS = 1;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}
/********************************************************************
* 名称 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
L1602_char(1,5,'b')
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
write(sign);
}
/********************************************************************
* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{
if(*p == '\0') break;
write(*p);
p++;
}
}
/********************************************************************
* 名称 : AD_Change(void)
* 功能 : TLC549驱动程序,在“视频及教程”中有讲解。
* 输入 : 无
* 输出 : temp (电压值)
***********************************************************************/
uchar AD_Change(void)
{
uchar i,temp = 0;
CS = 0;
_nop_();
_nop_();
_nop_();
_nop_();
for(i=0; i<8; i++)
{
AD_In = 1;
_nop_();
_nop_();
temp = temp << 1;
if(AD_Out == 1) temp += 1;
AD_In = 0;
_nop_();
_nop_();
}
CS = 1;
return temp;
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Test_TLC549(void)
{
uint i = 0,temp;
uint j;
P2 = 0x00;
for(i=0; i<100; i++) delay();
delay();
L1602_init();
L1602_string(1,1,"AD(TLC549) TEST ");
L1602_string(2,1," 0.00V ");
P2 = 0x00;
P1 = 0xff;
for(i=0; i<500; i++)
{
temp = AD_Change();
j = temp * 2; //这里取的是一个大概的值。真实电压应为 temp * 5 / 256, 得出的数为 "x.xx"。
L1602_char(2,6,j/100%10+48);
L1602_char(2,8,j/10%10+48);
L1602_char(2,9,j%10+48);
delay();
}
enable(0x01);
}
#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE
sbit DQ = P3^4;
unsigned char TMPH,TMPL;
/********************************************************************
* 名称 : delay()
* 功能 : 延时函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_11(uint N)
{
int i;
for(i=0; i<N; i++)
;
}
/********************************************************************
* 名称 : Reset()
* 功能 : 复位DS18B20
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar Reset(void)
{
uchar deceive_ready;
DQ = 0;
delay_11(29);
DQ = 1;
delay_11(3);
deceive_ready = DQ;
delay_11(25);
return(deceive_ready);
}
/********************************************************************
* 名称 : read_bit()
* 功能 : 从DS18B20读一个位值
* 输入 : 无
* 输出 : 从DS18B20读出的一个位值
***********************************************************************/
uchar read_bit(void)
{
uchar i;
DQ = 0;
DQ = 1;
for(i=0; i<3; i++);
return(DQ);
}
/********************************************************************
* 名称 : write_bit()
* 功能 : 向DS18B20写一位
* 输入 : bitval(要对DS18B20写入的位值)
* 输出 : 无
***********************************************************************/
void write_bit(uchar bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay_11(5);
DQ=1;
}
/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输入 : 无
* 输出 : 从DS18B20读到的值
***********************************************************************/
uchar read_byte(void)
{
uchar i,m,receive_data;
m = 1;
receive_data = 0;
for(i=0; i<8; i++)
{
if(read_bit())
{
receive_data = receive_data + (m << i);
}
delay_11(6);
}
return(receive_data);
}
/********************************************************************
* 名称 : write_byte()
* 功能 : 向DS18B20写一个字节
* 输入 : val(要对DS18B20写入的命令值)
* 输出 : 无
***********************************************************************/
void write_byte(uchar val)
{
uchar i,temp;
for(i=0; i<8; i++)
{
temp = val >> i;
temp = temp & 0x01;
write_bit(temp);
delay_11(5);
}
}
void Test_DS18B20()
{
float tt, i;
uint temp;
P2 = 0x00;
for(i=0; i<100; i++) delay();
L1602_init();
L1602_string(1,1," DS18B20 TEST ");
L1602_string(2,1,"Temperature:00`C");
for(i=0; i<300; i++)
{
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL = read_byte();
TMPH = read_byte();
temp = TMPH;
temp <<= 8;
temp = temp | TMPL;
tt = TMPL * 0.0625;
temp = TMPL / 16 + TMPH * 16;
L1602_char(2,13,temp/10%10 + 48);
L1602_char(2,14,temp%10 + 48);
}
enable(0x01);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -