您好,欢迎光临本网站![请登录][注册会员]  
文件名称: STC12C5A60S2温度控制PWM脉宽
  所属分类: C/C++
  开发工具:
  文件大小: 2kb
  下载次数: 0
  上传时间: 2011-06-28
  提 供 者: zixue*****
 详细说明: #include"reg52.h" #include /********************************************************************************************* 函数名:PWM初始化函数 调 用:PWM_init(); 参 数:无 返回值:无 结 果:将PCA初始化为PWM模式,初始占空比为0 备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可 /**********************************************************************************************/ #define uchar unsigned char #define uint unsigned int typedef unsigned char BYTE; uchar flag; sbit led0=P1^0; sbit led1=P1^1; sbit led2=P1^2; sbit led3=P1^3; sbit DQ = P2^2; //数据口define interface sbit dula = P2^6; //数码管段选 sbit wela = P2^7; //数码管位选 sbit beep=P2^3; sbit hw=P3^5; uint warn_11=340; uint warn_12=290; uint temp; //温度值 variable of temperature //不带小数点 unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //带小数点 unsigned char code table1[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; /************************************** 延时X微秒(STC12C5A60S2@12M) 不同的工作环境,需要调整此函数 此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同 **************************************/ void DelayXus(BYTE n) { while (n--) { _nop_(); _nop_(); } } /************************************** 复位DS18B20,并检测设备是否存在 **************************************/ void DS18B20_Reset() { CY = 1; while (CY) { DQ = 0; //送出低电平复位信号 DelayXus(240); //延时至少480us DelayXus(240); DQ = 1; //释放数据线 DelayXus(60); //等待60us CY = DQ; //检测存在脉冲 DelayXus(240); //等待设备释放数据线 DelayXus(180); } } /************************************** 从DS18B20读1字节数据 **************************************/ BYTE DS18B20_ReadByte() { BYTE i; BYTE dat = 0; for (i=0; i<8; i++) //8位计数器 { dat >>= 1; DQ = 0; //开始时间片 DelayXus(1); //延时等待 DQ = 1; //准备接收 DelayXus(1); //接收延时 if (DQ) dat |= 0x80; //读取数据 DelayXus(60); //等待时间片结束 } return dat; } /************************************** 向DS18B20写1字节数据 **************************************/ void DS18B20_WriteByte(BYTE dat) { char i; for (i=0; i<8; i++) //8位计数器 { DQ = 0; //开始时间片 DelayXus(1); //延时等待 dat >>= 1; //送出数据 DQ = CY; DelayXus(60); //等待时间片结束 DQ = 1; //恢复数据线 DelayXus(1); //恢复延时 } } uint Get_Tmp() //获取温度get the temperature { float tt; uchar TPL,TPH; DS18B20_Reset(); //设备复位 DS18B20_WriteByte(0xCC); //跳过ROM命令 DS18B20_WriteByte(0x44); //开始转换命令 while (!DQ); //等待转换完成 DS18B20_Reset(); //设备复位 DS18B20_WriteByte(0xCC); //跳过ROM命令 DS18B20_WriteByte(0xBE); //读暂存存储器命令 TPL = DS18B20_ReadByte(); //读温度低字节 TPH = DS18B20_ReadByte(); //读温度高字节 temp =TPH; //先把高八位有效数据赋于temp temp <<= 8; //把以上8位数据从temp低八位移到高八位 temp = temp|TPL; //两字节合成一个整型变量 tt = temp*0.0625; //得到真实十进制温度值 //因为DS18B20可以精确到0.0625度 //所以读回数据的最低位代表的是0.0625度 temp = tt*10+0.5; //放大十倍 //这样做的目的将小数点后第一位也转换为可显示数字 //同时进行一个四舍五入操作。 return temp; } /****************数码码动态显示函数**************/ void Display(uint temp) //显示程序 { uchar A1,A2,A3; A1 = temp/100; //百位 A2 = temp%100/10; //十位 A3 = temp%10; //个位 dula = 0; P0 = table[A1]; //显示百位 dula = 1; //打开段选,对应74573的锁存位,高电平不锁存 dula = 0; wela = 0; P0 = 0xfe; wela = 1; //打开位选 wela = 0; DelayXus(240); dula = 0; P0 = table1[A2]; //显示十位,使用的是有小数点的数组(因为temp值扩大了10倍,虽然是十位,实际为个位) dula = 1; dula = 0; wela = 0; P0 = 0xfd; wela = 1; wela = 0; DelayXus(240); P0 = table[A3]; //显示个位 dula = 1; dula = 0; P0 = 0xfb; wela = 1; wela = 0; DelayXus(240); } void warn(uint s,uchar led) { uchar i; i=s; beep=0; flag=1; P1=~(led); DelayXus(240); beep=1; P1=0xff; i=s; DelayXus(240); } void deal(uint t) { if((t>warn_12)&&(t<=warn_11)) { warn(40,0x01); } } void PWM_init (void){ CMOD=0x02; //设置PCA定时器 CL=0x00; CH=0x00; CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010) CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同 CCAP0H=0x00; // PWM0初始时为0 //CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(使用时删除//) //CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同 //CCAP1H=0x00; // PWM1初始时为0 //CCAPM2=0x42; //PWM2设置PCA工作方式为PWM方式 //CCAP2L=0x00; //设置PWM2初始值与CCAP0H相同 //CCAP2H=0x00; // PWM2初始时为0 //CCAPM3=0x42; //PWM3设置PCA工作方式为PWM方式 //CCAP3L=0x00; //设置PWM3初始值与CCAP0H相同 //CCAP3H=0x00; // PWM3初始时为0 CR=1; //启动PCA定时器 } /**********************************************************************************************/ /********************************************************************************************* 函数名:PWM0占空比设置函数 调 用:PWM0_set(); 参 数:0x00~0xFF(亦可用0~255) 返回值:无 结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平 备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可 /**********************************************************************************************/ void PWM0_set (unsigned char a) { CCAP0L= a; //设置值直接写入CCAP0L CCAP0H= a; //设置值直接写入CCAP0H } /**********************************************************************************************/ /********************************************************************************************* 函数名:主函数 调 用:无 参 数:无 返回值:无 结 果:程序开始处,无限循环 备 注: /**********************************************************************************************/ void main (void) { while(1) { Display(Get_Tmp()); deal(temp); PWM_init(); //PWM初始化 if(flag==1) { PWM0_set(0x7f); //设置PWM占空比,总共255,除以2,转换成十六进制得7F } } } /**********************************************************************************************/ ...展开收缩
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 相关搜索: 温度控制PWM脉宽
 输入关键字,在本站1000多万海量源码库中尽情搜索: