STC15F204EA单片机旋转编码器版白光T12控制器代码(开发固件)(by金向维)

上传人:卷*** 文档编号:122003572 上传时间:2022-07-19 格式:DOCX 页数:12 大小:51.78KB
返回 下载 相关 举报
STC15F204EA单片机旋转编码器版白光T12控制器代码(开发固件)(by金向维)_第1页
第1页 / 共12页
STC15F204EA单片机旋转编码器版白光T12控制器代码(开发固件)(by金向维)_第2页
第2页 / 共12页
STC15F204EA单片机旋转编码器版白光T12控制器代码(开发固件)(by金向维)_第3页
第3页 / 共12页
点击查看更多>>
资源描述
/*STC15F204EA单片机旋转编码器版白光T12控制器代码(开发固件)(by金向维)*/#include /单片机头文献,24MHz时钟频率#include INTRINS.h/头文献unsigned char code duanma12=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x73;/共阴数码管段码数据(0,1,2,3,4,5,6,7,8,9),倒 数第二个是显示负号-的数据,倒数第一种是显示字母P的数据unsigned int code wendubiao62=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,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电阻随温度变化进而引起电压变化得出的数据,用来查表计算室温(进而对热电偶冷端补偿)sbit t12=P20;/T12通过P2.0控制sbit bw=P34;/数码管百位位选为P3.4sbit sw=P35;/数码管十位位选为P3.5sbit gw=P36;/数码管个位位选为P3.6sbit tihuan=P37;/数码管的a段本应当用P1.0控制,由于P1.0被用来控制T12,因此要用P3.7替代P1.0sbit encoderb=P14;/编码器的b脚接P1.4sbit encodera=P32;/编码器的a脚接P3.2sbit zhendongkaiguan=P01;/震动开关接P0.1sbit bianmaanniu=P33;/编码器的按键接P3.3sbit a7=P27;/数码管小数点sbit a6=P26;/数码管g段sbit a5=P25;/数码管f段sbit a4=P24;/数码管e段sbit a3=P23;/数码管d段sbit a2=P22;/数码管c段sbit a1=P21;/数码管d段bit e=1, f=1;/e f 用来保存编码器上一次的状态bit huancunkaiguan=0;/用于变化设定温度后延时显示设定温度(而不是立即显示t12温度)signed int huancun;/显示函数直接显示huancun,要显示一种数据将必须这个数据赋值给缓存(由于数码管只有三位,为了在显示三位数同步保持四位数的精度,因此实际显示的是数据除以10,并支持显示负数)signed int shiwen;/10倍实际室温,即实际室温乘以10(为了精确)(容许的室温范畴为-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 long 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)/用于关断数码管的位选 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,支持显示负数) unsigned 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/否则直接显示百位 gonggonghanshu10(duanmabaiwei);/显示百位 bw=0;/打开百位 guanduan();/延时关断百位 gonggonghanshu10(duanmashiwei);/显示十位 sw=0;/打开十位 guanduan();/延时关断十位 gonggonghanshu10(duanmagewei);/显示个位 gw=0;/打开个位 guanduan();/延时关断个位 /*ADC公共函数*/void gonggonghanshu2(void)/此函数测量单片机电源电压 ADC_CONTR=0x88;/ADC_POWER, SPEED1, 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表用 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_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度,阐明没有插入烙铁头或参数错误(由于烙铁头的温度不也许超过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位自动重装 TH0=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)/最高容许450度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-shedingwendu=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-t12wendu=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@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!