#include<reg52.h> #include<intrins.h> //调用_nop_();延时函数用 #define uint unsigned int #define uchar unsigned char #define DATE_IO P0//P0口并行传输数据 uchar code table[]="0123456789";//定义显示的数组 uchar codetable1[]="WWW.TXMCU.COM"; sbit RS=P1^0;//LCD1602寄存器选择端 sbit RW=P1^1;//LCD1602 读写控制端 sbit E=P1^2; //LCD1602 使能信号端 sbit oe=P1^3;//0809输出允许控制端 sbit eoc=P1^4;//0809转换结束信号端 sbit clk=P1^5;//为0809提供时钟 sbit st=P1^6;//与0809的ale相连,一起启动 a/d转换 uchar date=0;//转换后得到数据 void write_command() ; voidwrite_date() ; voidinityejing(); voidchuli(); voidadc0809(); void initdingshi(); void delay_us(unsigned int n); void delay_ms(uint i); void delay(uint z); //********************* 控制LCD1602的函数******************************* void write_command(uchar come)//写指令函数 { RW=0; RS=0;//选择指令寄存器 E=0;//由高电平跳变成低电平时,液晶执行命令 DATE_IO=come; delay_us(5); E=1; delay_us(5); E=0; } void write_data(uchar date)//写数据函数 { RS=1;//选择数据寄存器 RW=0; E=0;//由高电平跳变成低电平时,液晶执行命令 DATE_IO=date; delay_us(5); E=1; delay_us(5); E=0;; } void inityejing()//液晶初始化函数 { E=0; write_command(0x38);//设置LCD两行显示,一个数据由5*7点阵表示,数据由8跟线传输 delay_ms(5); write_command(0x01);//清除屏幕显示 delay_ms(5); write_command(0x06);//设定输入方式,增量不移位 delay_ms(5); write_command(0x0c);//开整体显示,关光标,不闪烁 delay_ms(5); } void chuli() { uchar temp; uchar q,b,s,g; temp= date*5/256;//数据处理 temp=temp*100; q=(int)temp/1000; b=(int)temp%1000/100; s=(int)temp%1000%100/10; g=(int)temp%10; write_command(0x80);//1602显示处理好的数据 { write_data(table[q]); delay(20); write_data(table); delay(20); write_data(table1[3]); delay(20); write_data(table); delay(20); write_data(table[g]); delay(20); } } //********************** 已成使用0809的固定格式,拿来即可用***************** void adc0809()//启动0809转换,并得到转换后的结果 { st=0;//以下三表达式表示启动 A/D转换 st=1; st=0; while(!eoc);//等待转换结束 oe=1;//为高电平时,转换的数据输送个单片机 date=P2;//从P2引脚读转换后的信息 oe=0; } //************************************************************************** void initdingshi()//初始化定时器 0模式2(主要是为了给 0809提供时钟) { TMOD=0x12;//定时器0的模式2 TH0=254;//定时2us TL0=254; TR0=1;//启动定时器 0 ET0=1;//开定时器0中断控制位 EA=1;//开总中断 } void time0() interrupt 1//定时器0中断 { clk=~clk; } void main() { inityejing();//调用液晶初始化函数 initdingshi();//初始化定时器 0 while(1)//程序一直循环执行 0-999的计数 { adc0809();//启动0809转换,并得到转换后的结果 chuli();//调用将各位数字拆开函数 } } //********************** 延时函数***************************************** void delay_us(unsigned int n) { if(n==0) return ; while(--n); } void delay_ms(uint i) { unsigned char a,b; for (a=1;a<i;a++) for(b=1;b;b++); } void delay(uint z) { uint x,y; for(x=110;x>0;x--) for(y=z;y>0;y--); }
|