单片机电压检测程序不正常运行,我用单片机是STC125A60S2,原理图如下:
采集电压,转float- void abc_inti(){
- ADC_CONTR=0x80; //ADC配置
- P1ASF=0xff; //P1全部开模拟功能
- ADC_RES =0;
- ADC_RESL =0;
- Delay1ms();
- }
-
- float getabc(u8 chanel){//选择哪个IO口,转变float
- ADC_CONTR =0x88|chanel;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //延时4个时钟周期左右
- while(!ADC_CONTR&0x10);//等待
- ADC_CONTR &=~0X10;//
- return (ADC_RES*4+ADC_RESL)*1024/5*3;
- }
复制代码 用sprint转字符串,显示字符串:
- sprintf(str,"%1.4f",getabc(0));//浮点数转字符串
- while(1)
- {
- Display16x16(1,1,zhon);//测试液晶
- Displaystring8x6(4,1,str);//第四页第1行显示
- }
- }
复制代码 main.c
- #include "common.h"
- void abc_inti(){
- ADC_CONTR=0x80; //ADC配置
- P1ASF=0xff; //P1全部开模拟功能
- ADC_RES =0;
- ADC_RESL =0;
- Delay1ms();
- }
-
- float getabc(u8 chanel){//选择哪个IO口,转变float
- ADC_CONTR =0x88|chanel;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //延时4个时钟周期左右
- while(!ADC_CONTR&0x10);//等待
- ADC_CONTR &=~0X10;//
- return (ADC_RES*4+ADC_RESL)*1024/5*3;
- }
-
- void main(){
- //u8 str[5]="abcde";//测试自己写的函数Displaystring8x6
- init();
- DelayMs(100);//延时100ms等待稳定运行
-
- InitLCD();//LCD初始化
- ClearScreen();//调用全屏清屏
- abc_inti();//ADC初始化
- //
- sprintf(str,"%1.4f",getabc(0));//浮点数转字符串
- while(1)
- {
- //Display16x16(1,1,zhon);//测试液晶
- Displaystring8x6(4,1,str);//第四页第1行显示
- }
- }
-
-
-
-
复制代码
lcd.c
- #include "common.h"
- #include "font.h"
- /*****************液晶屏函数**********************/
- /*写指令到 LCD 模块*/
- void Command(u8 Data)
- {
- u8 i;
- CS=0;//片选=0
- RS=0;//低L 0命令 H 1 数据
- for(i=0;i<8;i++)
- {
- SCK=0;//首先拉低然后传一位数据
- if(Data&0x80)//用传过来的数据Data和0x80进行&与运算
- //0x80转为2进制1000 0000
- // 1与0=0
- // 1与1=1
- {SDA=1;}//判断输入的数据是否是1
- else {SDA=0;}//Data&0x80=0,否则SDA为0
- SCK=1; //传送结束后拉高锁存一位数据
- Data=Data<<=1;//然后data的第7位左移
- }
- }
- /*写数据到 LCD 模块*/
- void SendData(u8 Data)
- {
- u8 i;
- CS=0;//片选=0
- RS=1;//低L 0命令 H 1 数据
- for(i=0;i<8;i++)
- {
- SCK=0;//首先拉低然后传一位数据
- if(Data&0x80){//用传过来的数据Data和0x80进行&与运算
- SDA=1;}//判断输入的数据是否是1
- else {SDA=0;}//Data&0x80=0,否则SDA为0
- SCK=1;//传送结束后拉高锁存一位数据
- Data=Data<<=1;//然后data的第7位左移
- }
- }
- /*LCD 模块初始化*/
- void InitLCD()
- {
- CS=0; //片选 低电平有效
- RST=0; /*低电平复位*/
- DelayMs(2);
- RST=1; /*复位完毕*/
- DelayMs(10);
- Command(0xE2); /*软复位*/
- DelayMs(1);
- Command(0x2C); /*升压步聚 1*/
- Command(0x2E); /*升压步聚 2*/
- Command(0x2F); /*升压步聚 3*/
- DelayMs(1);
- Command(0x23); /*粗调对比度,可设置范围 0x20~0x27*/
- Command(0x81); /*微调对比度*/
- Command(0x28); /*0x1a,微调对比度的值,可设置范围 0x00~0x3f*/
- Command(0xA2); /*1/9 偏压比(bias)*/
- Command(0xC8); /*行扫描顺序:从上到下*/
- Command(0xA0); /*列扫描顺序:从左到右*/
- Command(0x40); /*起始行:第一行开始*/
- Command(0xAF); /*开显示*/
- CS=1;
- //开背光
- LEDA =1;
- }
- /*设置液晶屏的显示地址*/
- void Address(u8 Page,u8 Column)
- {
- CS=0;
- Column=Column-1;//我们平常所说的第 1 列,
- //在 LCD 驱动 IC 里是第 0 列。所以在这里减去 1.
- Page=Page-1;
- Command(0xB0+Page); //设置页地址。每页是 8 行。
- Command(((Column>>4)&0x0F)+0x10); //设置列地址的高 4 位
- Command(Column&0x0F); //设置列地址的低 4 位
- }
- /*全屏清屏*/
- void ClearScreen()
- {
- u8 i,j;
- CS=0;
- for(i=0;i<9;i++)
- {
- Address(1+i,1);
- for(j=0;j<132;j++)
- {
- SendData(0x00); /*写数据到 LCD,
- //每写完一个 8 位的数据后列地址自动加 1*/
- }
- }
- CS=1;
- }
- //显示 12864 点阵图像
- /*
- void Display128x64(u8 *dp)
- {
- u8 i,j;
- CS=0;
-
- for(j=0;j<8;j++)
- {
- Address(j+1,1);
- for (i=0;i<128;i++)
- {
- SendData(*dp); //写数据到 LCD,
- //每写完一个 8 位的数据
- //后列地址自动加 1
- dp++;
- }
- }
- CS=1;
- } */
- //显示 16x16 点阵图像、汉字、生僻字或 16x16 点阵的其他图标
- void Display16x16(u8 Page,u8 Column,u8 *dp)
- {
- u8 i,j;
- CS=0;
- for(j=0;j<2;j++)
- {
- Address(Page+j,Column);
- for (i=0;i<16;i++)
- {
- SendData(*dp); //写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1
- dp++;
- }
- }
- CS=1;
- }
- void Displaystring8x6(u8 Page,u8 Column,u8 *p){
- u8 i,j,z;
- CS =0;
- while(p[i] >0){//p[i]最后一个元素为0
- j =p[i]-32; //j:为font[]数组第几行
- Address(Page,Column);//在page页Column行
- for(z =0;z <6;z++){//font[]第j行,第z个元素开始,z初值为0
- SendData(font[j][z]);
- }
- Column+=6;
- i++;
-
- }
- CS=1;
- }
- /***********************液晶屏函数结束****************/
- /***液晶屏字库大家可以自由添加自己的字库******/
- /***液晶屏字库取模软件zimo221.exe百度大把******/
- /***还有详细的使用教程******/
- /***取出的字模贴到大括号{}里就OK******/
- void init() //硬件初始化
- {
- ADC_CONTR=0x80; //ADC配置
- P1ASF=0xff; //开模拟功能
-
- LEDA=0;
- P4SW=0x70; //允许P4 IO
- P2M0=0x20; //推挽点亮背光
-
- Delay1ms();
- }
复制代码
完整工程在附件里。烧写程序后,什么都没显示,我想了几天,都没找到原因,麻烦大神解答.
电压测量.rar
(67.78 KB, 下载次数: 8)
|