STC15系列电压测试+LCD12864显示
2020-01-29 来源:51hei
最近使用15做电压测试,顺便使用下12864显示,程序如下:
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
#define FOSC 11059200L //系统频率
sbit CS=P0^4; //片选信号 4RS(CS)H/L并行的指令/数据选择信号;串行的片选信号
sbit SID=P0^3; //数据信号 5R/W(SID)H/L并行的读写选择信号;串行的数据口
sbit SCLK=P0^2; //时钟信号 6E(CLK)H/L并行的使能信号;串行的同步时钟
// sbit RST=P0^1; //复位信号 17/RETH/L复位低电平有效 //**可以直接接到VCC,模块自带上电复位电路
sbit CH_PSB = P0^0; //并行、串行选择信号 15PSBH/L并/串行接口选择:H-并行;L-串行
//L:串行数据选择,H-并行速度快占用I/O多,因为需要8位数据连接;L-串行接线较少,但是速度要慢
sbit stop = P3^2;
//宏定义ADC的操作命令
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
//宏定义ADC参考电压mV
#define VCC_V 5010
////定义变量
ulint ADC_RESH; //ADC变量
uint count; //中间变量
float Vin;
uchar dis_buf[5];
//delayms_1ms
void delayms(uint time)
{
uint x,y;
for(x=0; x for(y=0; y<112; y++);
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0x01; //设置P1.0口为AD口
ADC_RES = 0; //清除结果寄存器
ADC_RESL = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
delayms(2); //ADC上电并延时
}
/*----------------------------
读取ADC结果
----------------------------*/
uint GetADCResult(uchar ch)
{
uint ADC_H,ADC_L,ADCReuslt;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
ADC_CONTR &= ~ADC_FLAG; //清除完成标志
ADC_H = ADC_RES; //取出高8位
ADC_L = ADC_RESL; //取出低8位
ADC_L = ADC_L & 0x03; //清除无用位,获取低两位
ADC_H = ADC_H<<2; // 高位左移两位
ADCReuslt = ADC_H | ADC_L; // 高低字节拼接成一个10位数。
return ADCReuslt; //返回10位ADC结果
}
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。
* 输入 : t
* 输出 : 无
***********************************************************************/
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0; i
}
/********************************************************************
* 名称 : sendbyte()
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : zdata
* 输出 : 无
***********************************************************************/
void sendbyte(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{
SID = 1;
}
else
{
SID = 0;
}
SCLK = 0;
SCLK = 1;
}
}
/********************************************************************
* 名称 : write_com()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_com(unsigned char cmdcode)
{
CS = 1;
sendbyte(0xf8);
sendbyte(cmdcode & 0xf0);
sendbyte((cmdcode << 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名称 : write_data()
* 功能 : 写串口数据
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_data(unsigned char Dispdata)
{
CS = 1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名称 : lcdinit()
* 功能 : 初始化函数
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void lcdinit()
{
// RST = 0;
delay(100);
// RST = 1;
delay(20000);
write_com(0x30); //开显示,光标设置,8位数据
delay(50);
write_com(0x0c); //显示开,无游标,不反白0c
delay(50);
}
/********************************************************************
* 名称 : hzkdis()
* 功能 : 显示字符串
* 输入 : *s
* 输出 : 无
***********************************************************************/
void hzkdis(unsigned char code *s)
{
while(*s > 0)
{
write_data(*s);
s++;
delay(50);
}
}
/********************************************************************
* 名称 : Test()
* 功能 : 显示子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Test()
{
delayms(1000);
P1M0 = 0x00; //P1.0高阻
P1M1 = 0x01; //P1.0高阻 0000 0001
P_SW1= 0x40; //P3.6/P3.7串口1 RXD/TXD //初始化串口
InitADC();
write_com(0x03);
delay(50);
write_com(0x80);
hzkdis('团战可以输---');
write_com(0x90);
hzkdis('提莫必须死---');
write_com(0x88);
hzkdis('Voltage Display');
write_com(0x98);
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
CH_PSB = 0; //L:串行数据选择,H-并行速度快占用I/O多,因为需要8位数据连接;L-串行接线较少,但是速度要慢
delay(1);
lcdinit();
delay(10);
while(1)
{
while (1)
{
Test();
ADC_RESH=GetADCResult(0);
count=(VCC_V*ADC_RESH/1024+5);///10; //四舍五入+5,1023/1024
dis_buf[0] = count/1000%10+'0'; //+30
dis_buf[1] = 0x2e; //.
dis_buf[2] = count/100%10+'0';
dis_buf[3] = count/10%10+'0';
dis_buf[4] = count%10+'0';
dis_buf[5] = 0x56; //V
write_data(dis_buf[0]);
write_data(dis_buf[1]);
write_data(dis_buf[2]);
write_data(dis_buf[3]);
write_data(dis_buf[4]);
write_data(dis_buf[5]);
delayms(500);
}
}
}
//复位
void int0() interrupt 0
{
if(stop==0)
{
delayms(20);
if(stop==0)
{
while(!stop);
IAP_CONTR = 0x20;//软件复位
}
}
}