• tyrl800
    了解作者
  • C/C++
    开发工具
  • 528KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 17
    下载次数
  • 2017-08-03 11:34
    上传日期
单片机输出PWM控制开关电源,触摸屏显示界面
开关电源.rar
  • 开关电源
  • SwitchP.hex
    6.4KB
  • SwitchP.LST
    8.2KB
  • Last Loaded 开关电源1(CPU).DBK
    185.8KB
  • SwitchP.OBJ
    13.3KB
  • 开关电源.HMI
    873.3KB
  • 开关电源1(CPU).DSN
    185.8KB
  • 60S2PWM.c
    4.7KB
  • 开关电源1(CPU).EMF
    184.1KB
  • Adtest.c
    1.3KB
  • SwitchP_Uv2.Bak
    1.9KB
  • SwitchP.M51
    15.1KB
  • Last Loaded AD测试.DBK
    182.3KB
  • Adtest.OBJ
    4.4KB
  • SwitchP.Opt
    1KB
  • SwitchP.lnp
    31B
  • SwitchP.plg
    161B
  • SwitchP_Opt.Bak
    1021B
  • AD测试.PWI
    768B
  • SwitchP.c
    4KB
  • SwitchP.Uv2
    1.9KB
  • stc12c5a60s2.h
    17.3KB
  • 开关电源1(CPU).PWI
    626B
  • Adtest.LST
    3.2KB
  • SwitchP
    13.3KB
  • AD测试.DSN
    182.3KB
内容介绍
//#include<STC12C5A60S2.h> #include<intrins.h> #include "delay.h" #include "key4.h" #define uint unsigned int #define uchar unsigned char sbit lcden=P0^5; //定义lcd使能端 sbit lcdrs=P0^7; //定义lcd数据命令选择端 sbit lcdwr=P0^6; //定义lcd读写选择端 sbit lcdrd=P0^4; //定义并串选择端 //sbit DQ=P3^3; //定义DS18B20数据线引脚端 sbit SPK=P1^0; sbit IN_OFF=P3^0; uchar high,low; //0~255 char a,d2,d1,d0,e2,e1,e0; //-128~+127 float f_temp; //-3.40E+38 ~ +3.40E+38; uint i,j,temp,temp0=200; //0~65535 uchar nu,num=128; uchar code line1[]="设置电压:"; uchar code line2[]="当前电压:";//定义无符号单字节字符型代码表,表的位置在代码段 uchar code line3[]="00.0V"; uchar code line4[]="00.0V"; //////------------lcd写指令函数------------- void wr_cmd(uchar cmd) { lcden=0; lcdrs=0; P2=cmd; delay1ms(1); lcden=1; delay1ms(1); lcden=0; } ////-----------lcd写数据函数----------- void wr_dat(uchar dat) { lcden=0; lcdrs=1; P2=dat; delay1ms(1); lcden=1; delay1ms(1); lcden=0; } ////-----------------------用户界面文字显示函数-------------------------- void face_dis() { wr_cmd(0x30); //选择功能:8位数据基本指令操作 wr_cmd(0x0c); //整体显示开,不显示光标 wr_cmd(0x01); //lcd清屏 wr_cmd(0x02); //游标归原点 wr_cmd(0x80); // 设置第二行起始位,//第一行,80H~87H,第二行 90H~97H;第三行 88H~8FH,第四行 98H~9FH; for(a=0;a<10;a++) { wr_dat(line1[a]); } wr_cmd(0x85); //设置第三行起始位 for(a=0;a<6;a++) //写入第三行数据 { wr_dat(line4[a]); } wr_cmd(0x90); for(a=0;a<10;a++) //写入第二行数据 { wr_dat(line2[a]); } wr_cmd(0x95); //设置第三行起始位 for(a=0;a<6;a++) //写入第三行数据 { wr_dat(line3[a]); } } ////------------------------用户界面数据显示函数------------------------------- void dat_dis() { wr_cmd(0x95); //显示温度 wr_dat(0x30+d2); wr_dat(0x2e); //写入“.”号 wr_dat(0x30+d1); wr_dat(0x30+d0); } void dat_num() { wr_cmd(0x85); //显示温度 wr_dat(0x30+e2); wr_dat(0x2e); //写入“.”号 wr_dat(0x30+e1); wr_dat(0x30+e0); } ////-----------------------------初始化函数------------------------------------ void init() { delay1ms(20); //等待液晶输入电源稳定 lcdrd=1; //选定lcd与单片机并行连接 lcdwr=0; //因为我们不需要从lcd模块读数据,所以可直接将此端口清零,便于之后利用矩阵键盘 face_dis(); //显示用户界面 } ////-----------------------获温部分:初始化函数-------------------- void adc_init() { P1ASF=0x01;//将P1.0作为模拟量输入 ADC_RES=0; //清理结果寄存器的值 ADC_RESL=0; //清理结果寄存器的值?? AUXR1&=~0x04; //ADRJ=0,高8位放在ADC_RES寄存器里,低两位放在ADC_RESL?? ADC_CONTR=0x80;//开启ADC电源,并设置转换周期为540个时钟周期转换yi次???????? //ADC_POWER=1;//?CHS2,1,0为0,用p1.0作为输入。SPEED1,0为0,540个时钟?? delay1ms(5);//初次打开ASC电源时要适当延时?}? } uint getADCResult() { uint d=0; ADC_CONTR=0x88;//启动adc,ADC_START=1 _nop_(); _nop_(); _nop_(); _nop_(); while(!(ADC_CONTR&0x10));//等待转换完成?? ADC_CONTR&=~0x10;//关闭adc d |=ADC_RES;//转换结果的高8位 d<<=2; d |=ADC_RESL;//将?ADC_RES和ADC_RESL组成10位的q return d; } ////----------------------温度获取函数--------------------------- void get_temp() { temp=getADCResult(); //将读取的低8位和高8位合,并 ,(dat*5.0*100)/1024 f_temp=temp*0.048828125; //温度在寄存器中为12位 分辨率位0.0625° temp=f_temp*10+0.5; //精确到十分位,四舍五入 d2=temp/100; //显示数据:十位 d1=temp%100/10; //显示数据:个位 d0=temp%10; //显示数据:十分位 } void get_num() { e2=num/100; //显示数据:十位 e1=num%100/10; //显示数据:个位 e0=num%10; //显示数据:十分位 } void SPK_31() { if(temp>num) SPK=0; else SPK=1; } void PWM_INIT(void) { nu=256-num; CCON=0; CL=230;//230 CH=0XFF; //ff CMOD=0X02; //02空闲模式下PCA计数器停止计数 SYSclk/2 CCAP0H=CCAP0L=nu; CCAPM0=0X42; //42允许下降沿触发捕捉功能 将 CEX0 设置为 PWM 输出。 CCAP1H=CCAP1L=nu;//128;//0Xf0; PCA_PWM1=0X30; //30 CCAPM1=0X42; CR=1; //允许 PCA 计数器计数 } //-----------------主函数------------------------ void main() { IN_OFF=1; //解决STC单片机下载程序重新上电问题 P1M1=0X00; //0000 0000 P1M0=0X04; //0000 0100 init(); //lcd初始化 while(1) { get_temp(); //获取温度 dat_dis(); //显示温度 key_4(); get_num(); SPK_31(); dat_num(); PWM_INIT(); if (IN_OFF==0) {IAP_CONTR=0x60;} //解决STC单片机下载程序重新上电问题 } }
评论
    相关推荐