单片机源程序如下:
- #include <reg52.h>
- #include<intrins.h>
- #include<string.h>
- #include <stdio.h>
- #include <math.h>
- #define uchar unsigned char
- #define uint unsigned int//位定义
- //max6675
- sbit SO= P1^0;
- sbit CS= P1^1;
- sbit SCK=P1^2;
- //按键
- sbit key1=P1^5; //功能键
- sbit key2=P1^6; //+
- sbit key3=P1^7; //-
- sbit BEEP=P1^3; //蜂鸣器
- sbit RELAY=P1^4; //继电器
- //DAC0832
- //sbit CSDA=P3^2;
- //sbit wr=P3^6;
- //int high_limit=1250; //上限温度,默认值为1250
- int Temp_set=250; //设定目标温度,默认值为250
- int Temp_true;
- int set_status=0;
- uchar qian=0,bai=0,shi=0,ge=0,xiao=0;
- uchar smg[8];
- //float Kp,Ki,Kd;
- uchar num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管赋值 0,1,2,3,4,5,6,7,8,9
- //uchar num_p[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳极数码管带小数点赋值 0,1,2,3,4,5,6,7,8,9
- uchar choose[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管位选
- //sbit dula=P2^6; //数码管段选,锁存器控制信号
- //sbit wela=P2^7; //数码管位选,锁存器控制信号
- uint Re_Convert(); //热电偶数据读取,返回温度
- //int ek=0;
- //int eset_statu=0; //第K-1采样时的偏差值,Error[-1]
- //int ek2=0; //第K-2采样时的偏差值,Error[-2]
- //float LastOutput=0; //上次PID输出
- //float Output=0; //PID的输出
- //uchar high_time,low_time,count=0; //占空比调节参数
- //---------------------------延时子程序---------------------------//
- void delay(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void delay_50ms(uint m)
- {
- uchar x,y;
- for(x=m;x>0;x--)
- for(y=50;y>0;y--) ;
- }
- /*********** MAX6675函数***********/
- uint Re_Convert() //热电偶数据读取,返回温度
- {
- long int a=0x7ff8;
- long int wendu=0,wendu_1;
- float wendu_2;
- uint i;
- CS=1;
- SCK=0;
- delay(200);
- _nop_();
- _nop_();
- CS=0;
- for(i=1;i<=16;i++)
- { wendu=wendu<<1;
- _nop_();
- SCK=1;
- if(SO==1){wendu=wendu|0x01;}
- else wendu=wendu|0x00;
- _nop_();
- _nop_();
- SCK=0;
- _nop_();
- _nop_();
- }
- wendu_1=wendu&a;
- wendu_1=wendu_1>>3;
- wendu_2=wendu_1*0.25;
- return wendu_2; //返回带两位小数的实际温度
- //wendu=wendu_2*100; //放大100倍转成整型常数
- //return wendu; //返回整型常数便于显示小数位数字
- }
- //*************温度显示程序*******************//
- void Disp_temp_true(uint temp)//温度显示
- {
- unsigned char i;
- unsigned int j;
- ge=temp%10; //取个数位数字
- temp=temp/10;
- shi=temp%10;//取十位数字
- temp=temp/10;
- bai=temp%10;//取百位数字
- qian=temp/10;//取千位数字
- smg[0]=num[qian];
- smg[1]=num[bai];
- smg[2]=num[shi];
- smg[3]=num[ge];
- /*
- for(i=0; i<4; i++)
- {
- P2=choose[i]; //数码管位选
- P0=smg[i]; //送数字到段码端口,显示数字
- j = 10; //扫描间隔时间设定
- while(j--);
- P0 = 0x00;//消隐
- }
- */
- }
- //*************温度设置显示程序*******************//
- void Disp_temp_set(uint set)//温度设置显示
- {
- unsigned char i;
- unsigned int j;
- ge=set%10; //取个数位数字
- set=set/10;
- shi=set%10;//取十位数字
- set=set/10;
- bai=set%10;//取百位数字
- qian=set/10;//取千位数字
- smg[4]=num[qian];
- smg[5]=num[bai];
- smg[6]=num[shi];
- smg[7]=num[ge];
- /*
- for(i=4; i<8; i++)
- {
- P2=choose[i]; //数码管位选
- P0=smg[i]; //送数字到段码端口,显示数字
- j = 10; //扫描间隔时间设定
- while(j--);
- P0 = 0x00;//消隐
- }
- */
- }
- //*************报警子程序*******************//
- void Alarm()//蜂鸣器间断
- {
- if(Temp_true>Temp_set)
- {
- int b;
- for(b=100;b>0;b--)
- {
- BEEP=1;
- delay_50ms(10);
- BEEP=0;
- delay_50ms(10);
- }
- }
- }
- void compare_temper()
- {
- uint temper=Temp_true;
- if(temper>=Temp_set) //实际温度是否大于设置的温度
- {
- RELAY=1;
- }
- else if(temper<Temp_set)
- {
- RELAY=0;
- }
- }
- //*******按键子程序*******//
- void keyset()
- {
- #if 1
- if(key1 == 0){
- set_status =!set_status;
- }
- if(set_status==1){
- if(key1==0)
- {
- set_status =!set_status;
- }
- if(key2==0)
- {
- Temp_set=Temp_set+10;
- Disp_temp_set(Temp_set);
- //delay_50ms(1);
- //while(!key2);
- }
- if(key3==0)
- {
- Temp_set=Temp_set-10;
- Disp_temp_set(Temp_set);
- //delay_50ms(10);
- //while(!key3);
- }
- }
- }
- #else
-
- if(set_status==0)
- {
- if(key1==0)
- {
- set_status=1;
- }
- }
- else{
- //while(set_status==1)
- {
- if(key1==0)
- {
- set_status=0;
- }
- if(key2==0)
- {
- Temp_set=Temp_set+10;
- Disp_temp_set(Temp_set);
- //delay_50ms(1);
- //while(!key2);
- }
- if(key3==0)
- {
- Temp_set=Temp_set-10;
- Disp_temp_set(Temp_set);
- //delay_50ms(10);
- //while(!key3);
- }
- //}
- }
- #endif
- }
- void init_sys() //系统初始化
- {
- IT0=1;
- EX0=1;
- ET0=1;
- EA=1;
- TMOD=1;
- TH0=0xfc;
- TL0=0x66;//装初值,定时时间为1ms
- ET0=1; //打开定时器0的大门
- TR0=1;
- P0=0xc0;
- }
- //*************主程序*******************//
- void main()
- {
- // Kp=1.2;
- // Ki=3.4;
- // Kd=5.6;
- init_sys();
- delay_50ms(1);
- while(1)
- {
- Temp_true=Re_Convert();// 热电偶数据读取,返回温度
- compare_temper();
- Disp_temp_true(Temp_true);
- Disp_temp_set(Temp_set);
- //if(key1==0)
- {
- keyset();
- }
- //PID();
- Alarm();
- //delay_50ms(6);
- }
- }
- void Dsqi0() interrupt 1
- {
- long int i=0;
- uchar c=0xfe;
- TH0=0xfc;
- TL0=0x66;
- P2=0xff;
- P0=smg[i];
- P2=c;
- c=_crol_(c,1);
- i=i+1;
- if(i==8)
- {
- i=0;
- c=0xfe;
- }
- }
复制代码
所有资料51hei提供下载:
max6675.rar
(43.63 KB, 下载次数: 194)
|