|
- //主程序
- //#include <STC89C5xRC.H>
- #include <reg52.h>
- #include"LM35LCD1602.h"
- #define ADC_DATA P1
- uchar Temp;
- uchar ggao[]="0123456789";
- uchar volt_data[]="volt:000.00v";
- uchar t1_flag = 0; //用于标记显示第几位数码管
- uchar seg0 = 0; //第0位数码管的值
- uchar seg1 = 1; //第1位数码管的值
- uchar seg2 = 2; //第2位数码管的值
- uchar seg3 = 3; //第3位数码管的值
- //处理后的数据
- sbit ADC_EOC = P3^3;
- sbit ADC_CLK = P3^4;
- sbit ADC_START = P3^6;
- sbit ADC_OE = P3^7;
- //*********************************************************************************
- //函数名:Delay
- //函数功能:软件延时函数
- //形式参数:uint i
- //*********************************************************************************
- void delayms(unsigned int ms)
- {
- unsigned char a,b,c;
- while(ms--)
- {
- for(c=1;c>0;c--)
- for(b=142;b>0;b--)
- for(a=2;a>0;a--);
- }
- }
- //===========================
- //定时器初始化,配置ADC0809时钟
- //===========================
- void timer_init(void)
- {
- //配置定时器0
- ET0 = 1;
- TMOD &= 0xF0;
- TMOD |= 0x02; //定时器0,模式2,自动重装定时器
- TH0 = 200; //自动重装值
- TL0 = 200;
- TR0 = 1; //配置定时器1
- ET1 = 1;
- TMOD &= 0x0F; //清除定时器1配置,不改动定时器0的配置
- TMOD |= 0x10; //定时器1模式一,不改动定时器0的模式
- TH1 = (65536 - 2000)/256;
- TL1 = (65536 - 2000)%256;
- TR1 = 1;
- EA = 1;
- }
- //============================
- //ADC0809 转换函数
- //============================
-
- uchar ADC0809_GET(void)
- {
- ADC_START = 0;
- ADC_OE = 0;
- ADC_START = 1;
- ADC_START = 0;
- while(ADC_EOC == 0);
- ADC_OE = 1;
- return ADC_DATA;
- }
- /********************
- **********************/
- void timer0() interrupt 1
- {
- ADC_CLK = ~ADC_CLK;
- }
- /********************************************
- void timer1() interrupt 3
- {
- TH1 = (65536 - 2000)/256;
- TL1 = (65536 - 2000)%256;
-
- if(t1_flag == 0)
- {
- lcd_wcom(0x80+0x01);lcd_wdat(ggao[seg0]); ////选通第0位
- }
- else if(t1_flag == 1)
- {
- lcd_wcom(0x80+0x02);lcd_wdat(volt_data[seg1]);
- }
- else if(t1_flag == 2)
- {
- lcd_wcom(0x80+0x03);lcd_wdat(ggao[seg2]);
- }
- else if(t1_flag == 3)
- {
- lcd_wcom(0x80+0x04);lcd_wdat(ggao[seg3]); //选通第3位数码管
- }
- t1_flag++; //自加1
- t1_flag = t1_flag%4; //让t1_flag 在0和3之间循环
- }
- *********************************************************/
- //============================
- //显示电压值,输入0~255,显示0.000~5.000
- //============================
- uint Display_volt()
- {
- uchar num,Temp;// = 0; //ADC采集到的值
- Temp= ADC0809_GET;
- num=(Temp*1.0/255*5)*100; //数据处理:输出值=输入值*5/255 参数5是基准电压5V
- volt_data[10]=num%10+48; //取处理后的数据个位,对应显示温度值的小数2位
- volt_data[9]=num/10%10+48; //取处理后的数据十位,对应显示温度值的小数1位
- volt_data[7]=num/100%10+48; //取处理后的数据百位,对应显示温度值的个位
- volt_data[6]=num/1000; //取处理后的数据千位,对应显示温度值的十位
- wsrt(0xc0,volt_data);
- return num;
- }
- /*************
- uint print_volt(uchar num)
- {
- uchar volt = 0;
- volt = num/255.0 * 5000 + 0.5; //除255.0和除255有很大区别,除255.0会自动转换为float型,小数才能保持,而volt/255=0,+0.5四舍五入。
- seg0 = volt/1000%10;
- seg1 = volt/100%10;
- seg2 = volt/10%10;
- seg3 = volt%10;
- return volt;
- }
- *****************/
- //============================
- //主函数
- //============================
- void main()
- {
- uint volt = 0; //电压值 0~5000,代表(0~5)V
- lcd_init();
- wsrt(0x80,ggao);
- lcd_wcom(0x80+0x0f);lcd_wdat(0xc3);//*"1",0*/
- lcd_wcom(0x80+0x0d);
- lcd_wdat(0xdf);//*"1",0*/
- lcd_wcom(0x80+0x0e);
- lcd_wdat(0x43);//*"1",0*/
- timer_init(); //定时器0、定时器1初始化。
- /**********************
- uchar adc_num = 0; //ADC采集到的值
- uint volt = 0;
- timer_init();
- lcd_init();
- lcd_wcom(0x38);
- lcd_wcom(0x0c);
- lcd_wcom(0x06);
- **************************/
- while(1)
- {
-
- Display_volt();
- delayms(5);
- }
- }
- //LCD程序
- /*------------------------------------*/
- #ifndef __LCD1602_H__
- #define __LCD1602_H__
- //#include"delay.h"
- #define uint unsigned int //预定义
- #define uchar unsigned char
- sbit rs=P2^5; //1602/定义数据/命令选择端
- sbit rw=P2^6; //定义读/写选择端
- sbit en=P2^7; //定义使能端
- /*P0口接1602的D0~D7*/
- //uchar h1,h2,h3,h4;//LCD显示变量
- //uchar table[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}; //要显示的内容放入数组table
- //uchar table1[43]="0123456789abcdefABCDEFGHIJKLMNOPQRSTUVWXYZ";
- //uchar table2[]={0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A};
- //uchar table3[]=".VAWa";
- //uchar table3[]="888888888888";
- //uchar code table[]="I LIKE MCU!";
- void delayZ(uint n) //延时函数
- {
- uint x,y;
- for(x=n;x>0;x--)
- for(y=110;y>0;y--);
- }
- //void tablex(uint tab1);
-
- void lcd_wcom(uchar com) //1602写命令函数
- {
- rs=0; //RS置0
- rw=0; //RW置0 RS、RW置零,指令寄存器写入
- en=1; //使能端置为高电平
- P0=com; //对液晶屏位置控制的命令
- en=0; //使能端置为低电平。使能端从高电平跳变低电平,液晶模块执行写操作
- delayZ(5); //延时一定时间
- }
- void lcd_wdat(uchar dat) //1602写数据函数
- {
- rs=1; //RS置1
- rw=0; //RW置0 RS置1,RW置零,数据寄存器写入
- en=1; //读取液晶模块信息
- P0=dat; //液晶屏显示的命令
- en=0; //使能端置为低电平。使能端从高电平跳变低电平,液晶模块执行写操作
- delayZ(5); //延时一定时间
- }
- void lcd_init() //1602初始化函数
- {
- lcd_wcom(0x38); //8位数据,双列,5*7字形
- lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁?
- lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位
- lcd_wcom(0x01); //清屏?
- }
- /************
- void tablex(uint tab1)//数据分解
- {
- uchar num;
- h1=tab1/1000;//1023//1
- h2=tab1%1000/100;//023//0
- h3=tab1%100/10;//23//2
- h4=tab1%10;//3
- }
- for(num=0;num<11;num++)
- {
- write_date(table[num]); //a//写数据write_date(0x31); write_date('1');
- delay(200);
- // write_date('B');
- }
- ****************/
- /*----------------- -------------------*/
- void wsrt(unsigned char adr,unsigned char *p) //显示位置及显示内容的函数
- {
- lcd_wcom(adr); //显示位置
- while(*p!='\0') //指针指向对象是否为字符结束符
- {
- lcd_wdat(*p); //显示指针所指向对象
- p++; //指针指向数组的下一个元素
- }
- }
- /*--------------------------------------------------------------*/
- #endif
-
复制代码
显示正常了,为什么只显示0-9呢?哪里出错了
|
|