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

/*************STC15F204EA单片机旋转编码器版白光T12控制器代码(开发固件)(by金向维)*******************/
#include <STC15F104E.H>                //单片机头文件,24MHz时钟频率
#include "INTRINS.h"                    //头文件
unsigned char code duanma[12]={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 wendubiao[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电阻随温度变化进而引起电压变化                                        得出的数据,用来查表计算室温(进而对热                                        电偶冷端补偿)
sbit t12=P2^0;                //T12通过P2.0控制
sbit bw=P3^4;                //数码管百位位选为P3.4
sbit sw=P3^5;                    //数码管十位位选为P3.5
sbit gw=P3^6;                    //数码管个位位选为P3.6
sbit tihuan=P3^7;                //数码管的a段本应该用P1.0控制,由于P1.0被用来控制T12,所以要用P3.7替代P1.0
sbit encoderb=P1^4;            //编码器的b脚接P1.4
sbit encodera=P3^2;            //编码器的a脚接P3.2
sbit zhendongkaiguan=P0^1;        //震动开关接P0.1
sbit bianmaanniu=P3^3;        //编码器的按键接P3.3
sbit a7=P2^7;                //数码管小数点
sbit a6=P2^6;                //数码管g段
sbit a5=P2^5;                //数码管f段
sbit a4=P2^4;                //数码管e段角先生
sbit a3=P2^3;                //数码管d段
sbit a2=P2^2;                //数码管c段
sbit a1=P2^1;                //数码管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;        //设定温度(范围200~450度)
signed int wencha;            //T12两个周期间的温差
signed int jiareshu;            //每200ms加热周期内需要加热的次数(一次等于1ms,相当于加热占空比)
unsigned char zhouqijishu;        //加热周期200ms计数
unsigned int huancunjishu;        //用于改变设定温度后延时显示设定温度(而不是立刻显示t
12温度)
unsigned long cankaodianya0, t12dianya, ntcdianya, dianyuandianya;
/********************************1ms延时函数*************************************************/
void delay_ms (unsigned int a)    //24MHz时钟时的1毫秒延时函数
{
粘性阻尼系数    unsigned int b;
张云逸    while(a--)
    {
          for(b=0;b<1200;b++);
    }
}
/********************************10us延时函数************************************************/
void delay_10us (unsigned int a)            //24MHz时钟时的10微秒延时函数
{
    unsigned int b;
    while(a--)
    {
          for(b=0;b<12;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(a<0)                                    //如果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;d<20;d++)                            //显示部分,每次显示20个循环(20帧)
      {
          if(a<0)                                //如果a是负数,则百位显示负号
            gonggonghanshu10(duanma[10]);
          else                                    //否则直接显示百位
            gonggonghanshu10(duanma[baiwei]);    //显示百位
          bw=0;                                //打开百位
          guanduan();                            //延时关断百位
          gonggonghanshu10(duanma[shiwei]);        //显示十位
          sw=0;                                //打开十位
          guanduan();                            //延时关断十位
          gonggonghanshu10(duanma[gewei]);        //显示个位
          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

本文发布于:2024-09-22 01:00:52,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/63464.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:显示   数据   温度   函数
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议