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

合集下载

基于STC15F200单片机的控温式手枪自给电烙铁

基于STC15F200单片机的控温式手枪自给电烙铁

摘要:基于stc15f200单片机的控温式手枪自给电烙铁与传统的电烙铁在结构上进行了极大的改进,其采用了手枪式的结构,便于操作;自动进给焊丝的功能避免的操作的不当;基于单片机的控温系统保证了焊接的质量。

关键词:电烙铁;手枪式;控温;单片机0 引言众所周知,电烙铁在电子、金属焊接、机械制造等各行业中得到十分广泛的应用。

据了解,普通电烙铁在实际使用过程中存在以下不足:(1)普通电烙铁操作难度系数高,新手难于掌握。

电烙铁在进行焊接操作时需要操作者双手配合工作,但焊接时双手由于长期处于紧张状态而易疲劳,从而造成注意力不能集中。

同时由于左右手配合需要一定的熟练程度,在操作时其焊接的质量和精度很难保证。

(2)普通电烙铁的温度不能准确控制。

在使用过程中当焊接比较大的区域或者焊接比较大的连接件时就需要比较高的焊接温度,若温度低则无法进行焊接;但是当焊接集成电路的引脚时就需要比较低的温度,若温度太高则极易烧毁集成电路或电子元件。

(3)普通电烙铁采用的是直线型,未能结合人机工程的特点。

现有的普通电烙铁,外观轮廓一般是直线型的,没有过多考虑人手的生理结构和操作的手势,在焊接操作时加剧了受到疲劳感,不便使用。

基于上述原因和实践中的经验,现设计了一种新型的单片机控温的手枪式进给电烙铁。

1 手枪式电烙铁机械结构的初步改进本电烙铁的设计主要由烙铁部分、夹持部分和自动进给三部分组成,如图一所示。

烙铁部分由焊枪架体(18)、加热部分(2)、压线板(17)、十字槽盘头螺钉(10)组成,其构成同普通电烙铁;夹持部分由前置卡紧弹簧(4)、前置卡紧滑块(5)、后置卡紧弹簧固定塞(6)、后置卡紧弹簧(7)、反向进给滑块(8)、后置卡紧滑块(9)组成;自动进给部分由焊丝盘安装座(11)、复位弹簧(12)、焊丝盘(13)、封闭板(14)、扳机(15)、换向齿轮(16)组成。

其中,扳机安装在焊枪架体内部,换向齿轮与扳机相连,复位弹簧一端固定在焊枪架体内部,另一端与扳机相连,压线板安装在焊枪架体上,封闭板安装在扳机的上部,封闭板的右侧安装有反向进给滑块,反向进给滑块的内部安装有后置卡紧弹簧,后置卡紧弹簧左端与后置卡紧弹簧固定塞相连,右端与后置卡紧滑块相连,封闭板左侧安装有前置卡紧滑块,前置卡紧弹簧一端与前置卡紧滑块相连,另一端与前置卡紧弹簧固定塞相连,导向管安装在焊枪架体上,导向管的上端安装有加热部分,焊丝盘上加工有焊丝盘安装座,焊丝盘安装座通过十字槽盘头螺钉固定在焊枪架体上。

白光t12 原理图

白光t12 原理图

12345678ABCD87654321DC B ATitle NumberRevisionSize A2Date:5-May-2012 Sheet of File:D:\电路开发\工程\T12控制器\New_Pcb\T12控制器.ddbDrawn By:P2.61P2.72ADC0/P1.03ADC1/P1.14ADC2/P1.25ADC3/P1.36ADC4/P1.47ADC5/P1.58ADC6/P1.69ADC7/P1.710IRC_CLKO/RST/P0.011Vcc 12P0.113Gnd 14P3.0/LOW INT415P3.116P3.2/INT017P3.3/INT118P3.4/T0/CLKOUT119P3.5/T1/CLKOUT020P3.6/LOW INT221P3.7/LOW INT322P2.0/RSTOUT_LOW 23P2.124P2.225P2.326P2.427P2.528STC15F200U1STC15F200-28PIN_A+5C2100nf+C110uf上电后输出低电平,在复位期间也是输出低电平.T12_CTRL 123J1UART更新与调试TTL 串口RxD TxDRxDTxD T12_ADC 618D1TL431R191KTL431_ADCTL431 2.49V 基准+5TL431_ADC NTC_ADC DPY_BDPY_A DPY_C DPY_D DPY_E DPY_F DPY_G DPY_DP DPY_DIG3DPY_DIG2DPY_DIG1ENCODER_A ENCODER_D ENCODER_BQ2s8050R244.7kR234.7kQ1MOSFET P 9435+24T12_CTRL12J4T12_OUTD2LED RedR264.7k 加热状态指示T12_AMPR201kT12驱动48231U2ALM358R410kR211k R274.7kC3100nf56748U2BLM358VCC_OPT12_AMPR2820kR221kR3010kT12_ADCD45.1V对于936 建议预留焊0805焊盘 断开后转接936热电偶12J2936_SWITCH_A 1322_AMP12J3936_SWITCH_BR2920kR254.7k拆自3R33模块, 5.2V 左右输入端对地, 输出电压实测39mv 国产LM358D31N4148T12热电偶信号放大 936部分暂时忽略T12 0-500 0.000-16.748mv℃单片机ADC 参考电压等于VCC 约5v代码中按照放大器269倍增益计算既在500度时4505.212mv 只要放大器满足此条件可以用别的也可以改变电路A 1C 2B 3D 4E5Encoderencoder1ROTARYENCODERR110k R210k +5C410nfC510nfR310kENCODER_AENCODER_B ENCODER_D 软件消抖,可以不使用.旋转编码开关控制a b f c g d e DIG1a b c d e f g abc d e fgdpdpdp a b f c g d e DIG2dp a bf cg d e DIG3dp D I G 1D I G 1D I G 2D I G 2D I G 3D I G 3DS1DPY_7-SEG_DP_3I/O 口直接驱动LED 数码管R6470R7470R8470R9470R10470R11470R12470R13470R14470R15470R164703位共阴数码管驱动DPY_A DPY_B DPY_CDPY_DDPY_EDPY_F DPY_G DPY_DPDPY_DIG1DPY_DIG2DPY_DIG3R18NTC-MF52AT 10K 5% B 3950 %1R1710k %1C610nf基于NTC 热敏电阻 NTC-MF52AT 10K 5% B 3950 %1+5NTC_ADC滤波可省略冷端参考ON/OFF 1VIN 2GND3GND4VOUT 5ADJ 6KIS-3R33S U3KIS-3R33SD51N4004+C733uf 30V+24DC 19.5-24V需要拆除稳压二极管R510k可选? 没示波器看不到纹波情况+C833uf-100uf 25vC90.1-10uf+55V 输出修改输出电压为5V VCC_OP给LM358供电DC-DC 转换STC15F204EA 白光T12控制器 V 1.00 By GOODCODE。

单片机程序编码器

单片机程序编码器
{
if(B_in) value++;
else value--; //value为编码器的值
P3IF=P3IF|0x04; //改上升沿触发
}
}
/************************************************************************/
* MCU: AT89S52 晶振:11.0592MHz *
* *
* 版本:V1.1 (2009/04/29) *
* *
* 3位数码管显示 *
* *
扫描编码器子函数
在编码器引脚A为低电平期间:
编码器引脚B从0到1为正转,编码器引脚B从1到0为反转。
**********************************************************/
void scan_encoder(void)
{
static bit Curr_encoder_b; //定义一个变量来储存当前B信号
对于方波信号,A,B两相相差90度相(1/4T),这样,在0度相位角,90度,180度,270度相位角,这四个位置有上升沿和下降沿,这样,实际上在1/4T方波周期就可以有角度变化的判断,这样1/4的T周期就是最小测量步距,通过电路对于这些上升沿与下降沿的判断,可以4倍于PPR读取角度的变化,这就是方波的四倍频。这种判断,也可以用逻辑来做,0代表低,1代表高,A/B两相在一个周期内变化是0 0,0 1,1 1,1 0 。这种判断不仅可以4倍频,还可以判断旋转方向。
}
if(updata)
{
updata = 0 ;

单片机编码器编程实例 -回复

单片机编码器编程实例 -回复

单片机编码器编程实例-回复“单片机编码器编程实例”编码器是一种常用的输入设备,广泛应用于各种电子设备中。

在单片机编程中,编码器常被用于控制和监测电机运动、旋转角度的测量以及用户界面交互等方面。

本文将以编码器编程为主题,一步一步介绍如何在单片机中实现编码器的功能。

第一步:了解编码器的基本原理和工作方式编码器是一种将旋转运动转化为电信号的设备。

常见的编码器有旋转编码器和线性编码器两种。

旋转编码器通常由一对光电传感器和一个带有刻度盘的旋转轴组成。

当旋转轴旋转时,光电传感器会感知到刻度盘的变化,并将其转化为电信号输出。

线性编码器则是通过传感器感知物体的移动,并将其转化为电信号输出。

第二步:了解编码器的输出类型和工作原理编码器的输出类型有两种,一种是增量式编码器,另一种是绝对式编码器。

增量式编码器通常输出两路信号,一路表示方向(A相信号),另一路表示旋转角度(B相信号)。

绝对式编码器则输出更多的信号,可以精确表示旋转位置或线性位移。

第三步:选择合适的编码器类型和接口在单片机编程中,通常会选择增量式编码器,因为其相对简单且较为常用。

选择适合的编码器接口是编程前必须考虑的因素之一。

常见的编码器接口有两种:脉冲计数接口和磁编码接口。

对于脉冲计数接口,编码器输出的脉冲信号通过单片机的IO口进行读取;对于磁编码接口,编码器输出的信号可以通过SPI、I2C等通信协议进行读取。

第四步:编写初始化函数在进行编码器编程之前,首先需要编写初始化函数,对编码器进行初始化设置。

初始化函数主要包括设置IO口的输入输出方向、使能编码器等操作。

第五步:编写中断服务函数编码器的工作是通过中断来实现的。

当编码器发生旋转或位移时,会产生相应的中断信号,通过中断服务函数来处理这些信号。

中断服务函数主要包括读取编码器的脉冲信号、计算旋转角度或位移,以及对应的控制逻辑。

第六步:编写主程序逻辑在编写主程序逻辑时,可以根据需要选择编码器的工作模式和功能。

利用STC15F104W单片机开发的夜航灯的控制器的源代码

利用STC15F104W单片机开发的夜航灯的控制器的源代码
if(key==0)
{ a2_key=0; //开始记录高电平的标志的初始化
flag2_key=0; //识别高低电平的标志
if(over2_key==1)//如果高电平结束
c2_key=b2_key; //把高电平持续的时间保存下来
b2_key=0; //初始化b1的值,b1是负责计算高电平持续的时间的
}
}
void main()
{
TMOD=0x11; //定时器0和定时器1开启
ET0=1;
TR0=1;//开定时器0中断
TH0=(65536-20)/256;
TL0=(65536-20)%256;
EA=1; //开总中断
while(1)
{ get_data();//数据的获取
#include<reg52.h>//沿用51的头文件了,不涉及特殊的寄存器,都可以的
#define uint unsigned int
#define uchar unsigned char
sbit key=P3^4;
sbit led=P3^3;
sbit all_led=P3^2;
uint count=0,count1=0,count2=0;
{
all_led=1;//led灯亮
}
if( c2_key<61)
{
all_led=0; //led灯灭
}
if(c2_key>59&&c2_key<75)
{
count++;
if(count==50)
over2_key=0;//高电平计算结束的标志

STC15F204EA单片机旋转编码器版白光T12控制器代码

STC15F204EA单片机旋转编码器版白光T12控制器代码

/*************STC15F204EA单片机旋转编码器版白光T12控制器代码(开发固件)(by金向维)******************* /#include <> //单片机头文件,24MHz时钟频率#include "" //头文件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,2 141,2204,2266,2327,2387,2444,2500,2554,2607,2657,2706,2738,2800,2844,2889,2 931,2974,3016,3056,3098,3139,3179,3218,3257,3296,3333,3372,3408,3446,3484,3 519, 3554,3590}; //根据NTC电阻随温度变化进而引起电压变化得出的数据,用来查表计算室温(进而对热电偶冷端补偿)sbit t12=P2^0; //T12通过控制sbit bw=P3^4; //数码管百位位选为sbit sw=P3^5; //数码管十位位选为sbit gw=P3^6; //数码管个位位选为sbit tihuan=P3^7; //数码管的a段本应该用控制,由于被用来控制T12,所以要用替代sbit encoderb=P1^4; //编码器的b脚接sbit encodera=P3^2; //编码器的a脚接sbit zhendongkaiguan=P0^1; //震动开关接sbit bianmaanniu=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; //用于改变设定温度后延时显示设定温度(而不是立刻显示t12温度)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; //ga5=a&0x20; //fa4=a&0x10; //ea3=a&0x08; //da2=a&0x04; //ca1=a&0x02; //btihuan=a&0x01; //a}/********************************显示函数****************************************************/ void display(signed int a) //显示函数(显示实际数据除以10,支持显示负数){unsigned char baiwei, shiwei, gewei, d; //定义百位,十位,个位,每次显示帧数signed int c; //用于处理数字aif(a<0) //如果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;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电压,单位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(t12wendu<shiwen) //如果t12温度小于室温t12wendu=shiwen; //就取室温if(t12wendu>5000) //如果得出的温度超过500度,说明没有插入烙铁头或参数错误(因为烙铁头的温度不可能超过500度)t12wendu=5000; //显示500作为错误指示(注意显示函数显示的是1/10,所以要显示500,需要赋值5000)if(huancunkaiguan==1) //如果缓存开关开,说明刚刚改变了设定温度huancun=shedingwendu; //于是显示设定温度(而不是t12温度) elsehuancun=t12wendu; //否则直接显示t12温度}/********************************定时器0初始化函数*******************************************/ void timer0init (void) //定时器0初始化程序,24MHz频率下,每1ms中断一次{TMOD=0x00; //定时模式,16位自动重装TH0=0xf8; //计时1msTL0=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(shedingwendu>4500) //最高允许450度shedingwendu=4500;huancun=shedingwendu; //显示改变后的设定温度huancunkaiguan=1; //打开缓存开关(用于延时显示设定温度秒)huancunjishu=0; //重新开始缓存计数}if(e==1&&f==1&&encodera==0&&encoderb==1) //和前一次状态比较确定为左旋{shedingwendu=shedingwendu-100; //步进if(shedingwendu<2000) //最低允许200度shedingwendu=2000;huancun=shedingwendu; //显示改变后的设定温度huancunkaiguan=1; //打开缓存开关(用于延时显示设定温度秒)huancunjishu=0; //重新开始缓存计数}gonggonghanshu6(); //记录编码器状态}/********************************定时器0中断函数********************************************/void timer0(void) interrupt 1 //定时器0中断函数,检测编码器,掉电存储等操作(仅用于正常工作模式){unsigned char buchang;bianmaqi(); //调用编码器函数if(huancunkaiguan==1) //延时显示计数huancunjishu++;zhouqijishu++; //加热周期计数if(jiareshu>190) //最多加热190msjiareshu=190;if(zhouqijishu<=jiareshu) //如果当前计数小于等于加热数t12=1; //就加热else //否则t12=0; //不加热if(t12wendu==5000) //如果t12温度为500,说明没有插入烙铁头或参数严重错误t12=0; //停止加热if(huancunjishu==1500) //如果达到了设定温度延时显示的秒{huancunkaiguan=0; //关闭缓存开关huancunjishu=0; //停止缓存计数huancun=t12wendu; //由显示设定温度改为显示t12温度}if(zhouqijishu==200) //t12停止加热后2ms再检测温度(给电容留出放电时间,防止检测的温度偏高){adc(); //检测电压,计算温度zhouqijishu=0; //重新开始加热周期计数////////////////////以下为加热算法(请自行理解,不作注释)//// /////////////if(t12wendu>shedingwendu){if(t12wendu-shedingwendu<=20)jiareshu=(shedingwendu-1500)/160;elsejiareshu=0;}if(t12wendu<=shedingwendu){wencha=shedingwendu-t12wendu;if(wencha>20){buchang++;if(buchang>150)buchang=150;}elsebuchang=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;elsejiareshu=(shedingwendu-1000)/80+wencha*2/3+buchang;}}}/********************************主函数*****************************************************/ void main (void) //主函数{P1M0=0x00; //P1除,,为输入模式外均为正常模式P1M1=0x07;P1ASF=0x07; //设置P1相应ADC转换的I/O口为ADC输入模式P2M0=0xff; //P2都是推挽模式P2M1=0x00;P3M0=0xf0; //,,,为推挽模式,,为输入模式,P3M1=0x06; //其余正常模式ADC_CONTR=0xe0; //打开ADC电源shedingwendu=3000; //设为300度IE=0x88; //打开定时器0中断,关闭定时器1中断timer0init(); //初始化定时器0while(1){display(huancun); //数码管显示数据}}。

STCCAS单片机各个模块程序代码

STCCAS单片机各个模块程序代码

//**************************************************************************** //// STC12C5A60S2可编程时钟模块////// 说明:STC12C5A60S2单片机有三路可编程时钟输出CLKOUT0/T0/P3.4// CLKOUT1/T1/P3.5、CLKOUT2/P1.0//// 涉及寄存器:AUXR(辅助寄存器)、WAKE_CLKO(时钟与系统掉电唤醒控制寄存器) // BRT(独立波特率发生器定时器寄存器)//// 程序说明:// 本程序可选实现P3.4输出CLKOUT0时钟、P3.5输出CLKOUT1时钟// P1.0输出CLKOUT2时钟//////************************************************************************** **//#include <STC12C5A60S2.H>#include <intrins.h>//#define Port_BRT //如果想测试独立波特率发生器时钟输出请打开此句//若想测试CLKOUT1和CLKOUT0请注释此句#ifdef Port_BRT /*条件编译独立波特率发生器时钟输出*///*********************************//// CLKOUT2时钟初始化 ////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x04; //Bit2-BRTCLKO 允许P1.0配置为独立波特率发生器的时钟输出//BRT工作在1T模式下时的输出频率 = Sysclk/(256-BRT)/2 //BRT工作在12T模式下时输出频率 = Sysclk/12/(256-BRT)/2 AUXR = 0x14; //Bit4-BRTR 允许独立波特率发生器运行//Bit2-BRTx12 BRT工作在1T模式下BRT = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频}#else /*条件编译CLKOUT0时钟输出*///*********************************//// CLKOUT0时钟和CLKOUT1初始化 ////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x03; //允许将P3.4/T0脚配置为定时器0的时钟输出CLKOUT0//T0工作在1T模式时的输出频率 = SYSclk/(256-TH0)/2//T0工作在12T模式时的输出频率 = SYSclk/12/(256-TH0)/2 //1T指的是每1个时钟加1,是普通C51的12倍//12T指的是每12个时钟加1与普通C51一样//允许将P3.5/T1脚配置为定时器1的时钟输出CLKOUT1,只能工作在定时器模式2下//T1工作在1T模式时的输出频率 = SYSclk/(256-TH0)/2//T1工作在12T模式时的输出频率 = SYSclk/12/(256-TH0)/2 //1T指的是每1个时钟加1,是普通C51的12倍//12T指的是每12个时钟加1与普通C51一样AUXR = 0xc0; //T0定时器速度是普通8051的12倍,即工作在1T模式下//T1定时器速度是普通8051的12倍,即工作在1T模式下TMOD = 0x22; //定时器0工作模式为方式2,自动装载时间常数//定时器1工作模式为方式2,自动装载时间常数TH0 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频TL0 = 0xff;TH1 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频TL1 = 0xff;TR1 = 1;TR0 = 1;}#endif//**********************************//// 主程序////**********************************//void main(){CLKOUT_init();while(1);}//**************************************************************************** //// STC12C5A60S2系统时钟模块////// 说明: STC12C5A60S2单片机有两个时钟源,内部R/C振荡时钟和外部晶体时钟// 出厂标准配置是使用外部晶体或时钟////// 涉及寄存器:CLK_DIV(时钟分频寄存器)// 由该寄存器的Bit0-2组合可实现对时钟源进行0、2、4、8、16 // 32、64、128分频// //// 程序说明:// 对外部时钟进行分频得到Sysclk,然后经过P1.0的独立波特率// 时钟输出功能Sysclk/2输出时钟频率//**************************************************************************** //#include <STC12C5A60S2.h>#include <intrins.h>#define Bus_clk 12 //若要修改系统时钟直接在此处修改//12 为 12M 的sysclk//6 为 6M 的sysclk//3 为 3M 的sysclk//1500 为 1.5M 的sysclk//750 为 750kHz 的sysclk//375 为 375kHz 的sysclk//187500 为 187.5kHz 的sysclk//93750 为 93.75kHz 的sysclk//*********************************************//// 系统时钟初始化 ////*********************************************//void Sysclk_init(void){WAKE_CLKO = 0x04; //配置P1.0口为频率输出AUXR = 0x14; //允许波特率时钟工作//工作模式为1TBRT = 0xff;#if( Bus_clk == 12 )CLK_DIV = 0x00;#elif( Bus_clk == 6 )CLK_DIV = 0x01;#elif( Bus_clk == 3 )CLK_DIV = 0x02;#elif( Bus_clk == 1500 )CLK_DIV = 0x03;#elif( Bus_clk == 750 )CLK_DIV = 0x04;#elif( Bus_clk == 375 )CLK_DIV = 0x05;#elif( Bus_clk == 187500 )CLK_DIV = 0x06;#elif( Bus_clk == 93750 )CLK_DIV = 0x07;#endif}//**********************************************//// 主程序////**********************************************//void main(){Sysclk_init();while(1);}//**************************************************************************** //// STC12C5A60S2系统省电模块////// 说明: STC12C5A60S2单片机有三种省电模式以降低功耗.空闲模式,低速模式// 掉电模式////// 涉及寄存器:PCON(电源控制寄存器)// Bit0 - IDL 控制单片机进入IDLE空闲模式// Bit1 - PD 控制单片机进入掉电模式// //// 程序说明:程序实现让单片机先工作一阵子(通过P0^3指示灯显示)// 然后进入掉电状态,利用外部中断0口来唤醒单片机工作// 唤醒后单片机将通过P0^0-3口的灯闪烁显示开始工作////************************************************************************** **//#include <STC12C5A60S2.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar Power_Down_Flag = 0; //进入掉电状态标志sbit Chip_Start_LED = P0^0; //单片机开始工作指示灯sbit Power_Down_LED_INT0 = P0^1; //INT0口掉电唤醒指示灯sbit N_Power_Down_LED_INT0 = P0^2; //INT0口没有唤醒指示灯sbit Normal_Work_LED = P0^3; //正常工作指示灯sbit Power_Down_Wakeup_INT0= P3^2; //外中断唤醒输入口void Delay_ms( uint time );void Normal_work(void);void Intp_init(void);void After_Powr_Down(void);//***********************************//// 软件延时 ////***********************************//void Delay_ms( uint time ){uint t; //延时时间 = (time*1003+16)us while(time--){for( t = 0; t < 82; t++ );}}//***********************************//// 正常工作指示//***********************************//void Normal_work(void){Normal_Work_LED = 1;Delay_ms(500);Normal_Work_LED = 0;Delay_ms(500);}void After_Power_Down(void){uchar i ;for( i = 0; i < 100; i++ ){P0 = 0x0f;Delay_ms(500);P0 = 0x00;Delay_ms(500);}}//***********************************//// 中断初始化 ////***********************************//void Intp_init(void){IT0 = 0; //外部中断源0为低电平触发EX0 = 1; //允许外部中断EA = 1; //开总中断}//***********************************//// 主程序 ////***********************************//void main(){uchar j = 0;uchar wakeup_counter = 0; //记录掉电次数P0 = 0x00;Chip_Start_LED = 1; //单片机开始工作Intp_init(); //外中断0初始化while(1){P2 = wakeup_counter;wakeup_counter++;for( j = 0; j < 250; j++ ){Normal_work(); //系统正常工作指示}Power_Down_Flag = 1; //系统开始进入掉电状态PCON = 0x02;_nop_();_nop_();_nop_();_nop_();After_Power_Down(); //掉电唤醒后}}//**********************************//// 中断服务//**********************************//void INT0_Service(void) interrupt 0{if( Power_Down_Flag ) //掉电唤醒状态指示 {Power_Down_Flag = 0;Power_Down_LED_INT0 = 1;while( Power_Down_Wakeup_INT0 == 0 ){_nop_(); //等待高电平}Power_Down_LED_INT0 = 0;}else //未掉电状态{N_Power_Down_LED_INT0 = 1; //不是掉电唤醒指示while( Power_Down_Wakeup_INT0 == 0 ){_nop_();}N_Power_Down_LED_INT0 = 0;}}//**************************************************************************** //// STC12C5A60S2 A/D转换模块////// 说明: STC12C5A60S2单片机有8路10位高速AD转换器,P1^0-P1^7//// 涉及寄存器:P1ASF(模拟功能控制寄存器)、ADC_CONTR(ADC控制寄存器)// ADC_RES、ADC_RESL(转换结果寄存器)//// 注意: 1、初次打开内部A/D模拟电源需适当延时等内部模拟电源稳定后,再启动A/D转换// 启动A/D后,在转换结束前不改变任何I/O口的状态,有利于高精度A/D 转换// 若能将定时器/串行/中断系统关闭更好。

STC T12说明书

STC T12说明书

1.航空座- - T12负极SW接震动开关+T12正极E接T12外壳2.接12-20V直流电3.加热指示灯,加热时亮。

4.温度校准当数码管显示温度与T12实际温度偏低时顺时针旋转。

偏低时逆时旋转。

5.加温正常使用时,按下编码器,顺时针旋转,则是加温模式,在现有的基础上增加50℃。

6.休眠正常使用时,按下编码器,逆时针旋转,则是休眠模式,T12保持在200℃。

或者SW在3分钟后没有低电平,也可以进入休眠。

取消休眠模式,可以按一下编码器,或者旋一下编码器,或者SW接T12负极。

7.调温改变温度的时候,此处亮。

8.编码器P01 ADC参考电压(通过测TL431获得)P02 NTC修正(通过将设定温度到最低观察数码管上的读数) P03 运放输入失调电压修正值P04 热电偶放大器增益P05 PID参数pGainP06 PID参数iGainP07 PID参数dGainP08 自动关机时间设置3-50分钟P09 恢复出厂设置P10 温度步进设置P11热电偶放大器增益常见故障排除方法:1.数码管显示不稳定,不能稳定在设定温度。

常见如果是使用全新的T12时,会出现温度乱跳的情况。

解决方法是通电3-5分钟,然后断电,通电。

此时T12芯内部稳定后,数码管显示也会趋于稳定,此时如果仍然不稳定,可在T12手柄的+ - 极并接一个0.1uf/50V的电容。

如果仍然不能稳定,可以调节温度校准电位器。

2.对于SW未接震动开关,控制器在3分钟后会自动进入休眠200℃,若觉得使用不便,SW和T12 + 接104的电容可取消休眠功能。

恢复出厂设置方法按住编码器中键,开机,松开中键,数码管会显示P01 然后会自动跳到249长按中键,松开,数码管显示P02后变为000,长按中键,数码管显示P03后变为000 长按中键,松开,数码管显示P04后变为270 长按中键,松开,数码管显示P05后变为064 长按中键,松开,数码管显示P06后变为002 长按中键,松开,数码管显示P07后变为016 长按中键,松开,数码管显示P08后变为010 长按中键,松开,数码管显示P99后变为000 此时旋一下编码器,使数码管为001 长按中键后,即可恢复出厂设置。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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控制
{
delay_ms(1);//延时
bw=1;//关断百位
sw=1;//关断十位
gw=1;//关断个位
}
/********************************公共函数10(显示)********************************************/
void gonggonghanshu10(unsigned char a)
void adc (void)//ADC函数,用于测量和计算各种电压
{
signed char a;//查NTC表用
gonggonghanshu2();//公共函数2(此函数功能是测量电源电压,单位mV)
ADC_CONTR=0x89;//ADC控制寄存器设置,转换采用最低速度速,低速更精确(测量t12电压务必使用最低速度AD转换,实测高速误差大)
void gonggonghanshu2(void)//此函数测量单片机电源电压
{
ADC_CONTR=0x88;//ADC_POWER, SPEED1, SPEED0, ADC_FLAG---ADC_START, CHS2, CHS1, CHS0
delay_10us(2);//延时等待转换结束
ADC_RESL=ADe(a--)
{
for(b=0;b<1200;b++);
}
}
/********************************10us延时函数************************************************/
void delay_10us (unsigned int a)//24MHz时钟时的10微秒延时函数
{
if(a>=61)//如果超出表的范围就取允许的最高温度(50度)
break;//并且退出查表
}
shiwen=(a-11)*10;//得出室温(实际室温乘以10)
t12wendu=(t12dianya-100)*43*10/260+shiwen;//计算t12的实际温度,其中260为运放增益
if(t12wendu<shiwen)//如果t12温度小于室温
/*************STC15F204EA单片机旋转编码器版白光T12控制器代码(开发固件)(by金向维)*******************/
#include <STC15F104E.H>//单片机头文件,24MHz时钟频率
#include "INTRINS.h"//头文件
unsigned char code duanma[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
sw=0;//打开十位
guanduan();//延时关断十位
gonggonghanshu10(duanma[gewei]);//显示个位
gw=0;//打开个位
guanduan();//延时关断个位
}
}
/********************************ADC公共函数**************************************************/
/********************************1ms延时函数*************************************************/
void delay_ms (unsigned int a)//24MHz时钟时的1毫秒延时函数
{
unsigned int b;
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;//用于改变设定温度后延时显示设定温度(而不是立刻显示t12温度)
unsigned long cankaodianya0, t12dianya, ntcdianya, dianyuandianya;
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
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);
signed int huancun;//显示函数直接显示huancun,要显示一个数据将必须这个数据赋值给缓存(由于数码管只有三位,为了在显示三位数同时保持四位数的精度,所以实际显示的是数据除以10,并支持显示负数)
signed int shiwen;//10倍实际室温,即实际室温乘以10(为了精确)(允许的室温范围为-11度至50度)
gonggonghanshu10(duanma[10]);
else//否则直接显示百位
gonggonghanshu10(duanma[baiwei]);//显示百位
bw=0;//打开百位
guanduan();//延时关断百位
gonggonghanshu10(duanma[shiwei]);//显示十位
ADC_RESL=ADC_RESL&0x03;
ntcdianya=(ADC_RES*4+ADC_RESL);
ntcdianya=2490*ntcdianya/cankaodianya0;//计算ntc电压,单位mV
for(a=0;wendubiao[a]<ntcdianya;a++)//查表计算室温
void gonggonghanshu6(void)
{
e=encodera;//记录编码器a脚此次状态
f=encoderb;//记录编码器b脚此次状态
}
/********************************编码器函数(正常加热模式调用)********************************/
void timer0init (void)//定时器0初始化程序,24MHz频率下,每1ms中断一次
{
TMOD=0x00;//定时模式,16位自动重装
TH0=0xf8;//计时1ms
TL0=0x2f;
ET0=1;//开启定时器0中断
TR0=1;//启动定时器0
}
/********************************公共函数6(记录编码器状态)**********************************/
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是负数,则百位显示负号
cankaodianya0=(ADC_RES*4+ADC_RESL);//把结果转换成十进制数据(10位ADC,最大值1024)
dianyuandianya=2549760/cankaodianya0;//计算电源电压,单位mV
}
/********************************ADC测电压函数************************************************/
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段
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,
t12wendu=shiwen;//就取室温
if(t12wendu>5000)//如果得出的温度超过500度,说明没有插入烙铁头或参数错误(因为烙铁头的温度不可能超过500度)
相关文档
最新文档