|
如題所示,附件壓縮包有oled屏幕程序以及菜單的例程
單片機(jī)源程序如下:
- //////////////////////////////////////////////////////////////////////////////////
- // @文 件 名 : main.c
- // @版 本 號(hào) : v1.0
- // @功能描述 : 放電器主函數(shù)
- // @author :Mr.Z
- // @QQ :
- // @說(shuō)明 :
- // ----------------------------------------------------------------
- // GND 電源地
- // VCC 接5V或3.3v電源
- // D0 P3^5(SCL)
- // D1 P3^7(SDA)
- // RES 接P12
- // DC 接P13
- // CS 接P14
- // ----------------------------------------------------------------
- // @注意 :版權(quán)所有,如用作任何商業(yè)用途,須和本人聯(lián)系
- //******************************************************************************/
- #include "REG51.h"
- #include "oled.h"
- //#include "bmp.h"
- #include <intrins.h>
- #include "51_UART_RECEIVE.h"
- //#include <math.h>
- #define Dot_Size 2 // ??????
- //#define uint unsigned int
- //#define uchar unsigned char
- #define U8 unsigned char
- #define U16 unsigned int
- #define uchar unsigned char
- #define uint unsigned int
-
- float Voltage1=4.2;
- float Voltage2;
- float ad0,ad1;
- char String[5];
- int time,key;
- char temp,menu,t,sbuf0;
- char pwm=0x40;
- char pwm1;
- extern char uart_receive_number;
- //sbit ad1=P1^0;
- //sbit ad2=P1^1; //
- sbit int1=P1^2;
- sbit int2=P1^3;
- sbit int3=P1^4;
- sbit int4=P1^5;
- sbit LF=P3^4;
- sbit L1=P3^2;
- sbit F1=P0^5;
- sbit F2=P0^7;
- void hanshutiaodong(menu);
- void keyscan();
- /********************************************************************
- 初始化設(shè)置
- *********************************************************************/
- sfr ADC_CONTR = 0xBC; //ADC 控制寄存器
- sfr ADC_RES = 0xBD; //ADC 轉(zhuǎn)換結(jié)果寄存器
- sfr ADC_LOW2 = 0xBE; //ADC 低2位結(jié)果寄存器
- sfr P1ASF = 0x9D; //Pl口模擬功能控制寄存器
- /********************************************************************
- /********************************************************************
- 延時(shí)函數(shù)
- *********************************************************************/
- void Delay(U16 n)
- {
- U16 x;
- while (n--)
- {
- x = 5000;
- while (x--);
- }
- }
- void delay(void)
- {
- unsigned char i,j;
- for(i = 0; i < 255; i++)
- {
- for(j = 0; j < 200; j++);
- }
- }
- void delaykey(uchar z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void delaydianya(uchar zzz)
- {
- uchar xxx,yyy;
- for(xxx=zzz;xxx>0;xxx--)
- for(yyy=110;yyy>0;yyy--)
- keyscan();
- }
- /********************************************************************
- ADC 數(shù)據(jù)轉(zhuǎn)換函數(shù)
- *********************************************************************/
- #define ADC_POWER 0x80 //ADC 電源控制位
- #define ADC_FLAG 0x10 //ADC 轉(zhuǎn)換結(jié)束標(biāo)志位
- #define ADC_START 0x08 //ADC 開(kāi)始轉(zhuǎn)換控制位
- #define ADC_SPEEDLL 0x00 //420 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
- #define ADC_SPEEDL 0x20 //280 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
- #define ADC_SPEEDH 0x40 //140 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
- #define ADC_SPEEDHH 0x60 //70 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
-
- /********************************************************************
- ADC 初始化
- *********************************************************************/
- void InitADC()
- {
- P1ASF = 0x05; //設(shè)置P1口為開(kāi)漏模式,使用AD功能(0000 0101)
- ADC_RES = 0; //AD數(shù)據(jù)寄存器清空
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL; //打開(kāi)AD電源,轉(zhuǎn)換周期420
- Delay(2); //延時(shí)
- }
- /*********************************************************************
- 中斷初始化
- **********************************************************************/
- void initzhongduan()
- {
- time=0;
- temp=0xfe;
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- /********************************************************************
- ADC 數(shù)據(jù)轉(zhuǎn)換函數(shù)
- *********************************************************************/
- U8 GetADCResult(U8 ch)
- {
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;//開(kāi)始轉(zhuǎn)換
- _nop_(); //延時(shí)一個(gè)機(jī)器周期
- _nop_(); //延時(shí)一個(gè)機(jī)器周期
- _nop_(); //延時(shí)一個(gè)機(jī)器周期
- _nop_(); //延時(shí)一個(gè)機(jī)器周期
- while (!(ADC_CONTR & ADC_FLAG));//等待轉(zhuǎn)換結(jié)束
- ADC_CONTR &= ~ADC_FLAG; //關(guān)閉AD轉(zhuǎn)換
- return ADC_RES; //返回?cái)?shù)據(jù)
- }
-
-
- /********************************************************************
- 初始化定義函數(shù)
- *********************************************************************/
- sfr CCON = 0xD8; //PCA控制寄存器
- sfr CMOD = 0xD9; //PCA模式寄存器
- sfr CCAPM0 = 0xDA; //PCA模塊0模式寄存器 //模塊0對(duì)應(yīng)P1.3/CEX0/PCA0/PWM0(STC12C5A60S2系列)
- sfr CCAPM1 = 0xDB; //PCA模塊1模式寄存器 //模塊1對(duì)應(yīng)P1.4/CEX1/PCA1/PWM1(STC12C5A60S2系列)
- sfr CL = 0xE9; //PCA 定時(shí)寄存器 低位
- sfr CH = 0xF9; //PCA 定時(shí)寄存器 高位
- sfr CCAP0L = 0xEA; //PCA模塊0的 捕獲寄存器 低位
- sfr CCAP0H = 0xFA; //PCA模塊0的 捕獲寄存器 高位
- sfr CCAP1L = 0xEB; //PCA模塊1的 捕獲寄存器 低位
- sfr CCAP1H = 0xFB; //PCA模塊1的 捕獲寄存器 高位
- sfr PCA_PWM0 = 0xF2; //PCA PWM 模式輔助寄存器0
- sfr PCA_PWM1 = 0xF3; //PCA PWM 模式輔助寄存器1
- sbit CF = 0xDF; //PCA計(jì)數(shù)溢出標(biāo)志位
- sbit CR = 0xDE; //PCA計(jì)數(shù)器 運(yùn)行控制位
- sbit CCF1 = 0xD9; //PCA模塊1中斷標(biāo)志
- sbit CCF0 = 0xD8; //PCA模塊0中斷標(biāo)志
- //* CCAPOH = CCAPOL = 0XC0; //模塊0輸出 占空因數(shù)為25%
- //* CCAPOH = CCAPOL = 0X80; //模塊0輸出 占空因數(shù)為50%
- //* CCAPOH = CCAPOL = 0X40; //模塊0輸出 占空因數(shù)為75%
- /********************************************************************
- PWN時(shí)鐘函數(shù)
- *********************************************************************/
- void PWM_clock(U8 clock)
- {
- CMOD |= (clock<<1);
- CL = 0x00; //定時(shí)寄存器低位
- CH = 0x00; //定時(shí)寄存器高位
- }
- /********************************************************************
- PWM輸出函數(shù)函數(shù)
- *********************************************************************/
- void PWM_start(a)
- {
- /********************設(shè)置PWM信號(hào)輸出值*******************************/
- //n=m=0x40;
- //CCAPM0 = 0X42;
- a=0x00;
- CCAPM1 =a;
- //CCAP0H = CCAP0L = 0X40; //模塊0輸出 占空因數(shù)為75%
- CCAP1H = CCAP1L = 0X40; //模塊1輸出 占空因數(shù)為75%
- CR=1; //PCA計(jì)數(shù)器開(kāi)始計(jì)數(shù)
- }
- /********************************************************************
- 定時(shí)器函數(shù)
- *********************************************************************/
- void PCA_Intrrpt(void) interrupt 7
- {
- if(CCF0) CCF0=0;
- if(CCF1) CCF1=0; //軟件清零
- if(CF) CF=0; //軟件清零
- }
- void yichu()
- {
- TMOD|=0x02; /* timer 0 mode 2: 8-Bit reload */
- TH0=0xff;
- TR0=1;
- PWM_clock(2); // PCA/PWM時(shí)鐘源為 定時(shí)器0的溢出
- }
- void PWM(U8 m,U8 n)
- {
- CCAP0L =m;
- CCAP0H =m;
- CCAP1L = n;
- CCAP1H = n;
-
- }
- /*------------------*浮點(diǎn)型轉(zhuǎn)字符串*------------------*/
- char Float_To_String(float Float_Num)
- // Dot_Size??????????
- // ???????
- {
- //char String[5];
- char Num_Length=0;
- int Temp_i=0;
- char *Point_p=String; //????????
- char *Point_s=String;
- char Negative_Flag=0;
- long Predot_Num;
- long Afterdot_Num;
- float Afterdot_Float;
-
- if(Float_Num<0)
- {
- Negative_Flag=1;
- Float_Num=0-Float_Num;
- }
-
- Predot_Num=(long)Float_Num; //????????????
- Afterdot_Float=Float_Num-Predot_Num; //???????????
- for(Temp_i=Dot_Size;Temp_i>0;Temp_i--)
- {
- Afterdot_Float=Afterdot_Float*10;
- }
- Afterdot_Num=(long)Afterdot_Float;
-
- Temp_i=Dot_Size;
-
- while(Afterdot_Num>0|Temp_i>0)
- {
- Temp_i--;
- String[Num_Length++]=Afterdot_Num%10+'0';
- Afterdot_Num=Afterdot_Num/10;
- }
- String[Num_Length++]='.';
-
- if(Predot_Num==0) //???????0???
- String[Num_Length++]='0';
-
- while(Predot_Num>0)
- {
- String[Num_Length++]=Predot_Num%10+'0';
- Predot_Num=Predot_Num/10;
- }
-
- if(Negative_Flag==1)
- String[Num_Length++]='-';
- String[Num_Length]='\0'; //?????????
-
- Point_p=String+Num_Length-1; //?P?????????????
-
- for(;Point_p-Point_s>0;Point_p--,Point_s++) //???????????
- {
- *Point_s^=*Point_p;
- *Point_p^=*Point_s;
- *Point_s^=*Point_p;
- }
-
- return(String);
- }
- /*********************************************************
- AD鍵盤(pán)掃描函數(shù)
- *********************************************************/
- void keyscan()
- {
-
- ad1=GetADCResult(2);
- key=ad1;
- if(key<250)
- {
- delaykey(5);
- key=ad1;
- if(key<=250)
- {
- switch(key)
- {
- case 0: //確認(rèn)鍵
- {
- switch(menu) //不同的頁(yè)數(shù),菜單不同的作用選擇
- {
- case 1://第一頁(yè)
- {
- switch(t)
- {
- case 3:
- {
- hanshutiaodong(3);
- break;
- }
- case 6:
- {
- hanshutiaodong(4);
- break;
- }
- }
- }
- case 2://第二頁(yè)
- {
- switch(t)
- {
- case 3:
- {
- hanshutiaodong(5);
- break;
- }
- }
- break;
- }
- case 3://第三頁(yè)
- {
- break;
- }
- case 4://第四頁(yè)
- {
-
- break;
- }
- }
- while(key<=250)//松開(kāi)按鍵掃
- {
- ad1=GetADCResult(2);
- key=ad1;
- }
- break;
- }
-
- case 127: //加↑
- {
- switch(menu)
- {
- case 1:
- {
- OLED_ShowString(6,t," ",16);
- t+=3;
- menu=(t+3)/6;
- if(t>=7)
- {
- hanshutiaodong(menu);
- t=t%6;
- }
- OLED_ShowString(6,t,"&",16);
- while(key<=250)//松開(kāi)按鍵掃
- {
- ad1=GetADCResult(2);
- key=ad1;
- }
- break;
- }
- case 2:
- {
- OLED_ShowString(6,t," ",16);
- if(t>=7)
- {
- t=0;
- }
- t+=3;
- if(t>=6)
- {
- t=6;
- }
- OLED_ShowString(6,t,"&",16);
- while(key<=250)//松開(kāi)按鍵掃
- {
- ad1=GetADCResult(2);
- key=ad1;
- }
- break;
- }
- case 4: //電壓設(shè)定的加減值
- {
- Voltage1+=0.05;
- Float_To_String(Voltage1); //電壓的設(shè)定值
- OLED_ShowString(80,3,String,16);
- while(key<=250)//松開(kāi)按鍵掃
- {
- ad1=GetADCResult(2);
- key=ad1;
- }
- break;
- }
- case 5:
- {
- pwm+=5;
- OLED_ShowNum(40,6,pwm1,16);//變量顯示
- while(key<=250)//松開(kāi)按鍵掃
- {
- ad1=GetADCResult(2);
- key=ad1;
- }
- break;
- }
- case 6:
- {
- break;
- }
- case 7:
- {
- break;
- }
- }
- break;
- }
-
- case 170: //減↓
- {
- switch(menu)
- {
- case 1:
- {
- OLED_ShowString(6,t," ",16);
- t-=3;
- if(t<=3)
- {
- t=3;
- }
- OLED_ShowString(6,t,"&",16);
- while(key<=250)//松開(kāi)按鍵掃
- {
- ad1=GetADCResult(2);
- key=ad1;
- }
- break;
- }
- case 2:
- {
- OLED_ShowString(6,t," ",16);
- t-=3;
- if(t<3)
- {
- t=6;
- menu=1;
- hanshutiaodong(menu);
- }
- OLED_ShowString(6,t,"&",16);
- while(key<=250)//松開(kāi)按鍵掃
- {
- ad1=GetADCResult(2);
- key=ad1;
- }
- break;
- }
- case 4: //電壓設(shè)定的加減值
- {
- Voltage1-=0.05;
- Float_To_String(Voltage1); //電壓的設(shè)定值
- OLED_ShowString(80,3,String,16);
- while(key<=250)//松開(kāi)按鍵掃
- {
- ad1=GetADCResult(2);
- key=ad1;
- }
- break;
- }
- case 5:
- {
- pwm-=5;
- OLED_ShowNum(40,6,pwm1,16);//變量顯示
- while(key<=250)//松開(kāi)按鍵掃
- {
- ad1=GetADCResult(2);
- key=ad1;
- }
- break;
- }
- }
- break;
- }
-
-
- case 191: //返回首頁(yè)
- {
-
- t=3;
- hanshutiaodong(1);
- while(key>=250)//松開(kāi)按鍵掃
- {
- key=ad1;
- }
- break;
- }
- case 192: //返回首頁(yè)
- {
- TR1 = 0; //關(guān)閉定時(shí)器1
- ES = 0; //關(guān)閉串口中斷
- t=3;
- hanshutiaodong(1);
- while(key<=250)//松開(kāi)按鍵掃
- {
- ad1=GetADCResult(2);
- key=ad1;
- }
- break;
- }
- }
- }
- }
-
- }
- /**************************************************************************
- OLED函數(shù)
- ***************************************************************************/
- void oled(void)
- {
- menu=0;
- OLED_Init(); //初始化OLED
- OLED_Clear();
- OLED_ShowCHinese(0,0,0);//
- OLED_ShowCHinese(18,0,1);//
- OLED_ShowCHinese(36,0,2);//
- OLED_ShowCHinese(54,0,3);//
- OLED_ShowCHinese(72,0,4);//
- OLED_ShowCHinese(91,0,5);//科
- OLED_ShowCHinese(108,0,6);//技
- OLED_ShowString(6,3,"Ver3.0 XD-One",16);
- OLED_ShowString(6,6,"TRRANS FORCE",16);
- delay_ms(1000);
- }
-
- int oledxuanxiang1(void)
- {
- menu=1;
- OLED_Init(); //初始化OLED
- OLED_Clear();
- OLED_ShowCHinese(6,0,13);//模式選擇
- OLED_ShowCHinese(38,0,14);//
- OLED_ShowCHinese(70,0,11);//
- OLED_ShowCHinese(102,0,12);//
- OLED_ShowString(6,t,"&",16);
-
- OLED_ShowCHinese(26,3,15);//藍(lán)牙模式
- OLED_ShowCHinese(44,3,16);//
- OLED_ShowCHinese(62,3,13);//
- OLED_ShowCHinese(80,3,14);//
-
- OLED_ShowCHinese(26,6,17);//放電模式
- OLED_ShowCHinese(44,6,18);//
- OLED_ShowCHinese(62,6,13);//
- OLED_ShowCHinese(80,6,14);//
- while(1)
- {
- keyscan();
- }
- }
-
- void oledxuanxiang2(void)
- {
- menu=2;
- OLED_Init(); //初始化OLED
- OLED_Clear();
- OLED_ShowCHinese(6,0,13);//模式選擇
- OLED_ShowCHinese(38,0,14);//
- OLED_ShowCHinese(70,0,11);//
- OLED_ShowCHinese(102,0,12);//
- OLED_ShowString(6,3,"&",16);
-
- OLED_ShowString(26,3,"PWM",16);
- OLED_ShowCHinese(56,3,13);//模
- OLED_ShowCHinese(80,3,14);//式
-
- OLED_ShowCHinese(26,6,39);//數(shù)字時(shí)鐘
- OLED_ShowCHinese(44,6,40);//
- OLED_ShowCHinese(62,6,41);//
- OLED_ShowCHinese(80,6,42);//
- }
-
- void oled_lanya(void)
- {
- menu=3;
- OLED_Init(); //初始化OLED
- OLED_Clear();
- OLED_ShowCHinese(6,0,15);//藍(lán)牙模式
- OLED_ShowCHinese(38,0,16);//
- OLED_ShowCHinese(70,0,13);//
- OLED_ShowCHinese(102,0,14);//
-
- OLED_ShowCHinese(45,3,15);//藍(lán)牙
- OLED_ShowCHinese(65,3,16);//
- OLED_ShowCHinese(28,6,24);//未連接
- OLED_ShowCHinese(53,6,22);//
- OLED_ShowCHinese(78,6,23);//
- while(1)
- {
- keyscan();
- receive();
- if(uart_receive_number)
- {
- //OLED_ShowNum(20,3,sbuf0,16);//變量顯示
- switch(sbuf0)
- {
- case 1:
- {
- L1=0;
- OLED_ShowCHinese(45,3,46);//照明
- OLED_ShowCHinese(65,3,47);//
- OLED_ShowCHinese(28,6,21);//已打開(kāi)
- OLED_ShowCHinese(53,6,50);//
- OLED_ShowCHinese(78,6,43);//
- break;
- }
- case 2:
- {
- L1=1;
- OLED_ShowCHinese(45,3,46);//照明
- OLED_ShowCHinese(65,3,47);//
- OLED_ShowCHinese(28,6,21);//已關(guān)閉
- OLED_ShowCHinese(53,6,44);//
- OLED_ShowCHinese(78,6,50);//
- break;
- }
- /*case 3:
- {
- OLED_Clear();
- OLED_ShowCHinese(6,0,15);//藍(lán)牙模式
- OLED_ShowCHinese(38,0,16);//
- OLED_ShowCHinese(70,0,13);//
- OLED_ShowCHinese(102,0,14);//
-
- OLED_ShowCHinese(45,3,15);//藍(lán)牙
- OLED_ShowCHinese(65,3,16);//
- OLED_ShowCHinese(28,6,21);//已連接
- OLED_ShowCHinese(53,6,22);//
- OLED_ShowCHinese(78,6,23);//
- L1=0;
- L2=0;
- break;
- }*/
- }
- //delaydianya(200);
- }
- }
- }
-
-
- int oled_fangdian(void)
- {
- menu=4;
- OLED_Init(); //初始化OLED
- OLED_Clear();
- OLED_ShowCHinese(6,0,17);//放電模式
- OLED_ShowCHinese(38,0,18);//
- OLED_ShowCHinese(70,0,13);//
- OLED_ShowCHinese(102,0,14);//
-
- OLED_ShowCHinese(0,3,37);//設(shè)定電壓
- OLED_ShowCHinese(18,3,38);//
- OLED_ShowCHinese(36,3,18);//
- OLED_ShowCHinese(54,3,36);//
- OLED_ShowString(72,3,":",16);
- OLED_ShowString(115,3,"V",16);
- Float_To_String(Voltage1); //電壓的設(shè)定值
- OLED_ShowString(80,3,String,16);
-
- OLED_ShowCHinese(0,6,34);//實(shí)際電壓
- OLED_ShowCHinese(18,6,35);//
- OLED_ShowCHinese(36,6,18);//
- OLED_ShowCHinese(54,6,36);//
- OLED_ShowString(72,6,":",16);
- OLED_ShowString(115,6,"V",16);
- while(1)
- {
- ad0=GetADCResult(0); //ad采集
- Voltage2=ad0*2/256*5;
- Float_To_String(Voltage2); //浮點(diǎn)型轉(zhuǎn)字符型
- OLED_ShowString(80,6,String,16);//字符型變量顯示
- //keyscan();
- if(Voltage2>=Voltage1)
- {
- LF=0;
- delaydianya(500);
- }
- else
- {
- LF=1;
- delaydianya(500);
- }
- delaydianya(50);
- }
-
- }
-
- void oled_PWM(void)
- {
- pwm1=pwm/256*100;
- menu=5;
- OLED_Init(); //初始化OLED
- OLED_Clear();
- OLED_ShowString(26,0,"PWM",16);
- OLED_ShowCHinese(56,0,15);//模
- OLED_ShowCHinese(80,0,16);//式
-
- OLED_ShowCHinese(26,3,28);//占空比: %
- OLED_ShowCHinese(44,3,29);//
- OLED_ShowCHinese(62,3,30);//
- OLED_ShowString(100,3,"%",16);
- while(1)
- {
- keyscan();
- }
-
-
- }
-
- void oled_shizhong(void)
- {
- menu=6;
- OLED_Init(); //初始化OLED
- OLED_Clear();
- OLED_ShowCHinese(6,0,15);//模式選擇
- OLED_ShowCHinese(38,0,16);
- OLED_ShowCHinese(70,0,13);
- OLED_ShowCHinese(102,0,14);
-
- OLED_ShowString(26,3,"PWM",16);
- OLED_ShowCHinese(56,3,15);//模
- OLED_ShowCHinese(80,3,16);//式
-
- OLED_ShowCHinese(26,6,41);//放電模式
- OLED_ShowCHinese(44,6,42);
- OLED_ShowCHinese(62,6,43);
- OLED_ShowCHinese(80,6,44);
-
- }
-
-
-
-
- void hanshutiaodong(menu)
- {
- switch(menu)
- {
- case 0:
- oled();
- break;
- case 1:
- oledxuanxiang1();
- break;
- case 2:
- oledxuanxiang2();
- break;
- case 3:
- oled_lanya();
- break;
- case 4:
- oled_fangdian();
- break;
- case 5:
- oled_PWM();
- break;
- case 6:
- oled_shizhong();
- break;
- case 7:
- break;
- case 8:
- break;
- case 9:
- break;
- case 10:
- break;
- }
-
-
-
-
-
- }
-
- /********************************************************************
- 主函數(shù)
- *********************************************************************/
- void main()
- {
- L1=0;
- LF=0;
- InitADC();
- t=3;
- oled();
- oledxuanxiang1();
- //oledxuanxiang2();
- //oled_lanya();
- //oled_fangdian();
- //PWM_start();
- }
復(fù)制代碼
所有資料51hei提供下載:
放電.zip
(180.13 KB, 下載次數(shù): 16)
2018-7-7 22:03 上傳
點(diǎn)擊文件名下載附件
|
|