您好,欢迎访问三七文档
1/*************STC15F204EA单片机旋转编码器版白光T12控制器代码(开发固件)(by金向维)*******************/#includeSTC15F104E.H//单片机头文件,24MHz时钟频率#includeINTRINS.h//头文件unsignedcharcodeduanma[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x73};//共阴数码管段码数据(0,1,2,3,4,5,6,7,8,9),倒数第二个是显示负号-的数据,倒数第一个是显示字母P的数据unsignedintcodewendubiao[62]={924,959,996,1033,1071,1110,1150,1190,1232,1273,1315,1358,1401,1443,1487,1501,1574,1619,1663,1706,1751,1756,1776,1810,1853,1903,1958,2017,2078,2141,2204,2266,2327,2387,2444,2500,2554,2607,2657,2706,2738,2800,2844,2889,2931,2974,3016,3056,3098,3139,3179,3218,3257,3296,3333,3372,3408,3446,3484,3519,3554,3590};//根据NTC电阻随温度变化进而引起电压变化得出的数据,用来查表计算室温(进而对热电偶冷端补偿)sbitt12=P2^0;//T12通过P2.0控制sbitbw=P3^4;//数码管百位位选为P3.4sbitsw=P3^5;//数码管十位位选为P3.5sbitgw=P3^6;//数码管个位位选为P3.6sbittihuan=P3^7;//数码管的a段本应该用P1.0控制,由于P1.0被用来控制T12,所以要用P3.7替代P1.0sbitencoderb=P1^4;//编码器的b脚接P1.4sbitencodera=P3^2;//编码器的a脚接P3.2sbitzhendongkaiguan=P0^1;//震动开关接P0.1sbitbianmaanniu=P3^3;//编码器的按键接P3.3sbita7=P2^7;//数码管小数点sbita6=P2^6;//数码管g段sbita5=P2^5;//数码管f段sbita4=P2^4;//数码管e段sbita3=P2^3;//数码管d段sbita2=P2^2;//数码管c段sbita1=P2^1;//数码管d段bite=1,f=1;//ef用来保存编码器上一次的状态bithuancunkaiguan=0;//用于改变设定温度后延时显示设定温度(而不是立刻显示t12温度)signedinthuancun;//显示函数直接显示huancun,要显示一个数据将必须这个数据赋值给缓存(由于数码管只有三位,为了在显示三位数同时保持四位数的精度,所以实际显示的是数据除以10,并支持显示负数)signedintshiwen;//10倍实际室温,即实际室温乘以10(为了精确)(允许的室温范围为-11度至50度)signedintt12wendu;//T12烙铁头的实际温度(非热电偶的温差)(同样为10倍温度)signedintshedingwendu;//设定温度(范围200~450度)signedintwencha;//T12两个周期间的温差signedintjiareshu;//每200ms加热周期内需要加热的次数(一次等于1ms,相当于加热占空比)unsignedcharzhouqijishu;//加热周期200ms计数unsignedinthuancunjishu;//用于改变设定温度后延时显示设定温度(而不是立刻显示t12温度)unsignedlongcankaodianya0,t12dianya,ntcdianya,dianyuandianya;/********************************1ms延时函数*************************************************/voiddelay_ms(unsignedinta)//24MHz时钟时的1毫秒延时函数{unsignedintb;while(a--){for(b=0;b1200;b++);}}2/********************************10us延时函数************************************************/voiddelay_10us(unsignedinta)//24MHz时钟时的10微秒延时函数{unsignedintb;while(a--){for(b=0;b12;b++);}}/********************************数码管延时关断函数******************************************/voidguanduan(void)//用于关断数码管的位选{delay_ms(1);//延时bw=1;//关断百位sw=1;//关断十位gw=1;//关断个位}/********************************公共函数10(显示)********************************************/voidgonggonghanshu10(unsignedchara){a7=a&0x80;//小数点a6=a&0x40;//ga5=a&0x20;//fa4=a&0x10;//ea3=a&0x08;//da2=a&0x04;//ca1=a&0x02;//btihuan=a&0x01;//a}/********************************显示函数****************************************************/voiddisplay(signedinta)//显示函数(显示实际数据除以10,支持显示负数){unsignedcharbaiwei,shiwei,gewei,d;//定义百位,十位,个位,每次显示帧数signedintc;//用于处理数字aif(a0)//如果a是负数c=-a;//取a的相反数else//否则c=a;//就直接取ac=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(duanma[10]);else//否则直接显示百位gonggonghanshu10(duanma[baiwei]);//显示百位3bw=0;//打开百位guanduan();//延时关断百位gonggonghanshu10(duanma[shiwei]);//显示十位sw=0;//打开十位guanduan();//延时关断十位gonggonghanshu10(duanma[gewei]);//显示个位gw=0;//打开个位guanduan();//延时关断个位}}/********************************ADC公共函数**************************************************/voidgonggonghanshu2(void)//此函数测量单片机电源电压{ADC_CONTR=0x88;//ADC_POWER,SPEED1,SPEED0,ADC_FLAG---ADC_START,CHS2,CHS1,CHS0delay_10us(2);//延时等待转换结束ADC_RESL=ADC_RESL&0x03;//取转换结果低八位中的低二位cankaodianya0=(ADC_RES*4+ADC_RESL);//把结果转换成十进制数据(10位ADC,最大值1024)dianyuandianya=2549760/cankaodianya0;//计算电源电压,单位mV}/********************************ADC测电压函数************************************************/voidadc(void)//ADC函数,用于测量和计算各种电压{signedchara;//查NTC表用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电压,单位mVADC_CONTR=0x8a;//ADC控制寄存器设置delay_10us(2);ADC_RESL=ADC_RESL&0x03;ntcdianya=(ADC_RES*4+ADC_RESL);ntcdianya=2490*ntcdianya/cankaodianya0;//计算ntc电压,单位mVfor(a=0;wendubiao[a]ntcdianya;a++)//查表计算室温{if(a=61)//如果超出表的范围就取允许的最高温度(50度)break;//并且退出查表}shiwen=(a-11)*10;//得出室温(实际室温乘以10)t12wendu=(t12dianya-100)*43*10/260+shiwen;//计算t12的实际温度,其中260为运放增益if(t12wendushiwen)//如果t12温度小于室温t12wendu=shiwen;//就取室温if(t12wendu5000)//如果得出的温度超过500度,说明没有插入烙铁头或参数错误(因为烙铁头的温度不可能超过500度)t12wendu=5000;//显示500作为错误指示(注意显示函数显示的是1/10,所以4要显示500,需要赋值5000)if(huancunkaiguan==1)//如果缓存开关开,说明刚刚改变了设定温度huancun=shedingwendu;//于是显示设定温度(而不是t12温度)elsehuancun=t12wendu;//否则直接显示t12温度}/********************************定时器0初始化函数*******************************************/voidtimer0init(void)//定时器0初始化程序,24MHz频率下,每1ms中断一次{TMOD=0x00;//定时模式,16位自动重装TH0=0xf8;//计时1msTL0=0x2f;ET0=1;//开启定时器0中断TR0=1;//启动定时器0}/********************************公共函数6(记录编码器状态)**********************************/voidgonggonghanshu6(void){e=encodera;//记录编码器a脚此次状态f=encoderb;//记录编码器b脚此次状态}/********************************编码器函数(正常加热模式调用)********************************/voidbianmaqi(void){if(e==1&&f==1&&encodera==1
本文标题:STC15F204EA单片机旋转编码器版白光T12控制器代码(开发固件)(by金向维)
链接地址:https://www.777doc.com/doc-4634311 .html