1、STC12C5A60S2ADC查询法10位模式 1602显示STC12C5A60S2(ADC查询法 10位模式)+1602显示 通道0接单片机电源,通道1接地线。 源程序:一共3个文件: LCD1602display.h#ifndef _LCD1602DISPLAY_H_#define _LCD1602DISPLAY_H_#define uchar unsigned char#define uint unsigned int/*LCD引脚定义sbit LCM_RS=P35;sbit LCM_RW=P36;sbit LCM_E=P37;/*延时void delay();/*初始化void Ini
2、tLCM();/*读状态uchar ReadStatusLCM();/*读数据uchar ResdDataLCM();/*写指令void WriteCommandLCM(uchar WCLCM, Busy);/*写数据void WriteDataLCM(uchar WDLCM);/*显示1个字符void DisplayOneChar(uchar X,uchar Y,uchar DData);/*显示字符串void DisplayListChar(uchar X,uchar Y,uchar code *DData);#endifSTC12(ADC flag).h#ifndef _STC12_AD
3、C_FLAG_H_#define _STC12_ADC_FLAG_H_#define uchar unsigned char#define uint unsigned int#define FOSC 11059200L#define BAUD 9600/* 初始化设置 */sfr ADC_CONTR = 0xBC; /ADC 控制寄存器sfr ADC_RES = 0xBD; /ADC 转换结果寄存器sfr ADC_RESL = 0xBE; /ADC 低2位结果寄存器sfr P1ASF = 0x9D; /P1口模拟功能控制寄存器/* ADC 数据转换函数 */#define ADC_POWER
4、0x80 /ADC 电源控制位#define ADC_FLAG 0x10 /ADC 转换结束标志位#define ADC_START 0x08 /ADC 开始转换控制位#define ADC_SPEEDLL 0x00 /540 个时钟周期转换一次#define ADC_SPEEDL 0x20 /360 个时钟周期转换一次#define ADC_SPEEDH 0x40 /180 个时钟周期转换一次#define ADC_SPEEDHH 0x60 /90 个时钟周期转换一次/*延时函数void Delay1(uint n);/*ADC初始化函数void Init_ADC();/*ADC数据转换函数
5、uint Get_ADC_Result(uchar ch);/*ADC数据计算函数float Count(uchar ch);#endifLCD1602display.c#include ;#include ;#include "LCD1602display.h"/*延时void delay(uchar z)uchar i,j;for(i=z;i;0;i-) for(j=110;j;0;j-); /*LCM初始化void InitLCM()WriteCommandLCM(0x38,0); /三次显示模式设置,不检测忙信号delay(1);WriteCommandLCM(0x
6、38,0);delay(1);WriteCommandLCM(0x38,0);delay(1);WriteCommandLCM(0x38,1); /显示模式设置:16×2显示,5×7点阵,8位数据接口WriteCommandLCM(0x0c,1); /显示模式设置:显示开,无光标WriteCommandLCM(0x06,1); /显示模式设置:光标右移,字符不移WriteCommandLCM(0x01,1); /清屏幕指令,将以前的显示内容清除/*读状态uchar ReadStatusLCM()P0 = 0x80;LCM_RS = 0;LCM_RW = 1;LCM_E
7、= 1;while (P0 & 0x80); /检测忙信号return(0);/*读数据/*uchar ResdDataLCM()LCM_RS=1;LCM_RW=1;LCM_E=1; */*写指令void WriteCommandLCM(uchar WCLCM, Busy)if(Busy) ReadStatusLCM();P0=WCLCM;LCM_RS=0;LCM_RW=0;LCM_E=0;LCM_E=1;/*写数据void WriteDataLCM(uchar WDLCM)ReadStatusLCM();P0=WDLCM;LCM_RS=1;LCM_RW=0;LCM_E=0;LCM_E=1;/
8、*显示字符void DisplayOneChar(uchar X,uchar Y,uchar DData)if(Y) X|=0X40; /Y=1显示第二行,Y=0显示第一行X|=0X80;WriteCommandLCM(X,1); /X用来选择哪一位,1是用来忙检测WriteDataLCM(DData); /DData用来写数据/*显示字符串void DisplayListChar(uchar X,uchar Y,uchar code *DData)uchar ListLength;ListLength=0;while(DDataListLength!=0) if(X; #include &q
9、uot;intrins.h"#include "STC12(ADC flag).h"float temp;/*延时函数(n=1: 1T 8.65ms,12T 59.9ms)void Delay1(uint n) uint x; while (n-) x = 5000; while (x-); /*ADC初始化函数void Init_ADC() P1ASF = 0xff; /设置P1口为开漏模式,使用AD功能 ADC_RES = 0; /AD数据寄存器高8位清空 ADC_RESL= 0; /AD数据寄存器低2位清空 ADC_CONTR = ADC_POWER | A
10、DC_SPEEDLL; /打开AD电源,转换周期540 Delay1(2); /延时 /*ADC数据转换函数uint Get_ADC_Result(uchar ch) ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch ;/开始转换 _nop_(); /延时一个机器周期 _nop_(); /延时一个机器周期 _nop_(); /延时一个机器周期 _nop_(); /延时一个机器周期 while (!(ADC_CONTR & ADC_FLAG); /等待转换结束(ADC_FLAG=0时一直等待,直到变为1跳出) ADC_CONTR &= AD
11、C_FLAG; /关闭AD转换 return (ADC_RES*4+ADC_RESL); /返回数据(10位AD值,ADC_RES高8位+ADC_RESL低2位) /*ADC数据计算函数float Count(uchar ch)temp=(float)Get_ADC_Result(ch)*4.60/1024; /4.85为参考电压,1024个“门”,10位ADreturn temp;main.c/*(ma)STC12C5A60S2(ADC查询法 10位模式)+1602显示*/马熔/2012-12-17/*#include ;#include "intrins.
12、h"#include "STC12(ADC flag).h"#include "LCD1602display.h"#define uchar unsigned char#define uint unsigned intextern float temp;uchar code string1="The voltage is :"uchar ge,shifen;/*显示函数void show()DisplayListChar(0,0,string1);DisplayOneChar(1,1,(int)Count(0)+0x30);
13、 /个位DisplayOneChar(2,1,.);DisplayOneChar(3,1,(int)(Count(0)*100)%100/10+0x30); /十分位DisplayOneChar(4,1,(int)(Count(0)*100)%100%10+0x30); /百分位DisplayOneChar(5,1,V);DisplayOneChar(8,1,(int)Count(1)+0x30); /个位DisplayOneChar(9,1,.);DisplayOneChar(10,1,(int)(Count(1)*100)%100/10+0x30); /十分位DisplayOneChar(11,1,(int)(Count(1)*100)%100%10+0x30); /百分位DisplayOneChar(12,1,V);/*主函数void main()InitLCM(); /液晶初始化 Init_ADC(); /AD转换初始化 while (1) show();
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2