標題: 51+LCD1602+ADC0808 [打印本頁]
作者: 青枳 時間: 2017-6-20 15:45
標題: 51+LCD1602+ADC0808
1、LCD1602.c源程序
//液晶控制與顯示驅動程序
#include<reg52.h>
#include<intrins.h>
#include<string.h>
#include"LCD1602.h"
#include"ADC0808.h"
//---------------忙檢查-------------------//
ucharLCD_Busy_Check()
{
ucharLCD_Status;
RS = 0;
RW = 1;
E = 1;
delay4us();
LCD_Status = P0;
E = 0;
return LCD_Status;
}
//--------------向LCD寫入命令--------------------//
voidWrite_LCD_Command(uchar cmd)
{
while((LCD_Busy_Check()&0x80)==0x80); //忙等待
RS = 0;
RW = 0;
E =0;
P0 = cmd;
delay4us();
E = 1;
delay4us();
E = 0;
}
//-----------向LCD寫入一個字節的數據函數-----------------*/
voidWrite_LCD_Data(uchar dat)
{
while((LCD_Busy_Check()&0x80)==0x80);
RS = 1;
RW = 0;
E =0;
P0 = dat;
delay4us();
E = 1;
delay4us();
E = 0;
}
//-----------LCD初始化-----------------*/
voidInitialize_LCD1602() //液晶初始化函數
{
Write_LCD_Command(0x38);delay50us(10); //功能設置,數據長度為8位,雙行顯示,5×7點陣字體
Write_LCD_Command(0x0C);delay50us(10); // 顯示開,關光標
Write_LCD_Command(0x06);delay50us(10); //字符進入模式:屏幕不動,字符后移
Write_LCD_Command(0x01); delay50us(10);//清屏
}
//-----------在LCD上顯示字符串-----------------*/
voidLCD_Display(uchar *str)
{
uchar i;
for(i=0;i<strlen(str);i++)
{
Write_LCD_Data(str);
delay50us(100);
}
}
2、lCD1602_H頭文件
#ifndef__lCD1602_H__
#define __LCD1602_H__
#include<reg52.h>
#definedat_port P0
#defineuchar unsigned char
#defineuint unsigned int
#definedelay4us() {_nop_();_nop_();_nop_();_nop_();}
sbitRS=P2^0;//RS=1 數據 RS=0 命令
sbitRW=P2^1;//RW=1 讀取 RW=0 寫入
sbitE=P2^2;//E 使能信號
ucharLCD_Busy_Check();//忙檢查
voidWrite_LCD_Command(uchar cmd);//向LCD寫入命令
voidWrite_LCD_Data(uchar dat); //向LCD寫入一個字節的數據函數
voidInitialize_LCD1602(); //液晶初始化函數
voidLCD_Display(uchar *str);//在LCD上顯示字符串
#endif
3、ADC0808.C源程序
#include<reg52.h>
#include<intrins.h>
#include"ADC0808.h"
unsignedlong dat_adc0808;
uchardisplay_buffer[][16]={
{"Currentvoltage:"},
{" (CH) =0.00V"}
};
voiddelay50us(uint m)
{
uint n,k;
for(n=m;n>0;n--)
for(k=25;k>0;k--);
}
uintadc0808_init() // AD初始化
{
START=0;
OE=0;
START=1;
START=0;
while(EOC==0);
OE=1;
dat_adc0808=P1;
OE=0;
returndat_adc0808;
}
void Refresh_show() //刷新顯示
{
uintt=dat_adc0808*500.0/255; //
display_buffer[1][7] = t/100+'0'; //整數位
display_buffer[1][9] = t/10%10+'0'; //兩個小數位
display_buffer[1][10]= t%10+'0';
}
4、ADC0808.h 頭文件
#ifndef__ADC0808_H__
#define __ADC0808_H__
#include<reg52.h>
#definedata_port P1
#defineuchar unsigned char
#defineuint unsigned int
sbitSTART=P2^3;
sbitEOC=P2^4;
sbitOE=P2^5;
voiddelay50us(uint m);// 延時
uintadc0808_init(); // AD初始化
voidRefresh_show();
#endif
5、main.c 主程序
#include<reg52.h>
#include<intrins.h>
#include"LCD1602.h"
#include"ADC0808.h"
sbitCLOCK=P2^6;
externuchar display_buffer[][16];
voidmain()
{
TMOD=0x02;
TH0=0x14;
TL0=0x00;
IE=0x82;
TR0=1;
Initialize_LCD1602();
delay50us(10);
Write_LCD_Command(0x80);//設置顯示的初始位置
LCD_Display(display_buffer[0]);//顯示"Thevoltage is: "
while(1)
{
adc0808_init();
Refresh_show();
Write_LCD_Command(0xC0);//設置顯示的初始位置
LCD_Display(display_buffer[1]); //顯示測得的數據
}
}
voidTimer0_INT() interrupt 1
{
CLOCK=!CLOCK;
}
作者: deded 時間: 2018-4-28 20:53
可否上個電路圖
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |