久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
stc12c5a60s2單片機(jī)鋰電池放電裝置源碼參考(實(shí)測(cè)可用無(wú)電路圖)
[打印本頁(yè)]
作者:
小丁one
時(shí)間:
2018-7-7 22:03
標(biāo)題:
stc12c5a60s2單片機(jī)鋰電池放電裝置源碼參考(實(shí)測(cè)可用無(wú)電路圖)
如題所示,附件壓縮包有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 開始轉(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口為開漏模式,使用AD功能(0000 0101)
ADC_RES = 0; //AD數(shù)據(jù)寄存器清空
ADC_CONTR = ADC_POWER | ADC_SPEEDLL; //打開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;//開始轉(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ù)器開始計(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鍵盤掃描函數(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)//松開按鍵掃
{
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)//松開按鍵掃
{
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)//松開按鍵掃
{
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)//松開按鍵掃
{
ad1=GetADCResult(2);
key=ad1;
}
break;
}
case 5:
{
pwm+=5;
OLED_ShowNum(40,6,pwm1,16);//變量顯示
while(key<=250)//松開按鍵掃
{
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)//松開按鍵掃
{
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)//松開按鍵掃
{
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)//松開按鍵掃
{
ad1=GetADCResult(2);
key=ad1;
}
break;
}
case 5:
{
pwm-=5;
OLED_ShowNum(40,6,pwm1,16);//變量顯示
while(key<=250)//松開按鍵掃
{
ad1=GetADCResult(2);
key=ad1;
}
break;
}
}
break;
}
case 191: //返回首頁(yè)
{
t=3;
hanshutiaodong(1);
while(key>=250)//松開按鍵掃
{
key=ad1;
}
break;
}
case 192: //返回首頁(yè)
{
TR1 = 0; //關(guān)閉定時(shí)器1
ES = 0; //關(guān)閉串口中斷
t=3;
hanshutiaodong(1);
while(key<=250)//松開按鍵掃
{
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);//已打開
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)擊文件名下載附件
下載積分: 黑幣 -5
作者:
51hei團(tuán)團(tuán)
時(shí)間:
2018-7-8 00:04
這個(gè)無(wú)電路圖真的無(wú)法用,樓主能簡(jiǎn)單的介紹一下電路連接嗎?
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
精品视频一区二区三区
|
亚洲精品久久久久久首妖
|
免费观看av
|
91精品国产综合久久福利软件
|
99热国产精品
|
羞视频在线观看
|
久久久久久久一区二区三区
|
国产精品一区二区av
|
看片地址
|
国产高清免费视频
|
久久狠狠
|
黄色毛片免费视频
|
av在线天堂
|
欧美日韩一卡二卡
|
日韩精品免费一区
|
欧美视频免费
|
久久亚洲欧美日韩精品专区
|
国产高清一区
|
蜜桃传媒av
|
www312aⅴ欧美在线看
|
日韩美av
|
久久亚洲欧美日韩精品专区
|
亚洲精品乱码久久久久久按摩观
|
亚洲精品色
|
国产精品一区在线观看
|
天天草狠狠干
|
久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新
|
日韩免费av
|
欧美一区二区免费在线
|
亚洲 欧美 综合
|
99re国产精品
|
99久久久国产精品
|
在线免费小视频
|
国产精品久久久久久久久久免费
|
亚洲精品一二三
|
国产成人精品一区二区三区四区
|
国产精品视频免费观看
|
天天干天天操
|
欧美日一区二区
|
欧美日高清视频
|
久久国产精品视频
|