📄 0809.c
字号:
#include <REGX52.H>
#include <intrins.h>
#include <absacc.h>
#include <math.h>
void WriteCommandLCM(unsigned char WCLCM,unsigned char BusyC);
void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData);
void lcd_wait(void); //LCD内部等待函数
void delay(int k); //定义延时
void initLCM(); //定义显示器初始化
void display(void); //显示函数
unsigned char ad_action(unsigned char chn);
void IntToStr1(unsigned int t);
void IntToStr2(unsigned int t);
void TimeInitial();
void alarm(void);
#define DATAPORT P2
unsigned char chnn;
#define IN0 XBYTE[0x7ff8+chnn]
unsigned char dispdata1[4];
unsigned char dispdata2[4];
unsigned int pre;
unsigned int tem;
sbit LCM_RS=P3^1;
sbit LCM_RW=P3^3;
sbit LCM_EN=P3^4;
sbit EOC=P3^2; //忙信号
sbit Clk=P3^5; //时钟信号
sbit BLUE=P1^0;
sbit RED=P1^3;
sbit warning=P1^7;
unsigned char code str1[]={"temperature: C"};
unsigned char code str2[]={"pressure: Kpa"};
void main()
{
unsigned char q=0;
unsigned char p;
unsigned char xdata *ad_adr;
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
SCON=0x50;
PCON&=0xef;
TR1=1;
ES=0;
delay(500); //系统延时500ms启动
initLCM(); //进行LCD初始化子程序
WriteCommandLCM(0x01,1); //清显示屏
DisplayListChar(0,0,str1); //显示器第一行
DisplayListChar(0,1,str2); //显示器第二行
TimeInitial();
ad_adr=&IN0;
while(1)
{
*ad_adr = 0;
p=p; //延时
p=p;
p=p;
while(EOC==0);
while(1)
{
IntToStr1(ad_action(0)*1.0/255*600);
display();
IntToStr2(ad_action(1)*1.0/255*40);
display();
alarm();
while(str1[q]!='\0')
SBUF=str1[q];
while(!TI);
TI=0;
q++;
}
delay(500);
}
}
/*********延时K*1ms程序*********/
void delay(int k)
{
int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<60;j++)
{;}
}
}
/**********LCM初始化子函数***********/
void initLCM()
{
DATAPORT=0;
delay(15);
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
delay(5);
WriteCommandLCM(0x38,0);
delay(5);
WriteCommandLCM(0x38,0);
delay(5);
WriteCommandLCM(0x38,1); //8bit数据传送,2行显示,5*7字型,检测忙信号
WriteCommandLCM(0x08,1); //关闭显示,检测忙信号
WriteCommandLCM(0x01,1); //清屏,检测忙信号
WriteCommandLCM(0x06,1); //显示光标右移设置,检测忙信号
WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
}
/**********写指令到ICM子函数************/
void WriteCommandLCM(unsigned char WCLCM,unsigned char BusyC)
{
if(BusyC)
lcd_wait();
DATAPORT=WCLCM;
LCM_RS=0; // 选中指令寄存器
LCM_RW=0; // 写模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
/**********写数据到LCM子函数************/
void WriteDataLCM(unsigned char WDLCM)
{
lcd_wait(); //检测忙信号
DATAPORT=WDLCM;
LCM_RS=1; // 选中数据寄存器
LCM_RW=0; // 写模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
/***********LCD内部等待函数*************/
void lcd_wait(void)
{
DATAPORT=0xff; //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
_nop_();
_nop_();
while(P0&0x80)
{
LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}
LCM_EN=0;
}
/****显示指定坐标的一个字符子函数****/
void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData)
{
Y&=0x01;
X&=0x0f;
if(Y)X|=0x40; //若y为1(显示第二行),地址码+0X40
X|=0x80; //指令码为地址码+0X80
WriteCommandLCM(X,1);
WriteDataLCM(DData);
}
/*******显示指定坐标的一串字符子函数*****/
void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData)
{
unsigned char ListLength=0;
Y&=0x01;
X&=0x0f;
while(X<16)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
/*************系统显示子函数*************/
void display(void)
{
WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
DisplayListChar(0,0,str1);
DisplayListChar(0,1,str2);
DisplayOneChar(12,0,dispdata1[1]+0x30);
DisplayOneChar(13,0,dispdata1[2]+0x30);
DisplayOneChar(14,0,dispdata1[3]+0x30);
DisplayOneChar(10,1,dispdata2[2]+0x30);
DisplayOneChar(11,1,dispdata2[3]+0x30);
delay(500); //稳定显示
}
//AD0808CLOCK时钟信号
void Time(void) interrupt 3 using 0
{
TH1=(65536-200)/256;
TL1=(65536-200)%256;
Clk=~Clk;
}
//AD0808初始化
void TimeInitial()
{
TMOD=0x10;
TH1=(65536-200)/256;
TL1=(65536-200)%256;
EA=1;
ET1=1;
TR1=1;
}
//AD0808数据转换
unsigned char ad_action(unsigned char chn)
{
unsigned char read_data;
chnn=chn;
IN0=chn;
delay(15);
read_data=IN0;
return read_data;
}
//读取AD0808数据
void IntToStr1(unsigned int t)
{
dispdata1[0]=(t/1000)%10; //取得整数值到数组
dispdata1[1]=(t/100)%10;
dispdata1[2]=(t/10)%10;
dispdata1[3]=(t/1)%10;
}
void IntToStr2(unsigned int t)
{
dispdata2[0]=(t/1000)%10; //取得整数值到数组
dispdata2[1]=(t/100)%10;
dispdata2[2]=(t/10)%10;
dispdata2[3]=(t/1)%10;
}
void alarm()
{
pre=dispdata2[2]*10+dispdata2[3];
tem=dispdata1[1]*100+dispdata1[1]*10+dispdata1[1];
if(20<=pre&&pre<=30&&tem<400)
{
BLUE=0;
RED=1;
}
else
{
BLUE=1;
RED=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -