單片機電壓檢測程序不正常運行,我用單片機是STC125A60S2,原理圖如下:
diance.jpg (305.57 KB, 下載次數(shù): 73)
下載附件
2020-4-24 09:49 上傳
采集電壓,轉(zhuǎn)float- void abc_inti(){
- ADC_CONTR=0x80; //ADC配置
- P1ASF=0xff; //P1全部開模擬功能
- ADC_RES =0;
- ADC_RESL =0;
- Delay1ms();
- }
-
- float getabc(u8 chanel){//選擇哪個IO口,轉(zhuǎn)變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轉(zhuǎn)字符串,顯示字符串:
- sprintf(str,"%1.4f",getabc(0));//浮點數(shù)轉(zhuǎn)字符串
- 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口,轉(zhuǎn)變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";//測試自己寫的函數(shù)Displaystring8x6
- init();
- DelayMs(100);//延時100ms等待穩(wěn)定運行
-
- InitLCD();//LCD初始化
- ClearScreen();//調(diào)用全屏清屏
- abc_inti();//ADC初始化
- //
- sprintf(str,"%1.4f",getabc(0));//浮點數(shù)轉(zhuǎn)字符串
- while(1)
- {
- //Display16x16(1,1,zhon);//測試液晶
- Displaystring8x6(4,1,str);//第四頁第1行顯示
- }
- }
-
-
-
-
復制代碼
lcd.c
- #include "common.h"
- #include "font.h"
- /*****************液晶屏函數(shù)**********************/
- /*寫指令到 LCD 模塊*/
- void Command(u8 Data)
- {
- u8 i;
- CS=0;//片選=0
- RS=0;//低L 0命令 H 1 數(shù)據(jù)
- for(i=0;i<8;i++)
- {
- SCK=0;//首先拉低然后傳一位數(shù)據(jù)
- if(Data&0x80)//用傳過來的數(shù)據(jù)Data和0x80進行&與運算
- //0x80轉(zhuǎn)為2進制1000 0000
- // 1與0=0
- // 1與1=1
- {SDA=1;}//判斷輸入的數(shù)據(jù)是否是1
- else {SDA=0;}//Data&0x80=0,否則SDA為0
- SCK=1; //傳送結(jié)束后拉高鎖存一位數(shù)據(jù)
- Data=Data<<=1;//然后data的第7位左移
- }
- }
- /*寫數(shù)據(jù)到 LCD 模塊*/
- void SendData(u8 Data)
- {
- u8 i;
- CS=0;//片選=0
- RS=1;//低L 0命令 H 1 數(shù)據(jù)
- for(i=0;i<8;i++)
- {
- SCK=0;//首先拉低然后傳一位數(shù)據(jù)
- if(Data&0x80){//用傳過來的數(shù)據(jù)Data和0x80進行&與運算
- SDA=1;}//判斷輸入的數(shù)據(jù)是否是1
- else {SDA=0;}//Data&0x80=0,否則SDA為0
- SCK=1;//傳送結(jié)束后拉高鎖存一位數(shù)據(jù)
- 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); /*粗調(diào)對比度,可設(shè)置范圍 0x20~0x27*/
- Command(0x81); /*微調(diào)對比度*/
- Command(0x28); /*0x1a,微調(diào)對比度的值,可設(shè)置范圍 0x00~0x3f*/
- Command(0xA2); /*1/9 偏壓比(bias)*/
- Command(0xC8); /*行掃描順序:從上到下*/
- Command(0xA0); /*列掃描順序:從左到右*/
- Command(0x40); /*起始行:第一行開始*/
- Command(0xAF); /*開顯示*/
- CS=1;
- //開背光
- LEDA =1;
- }
- /*設(shè)置液晶屏的顯示地址*/
- void Address(u8 Page,u8 Column)
- {
- CS=0;
- Column=Column-1;//我們平常所說的第 1 列,
- //在 LCD 驅(qū)動 IC 里是第 0 列。所以在這里減去 1.
- Page=Page-1;
- Command(0xB0+Page); //設(shè)置頁地址。每頁是 8 行。
- Command(((Column>>4)&0x0F)+0x10); //設(shè)置列地址的高 4 位
- Command(Column&0x0F); //設(shè)置列地址的低 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); /*寫數(shù)據(jù)到 LCD,
- //每寫完一個 8 位的數(shù)據(jù)后列地址自動加 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); //寫數(shù)據(jù)到 LCD,
- //每寫完一個 8 位的數(shù)據(jù)
- //后列地址自動加 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); //寫數(shù)據(jù)到 LCD,每寫完一個 8 位的數(shù)據(jù)后列地址自動加 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[]數(shù)組第幾行
- 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;
- }
- /***********************液晶屏函數(shù)結(jié)束****************/
- /***液晶屏字庫大家可以自由添加自己的字庫******/
- /***液晶屏字庫取模軟件zimo221.exe百度大把******/
- /***還有詳細的使用教程******/
- /***取出的字模貼到大括號{}里就OK******/
- void init() //硬件初始化
- {
- ADC_CONTR=0x80; //ADC配置
- P1ASF=0xff; //開模擬功能
-
- LEDA=0;
- P4SW=0x70; //允許P4 IO
- P2M0=0x20; //推挽點亮背光
-
- Delay1ms();
- }
復制代碼
完整工程在附件里。燒寫程序后,什么都沒顯示,我想了幾天,都沒找到原因,麻煩大神解答.
電壓測量.rar
(67.78 KB, 下載次數(shù): 8)
2020-4-24 10:34 上傳
點擊文件名下載附件
|