?? 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 + -