1、STC15F204EA单片机旋转编码器版白光T12控制器代码开发固件by金向维STC15F204EA单片机旋转编码器版白光T12控制器代码(开发固件)(by金向维)Dbit huancunkaiguan=0; /用于改变设定温度后延时显示设定温度(而不是立刻显示t12温度)signed int huancun; /显示函数直接显示huancun,要显示一个数据将必须这个数据赋值给缓存(由于数 码管只有三位,为了在显示三位数同时保持四位数的精度,所以实际显示的是数 据除以10,并支持显示负数)signed int shiwen; /10倍实际室温,即实际室温乘以10(为了精确)(允许的室温范围为
2、-11度至50度)signed int t12wendu; /T12烙铁头的实际温度(非热电偶的温差)(同样为10倍温度)signed int shedingwendu; /设定温度(范围200450度)signed int wencha; /T12两个周期间的温差signed int jiareshu; /每200ms加热周期内需要加热的次数(一次等于1ms,相当于加热占空比)unsigned char zhouqijishu; /加热周期200ms计数unsigned int huancunjishu; /用于改变设定温度后延时显示设定温度(而不是立刻显示t12温度)unsigned lo
3、ng cankaodianya0, t12dianya, ntcdianya, dianyuandianya;/*1ms延时函数*/void delay_ms (unsigned int a) /24MHz时钟时的1毫秒延时函数 unsigned int b; while(a-) for(b=0;b1200;b+); /*10us延时函数*/void delay_10us (unsigned int a) /24MHz时钟时的10微秒延时函数 unsigned int b; while(a-) for(b=0;b12;b+); /*数码管延时关断函数*/void guanduan (void)
4、 /用于关断数码管的位选 delay_ms(1); /延时 bw=1; /关断百位 sw=1; /关断十位 gw=1; /关断个位/*公共函数10(显示)*/void gonggonghanshu10(unsigned char a) a7=a&0x80; /小数点 a6=a&0x40; /g a5=a&0x20; /f a4=a&0x10; /e a3=a&0x08; /d a2=a&0x04; /c a1=a&0x02; /b tihuan=a&0x01; /a/*显示函数*/void display(signed int a) /显示函数(显示实际数据除以10,支持显示负数) unsig
5、ned char baiwei, shiwei, gewei, d; /定义百位,十位,个位,每次显示帧数 signed int c; /用于处理数字a if(a0) /如果a是负数 c=-a; /取a的相反数 else /否则 c=a; /就直接取a c=c/10; baiwei=c/100; /计算百位 c=c%100; shiwei=c/10; /计算十位 c=c%10; gewei=c; /计算个位 for(d=0;d20;d+) /显示部分,每次显示20个循环(20帧) if(a0) /如果a是负数,则百位显示负号 gonggonghanshu10(duanma10); else /
6、否则直接显示百位 gonggonghanshu10(duanmabaiwei); /显示百位 bw=0; /打开百位 guanduan(); /延时关断百位 gonggonghanshu10(duanmashiwei); /显示十位 sw=0; /打开十位 guanduan(); /延时关断十位 gonggonghanshu10(duanmagewei); /显示个位 gw=0; /打开个位 guanduan(); /延时关断个位 /*ADC公共函数*/void gonggonghanshu2(void) /此函数测量单片机电源电压 ADC_CONTR=0x88; /ADC_POWER, SP
7、EED1, SPEED0, ADC_FLAG-ADC_START, CHS2, CHS1, CHS0 delay_10us(2); /延时等待转换结束 ADC_RESL=ADC_RESL&0x03; /取转换结果低八位中的低二位 cankaodianya0=(ADC_RES*4+ADC_RESL); /把结果转换成十进制数据(10位ADC,最大值1024) dianyuandianya=2549760/cankaodianya0; /计算电源电压,单位mV/*ADC测电压函数*/void adc (void) /ADC函数,用于测量和计算各种电压 signed char a; /查NTC表用
8、gonggonghanshu2(); /公共函数2(此函数功能是测量电源电压,单位mV) ADC_CONTR=0x89; /ADC控制寄存器设置,转换采用最低速度速,低速更精确(测量 t12电压务必使用最低速度AD转换,实测高速误差大) delay_10us(2); ADC_RESL=ADC_RESL&0x03; t12dianya=(ADC_RES*4+ADC_RESL); t12dianya=2490*t12dianya/cankaodianya0; /计算t12电压,单位mV ADC_CONTR=0x8a; /ADC控制寄存器设置 delay_10us(2); ADC_RESL=ADC_
9、RESL&0x03; ntcdianya=(ADC_RES*4+ADC_RESL); ntcdianya=2490*ntcdianya/cankaodianya0; /计算ntc电压,单位mV for(a=0;wendubiaoa=61) /如果超出表的范围就取允许的最高温度(50度) break; /并且退出查表 shiwen=(a-11)*10; /得出室温(实际室温乘以10) t12wendu=(t12dianya-100)*43*10/260+shiwen; /计算t12的实际温度,其中260为运放增益 if(t12wendu5000) /如果得出的温度超过500度,说明没有插入烙铁头
10、或参数 错误(因为烙铁头的温度不可能超过500度) t12wendu=5000; /显示500作为错误指示(注意显示函数显示的是1/10,所以 要显示500,需要赋值5000) if(huancunkaiguan=1) /如果缓存开关开,说明刚刚改变了设定温度 huancun=shedingwendu; /于是显示设定温度(而不是t12温度) else huancun=t12wendu; /否则直接显示t12温度/*定时器0初始化函数*/void timer0init (void) /定时器0初始化程序,24MHz频率下,每1ms中断一次 TMOD=0x00; /定时模式,16位自动重装 TH
11、0=0xf8; /计时1ms TL0=0x2f; ET0=1; /开启定时器0中断 TR0=1; /启动定时器0/*公共函数6(记录编码器状态)*/void gonggonghanshu6(void) e=encodera; /记录编码器a脚此次状态 f=encoderb; /记录编码器b脚此次状态/*编码器函数(正常加热模式调用)*/void bianmaqi(void) if(e=1&f=1&encodera=1&encoderb=0) /和前一次状态比较确定为右旋 shedingwendu=shedingwendu+100; /步进 if(shedingwendu4500) /最高允许4
12、50度 shedingwendu=4500; huancun=shedingwendu; /显示改变后的设定温度 huancunkaiguan=1; /打开缓存开关(用于延时显示设定温度1.5秒) huancunjishu=0; /重新开始缓存计数 if(e=1&f=1&encodera=0&encoderb=1) /和前一次状态比较确定为左旋 shedingwendu=shedingwendu-100; /步进 if(shedingwendu190) /最多加热190ms jiareshu=190; if(zhouqijishushedingwendu) if(t12wendu-shedin
13、gwendu=20) jiareshu=(shedingwendu-1500)/160; else jiareshu=0; if(t12wendu20) buchang+; if(buchang150) buchang=150; else buchang=0; if(shedingwendu-t12wendu=300) jiareshu=198; else if(shedingwendu-t12wendu=200) jiareshu=160; else if(shedingwendu-t12wendu=150) jiareshu=130; else if(shedingwendu-t12wen
14、du=100) jiareshu=90+wencha/2+buchang; else if(shedingwendu-t12wendu=50) jiareshu=50+buchang*2; else jiareshu=(shedingwendu-1000)/80+wencha*2/3+buchang; /*主函数*/void main (void) /主函数 P1M0=0x00; /P1除P1.0,P1.1,P1.2为输入模式外均为正常模式 P1M1=0x07; P1ASF=0x07; /设置P1相应ADC转换的I/O口为ADC输入模式 P2M0=0xff; /P2都是推挽模式 P2M1=0x00; P3M0=0xf0; /P3.4,P3.5,P3.6,P3.7为推挽模式,P3.2,P3.3为输入模式, P3M1=0x06; /其余正常模式 ADC_CONTR=0xe0; /打开ADC电源 shedingwendu=3000; /设为300度 IE=0x88; /打开定时器0中断,关闭定时器1中断 timer0init(); /初始化定时器0 while(1) display(huancun); /数码管显示数据
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2