测温系统源程序
单片机温度检测系统的汇编实现
LCD_PRINT:
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1:
ACALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置LCD的第一行地址
ACALL WR_COMM ;写入命令
JMP A0 ;转移到A0
A12:CPL 20H.1 ;UP/DOWN标记反向
JMP A3 ;跳转到A3,TH值调整(增加)
A13:JMP A7 ;跳转到A7,确定调整OK
RET ;子程序返回
;********************************************菜单显示子程序*******************
ACALL WRITE_E2 ;调用报警值拷贝E2ROM子程序
PK2: ACALL XS_S ;显示"OK"信息子程序
PK3: RET
TA1: ;菜单表
DB "SET ALERT DATA",0H
;********************************设定报警值TH、TL子程序**************************
MOV A,#0CCH ;跳过ROM匹配
ACALL WRITE_1820
MOV A,#44H ;发出温度转换命令
ACALL WRITE_1820
ACALL RESET_1820 ;调用复位子程序
MOV A,#0CCH ;跳过ROM匹配
K1 EQU P1.0
K2 EQU P1.1
K3 EQU P1.2
K4 EQU P1.3
SPK EQU P3.7 ;蜂鸣器
温度测量、报警系统 C程序
程序名称:DS18B20温度测量、报警系统简要说明:DS18B20温度计,温度测量范围0~99.9摄氏度可设置上限报警温度、下限报警温度即高于上限值或者低于下限值时蜂鸣器报警默认上限报警温度为38℃、默认下限报警温度为5℃报警值可设置范围:最低上限报警值等于当前下限报警值最高下限报警值等于当前上限报警值将下限报警值调为0时为关闭下限报警功能编写:最后更新:09/04/16晚于寝室******************************************************************/ #include <AT89X52.h>#include "DS18B20.h"#define uint unsigned int#define uchar unsigned char //宏定义#define SET P3_1 //定义调整键#define DEC P3_2 //定义减少键#define ADD P3_3 //定义增加键#define BEEP P3_7 //定义蜂鸣器bit shanshuo_st; //闪烁间隔标志bit beep_st; //蜂鸣器间隔标志sbit DIAN = P2^7; //小数点uchar x=0; //计数器signed char m; //温度值全局变量uchar n; //温度值全局变量uchar set_st=0; //状态标志signed char shangxian=38; //上限报警温度,默认值为38signed char xiaxian=5; //下限报警温度,默认值为38ucharcode LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x ff};/*****延时子程序*****/void Delay(uint num){while( --num );}/*****初始化定时器0*****/void InitTimer(void){TMOD=0x1;TH0=0x3c;TL0=0xb0; //50ms(晶振12M)}/*****定时器0中断服务程序*****/void timer0(void) interrupt 1{TH0=0x3c;TL0=0xb0;x++;}/*****外部中断0服务程序*****/void int0(void) interrupt 0{EX0=0; //关外部中断0if(DEC==0&&set_st==1){shangxian--;if(shangxian<xiaxian)shangxian=xiaxian; }else if(DEC==0&&set_st==2){xiaxian--;if(xiaxian<0)xiaxian=0;}}/*****外部中断1服务程序*****/void int1(void) interrupt 2{EX1=0; //关外部中断1if(ADD==0&&set_st==1){shangxian++;if(shangxian>99)shangxian=99;}else if(ADD==0&&set_st==2){xiaxian++;if(xiaxian>shangxian)xiaxian=shangxian; }}/*****读取温度*****/void check_wendu(void){uint a,b,c;c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差 a=c/100; //计算得到十位数字b=c/10-a*10; //计算得到个位数字m=c/10; //计算得到整数位n=c-a*100-b*10; //计算得到小数位if(m<0){m=0;n=0;} //设置温度显示上限if(m>99){m=99;n=9;} //设置温度显示上限}/*****显示开机初始化等待画面*****/Disp_init(){P2 = 0xbf; //显示-P1 = 0xf7;Delay(200);P1 = 0xfb;Delay(200);P1 = 0xfd;Delay(200);P1 = 0xfe;Delay(200);P1 = 0xff; //关闭显示}/*****显示温度子程序*****/Disp_Temperature() //显示温度{P2 =0xc6; //显示CP1 = 0xf7;Delay(300);P2 =LEDData[n]; //显示个位P1 = 0xfb;Delay(300);P2 =LEDData[m%10]; //显示十位DIAN = 0; //显示小数点P1 = 0xfd;Delay(300);P2 =LEDData[m/10]; //显示百位P1 = 0xfe;Delay(300);P1 = 0xff; //关闭显示}/*****显示报警温度子程序*****/Disp_alarm(uchar baojing){P2 =0xc6; //显示CP1 = 0xf7;Delay(200);P2 =LEDData[baojing%10]; //显示十位P1 = 0xfb;Delay(200);P2 =LEDData[baojing/10]; //显示百位P1 = 0xfd;Delay(200);if(set_st==1)P2 =0x89;else if(set_st==2)P2 =0xc7; //上限H、下限L标示P1 = 0xfe;Delay(200);P1 = 0xff; //关闭显示}/*****报警子程序*****/void Alarm(){if(x>=10){beep_st=~beep_st;x=0;}if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=0; else BEEP=1;}/*****主函数*****/void main(void){uint z;InitTimer(); //初始化定时器EA=1; //全局中断开关TR0=1;ET0=1; //开启定时器0IT0=1;IT1=1;check_wendu();check_wendu();for(z=0;z<300;z++){Disp_init();}while(1){if(SET==0){Delay(2000);do{}while(SET==0);set_st++;x=0;shanshuo_st=1;if(set_st>2)set_st=0;}if(set_st==0){EX0=0; //关闭外部中断0EX1=0; //关闭外部中断1check_wendu();Disp_Temperature();Alarm(); //报警检测}else if(set_st==1){BEEP=1; //关闭蜂鸣器EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(shangxian);} }else if(set_st==2){BEEP=1; //关闭蜂鸣器EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(xiaxian);} }}}/*****END*****/DS18B20.h:#include <AT89X52.h>#define DQ P3_6 //定义DS18B20总线I/O/*****延时子程序*****/void Delay_DS18B20(int num){while(num--) ;}/*****初始化DS18B20*****/void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位Delay_DS18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低Delay_DS18B20(80); //精确延时,大于480usDQ = 1; //拉高总线Delay_DS18B20(14);x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败Delay_DS18B20(20);}/*****读一个字节*****/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;Delay_DS18B20(4);}return(dat);}/*****写一个字节*****/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;Delay_DS18B20(5);DQ = 1;dat>>=1;}}/*****读取温度*****/unsigned int ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器a=ReadOneChar(); //读低8位b=ReadOneChar(); //读高8位t=b;t<<=8;t=t|a;tt=t*0.0625;t= tt*10+0.5; //放大10倍输出并四舍五入 return(t);}/*****END*****/。
基于51单片机的MLX90614红外测温源程序
#define PWMCtrlAddr 0x02 //PWM 设定
#define TaRangeAddr 0x03 //环境温度设定
//************数据定义****************************************************
bdata uchar flag1; //可位寻址数据
sbit bit_out=flag1^7;
//设置显示模式******* 0x08+ *********************************************
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_AC_DOWN 0x00 //默认光标左移 AC-
#define LCD_MOVE 0x01 //画面可平移
#define LCD_NO_MOVE 0x00 //默认 画面不移动
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_DATA 1 // 数据
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
基于51单片机的MLX90614红外测温源程序如下:
//-------------------------------------------------------------------------
温度控制系统具体源程序
/******************************************************************/
/* 向CH451传输数据 */
ch451_din=1;
ch451_load=1;
ch451_dout=1;
#ifdef USE_KEY
IT1=0; //设置下降沿触发
IE1=0; //清中断标志
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<math.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define CH451_LEFTCYC 0x0301 //设置移动方式-左循
#define CH451_RIGHTMOV 0x0302 //设置移动方式-右移
#define CH451_RIGHTCYC 0x0303 //设置移动方式-右循
//******************************************************
void Set_temp(void) //设定保温点
{ unsigned char i;
ch451_write(CH451_DIG0|showtemp[0]);//显示原来设定温度
void delay1(uchar MS);
unsigned int ReadTemperature(void);
红外测温 源程序代码(汇编)
/*****************************************************************/ /* “红外测温仪”主程序/*****************************************************************/ ORG 0000HSJMP MAINORG 0030HMAIN:MOV DPTR, #7FFFH ;启动AD转换MOV A, #0MOVX @DPTR, AHERE:JB P3.2, HERE ;等待转换结束MOVX A, @DPTR ;读取转换结果SUBB A, #60MOV B, #108 ;准备温度换算MUL ABMOV R5, AMOV R6, BCALL WDJS ;调用温度计算子程序CALL XSZH ;调用温度显示转换子程序MOV R6, #30LOOP1: CALL DISPLAY ;调用温度显示子程序DJNZ R6, LOOP1 ;循环显示LJMP MAIN ;重新开始温度数据采集、转换和显示/*****************************************************************/ /* 温度计算子程序/*****************************************************************/ /*首先对16位数与255的除法进行计算,获得商为显示时的整数部分*/ WDJS: MOV R7, #08H ;循环次数装入R7JS: CLR CMOV A, R5 ;被除数低位存入ARLC A;带进位位循环左移1位MOV R5, A ;左移后结果回存MOV A, R6 ;被除数高位存入ARLC A;16位被除数整体左移1位MOV 07H, C;保留最高位CLR CMOV R4, #255 ;除数进入R4SUBB A, R4 ;余数高位减去除数JB 07H, S1 ;最高位为1转S1JNC S1 ;没有借位转S1ADD A, R4 ;产生借位恢复余数SJMP S2 ;转到S2S1: INC R5 ;修改商值S2: MOV R6, A ;保留余数高位DJNZ R7, JS ;循环/*对16位除法后的余数乘10后再进行求商,获得的商为显示时的小数部分*/ MOV A, R6MOV B, #10MUL ABMOV R3, AMOV R2, BWDJS1: MOV R7, #08HJS1: CLR CMOV A, R3RLC AMOV R3, AMOV A, R2RLC AMOV 07H, CCLR CSUBB A, R4JB 07H, S11JNC S11ADD A, R4SJMP S21S11: INC R3S21: MOV R2, ADJNZ R7, JS1MOV A, R3MOV R6, ARET/******************************************************************/ /* 显示转换子程序/******************************************************************/ /*把温度计算子程序的结果转换成4个数码管显示的数据*/XSZH: MOV A, R5 ;求显示的第一位MOV B, #100DIV ABMOV R0, AMOV A, B ;求显示的第2,3位MOV B, #10DIV ABMOV R1, AMOV R2, BMOV A, R6 ;求显示的第4位MOV R3, ARET/*****************************************************************/ /* 显示子程序/*****************************************************************/ DISPLAY:MOV DPTR, #TABLE ;显示第1位MOV A, R0MOVC A, @A+DPTRMOV P1, AMOV P2, #0FEHCALL DELMS ;显示第2位MOV A, R1MOVC A, @A+DPTRMOV P1, AMOV P2, #0FDHCALL DELMSMOV DPTR, #TABLE1 ;显示第3位MOV A, R2MOVC A, @A+DPTRMOV P1, AMOV P2, #0FBHCALL DELMSMOV DPTR, #TABLE ;显示第4位MOV A, R3MOVC A, @A+DPTRMOV P1, AMOV P2, #0F7HCALL DELMSRET/****************************************************************/ /* 显示延时子程序/*****************************************************************/ DELMS: MOV 50H, #2HDELAY1: MOV 52H, #4DELAY: MOV 51H, #60DJNZ 51H, $DJNZ 52H, D ELAYDJNZ 50H, D ELAY1RET/****************************************************************/ /* 数据定义/****************************************************************/ TABLE: DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07hDB 7fh,6fh,77h,7ch,39h,5eh,79h,71hTABLE1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H DB 0FFH,0EFH,0F7H,0FCH,0B9H,0DEH,0F9H,0F1HEND。
温湿度检测源程序2
SCK BIT P2.3DATAI BIT P2.4SCL EQU P0.5SDA EQU P0.6ORG 0000HMOV SP,#70HAJMP zhongduanORG 0023H LJMP SRORG 0100Hzhongduan: MOV TMOD,#20HMOV PCON,#00HMOV TL1,#0FDH MOV TH1,#0FDHSETB TR1 MOV SCON,#50HMOV IE, #90HMOV R0,#21HMAIN: MOV 20H, #55HMOV 21H, #40HLCALL WRNSTART1:LCALL CHUANGANQISTART2:MOV 3DH, 30HMOV R2, #40HSTART3:LCALL DISPLAYDJNZ R2, START3LCALL RDNLCALL DISPLAYMOV A, 3DHCJNE A, 3EH,ABOVE ABOVE: JNC ABOVE1CJNE A, 3FH,BELOWBELOW: JC BELOW1SETB P2.6SETB P2.7LCALL DISPLAYLJMP AA1ABOVE1:CLR P2.6SETB P2.7LCALL DISPLAYLJMP AA1BELOW1:SETB P2.6CLR P2.7LCALL DISPLAYLJMP AA1AA1:JNB P0.0 , AA9LJMP START1AA9:LCALL DELAY1JNB P0.0 ,ANJIANLJMP START1 ANJIAN:CLR P2.5LCALL RDNMOV 20H,3EHMOV 21H,3FHAB1:JB P0.0,AB2LJMP AB1 AB2:LCALL AA6AB9:JB P0.1,AA4LCALL DELAY1JB P0.1,AA4AB4:JB P0.1,AB3LJMP AB4AB3:MOV A, 20HADD A, #01HDA AMOV 20H, ALCALL AA6AA4:JB P0.2, AA5LCALL DELAY1JB P0.2, AA5AB5:JB P0.2,AB6LJMP AB5AB6:MOV A, 20HCLR CSUBB A, #01HMOV 20H, AANL A, #0FHCJNE A, #0FH,AACMOV A, 20HANL A, #0F0HORL A, #09HMOV 20H, AAAC:LCALL AA6 AA5:LCALL AA6JB P0.0 , AB9LCALL DELAY1JB P0.0 , AB9AB7:JB P0.0 ,AB8AB8:SETB P2.5LCALL WRNLJMP START1AA6:MOV 30H,20HMOV 31H,21H LCALL DISPLAYDELAY1: MOV R5, #10DL1:MOV R4,#00HDL2:DJNZ R4,DL2DJNZ R5,DL1RETCHUANGANQI: NOPCLR SCKSETB DATAIACALL TS1SETB DATAIACALL CT01SETB DATAINOPT001: JNB DATAI,RCT01NOPNOPAJMP T001RCT01: ACALL RC01MOV 60H,R2MOV 61H,R3CLR CMOV R4,60HMOV R5,61HMOV R6,#3EHMOV R7,#80HACALL NSUBJNC THH1MOV 62H,R4MOV 63H,R5AJMP TJX1THH1: MOV 62H,R6MOV 63H,R7TJX1: CLR CTJX2: MOV R4,#00HMOV R5,#00HMOV R6,62HMOV R2,#00HMOV R3,#64HACALL NDIV1MOV 6AH,R6MOV 6BH,R7NOPACALL XYSHCNOPCLR SCKSETB DATAIACALL TS1NOPSETB DATAIACALL CT11SETB DATAINOPT0012: JNB DATAI,RCT12 AJMP T0012RCT12: ACALL RC01NOPMOV 64H,R2MOV 65H,R3MOV R2,64HMOV R3,65HMOV R6,64HMOV R7,65HACALL QKULMOV R2,#27HMOV R3,#10HACALL NDIV1MOV A,R6MOV R2,AMOV A,R7MOV R3,AMOV R6,#01HMOV R7,#18HACALL QKULMOV R2,#00HMOV R3,#64HACALL NDIV1MOV A,R6MOV R4,AMOV A,R7MOV R2,#01HMOV R3,#90H ACALL NADDMOV 6EH,R6MOV 6FH,R7 MOV R2,64HMOV R3,65HMOV R6,#01HMOV R7,#95HACALL QKULMOV R2,#00H MOV R3,#64HACALL NDIV1MOV A,R6MOV R4,AMOV A,R7MOV R5,AMOV R6,6EHMOV R7,6FHACALL NSUBMOV 6CH,R2MOV 6DH,R3MOV R2,64HMOV R3,65H MOV R6,#00H MOV R7,#08HACALL QKUL MOV R2,#03HMOV R3,#0E8H ACALL NDIV1MOV A,R6MOV R4,AMOV A,R7MOV R5,AMOV R2,#00H MOV R3,#01HACALL NADDMOV 64H,R6MOV 65H,R7 MOV R4,6AH MOV R5,6BH MOV R6,#00HMOV R7,#41HACALL NSUBJC RHH1 MOV R6,64HMOV R7,65HACALL QKULMOV A,R6MOV R2,AMOV A,R7MOV R3,AMOV R4,6CHMOV R5,6DHACALL NADD MOV A,R6 MOV R2,AMOV A,R7MOV R3,AAJMP ZHJRHH1: MOV R4,#00H MOV R5,#41HMOV R6,6AHMOV R7,6BHACALL NSUB MOV R6,64HMOV R7,65HACALL QKUL MOV R4,6CHMOV R5,6DHACALL NSUB ZHJ: MOV R6,#00H MOV R7,#64HACALL QKULMOV R2,#27HMOV R3,#10HACALL NDIV1MOV 30H,R7NOPACALL XYSHCNOPRETTS1: SETB DATAICLR SCKMOV R7,#09HTS2: SETB SCKDJNZ R7,TS2SETB SCKCLR DATAICLR SCKSETB SCKSETB DATAICLR SCKRETCT01: CLR SCKCLR DATAIMOV R7,#05HCT02: SETB SCKCLR SCKDJNZ R7,CT02SETB SCKCLR SCKSETB DATAISETB SCKCLR SCKSETB SCKCLR SCKCLR DATAISETB SCKCLR SCKSETB DATAIRETCT11: CLR SCKCLR DATAIMOV R7,#05H CT12: SETB SCKCLR SCKDJNZ R7,CT12SETB DATAISETB SCKCLR SCKCLR DATAISETB SCKCLR SCKSETB DATAISETB SCKCLR SCKCLR DATAI ; SETB SCKCLR SCK SETB DATAI RETNADD: MOV A,R5ADD A,R3MOV R7,AMOV A,R4ADDC A,R2MOV R6,ARETNSUB: MOV A,R5SUBB A,R7MOV R3,AMOV A,R4SUBB A,R6 MOV R2,ARETQKUL: MOV A,R3MOV B,R7MUL ABXCH A,R7MOV R5,BMOV B,R2MUL ABADD A,R5MOV R4,ACLR AADDC A,BMOV R5,AMOV A,R6MOV B,R3MUL ABADD A,R4XCH A,R6XCH A,BADDC A,R5MOV R5,AMOV PSW.5,CMOV A,R2MUL ABADD A,R5MOV R5,ACLR AMOV ACC.0,CMOV C,PSW.5ADDC A,BMOV R4,ARETNDIV1: MOV A,R5CLR CSUBB A,R3MOV A,R4SUBB A,R2JNC NDVE1MOV B,#16NDVL1:CLR CMOV A,R7RLC AMOV R7,AMOV A,R6RLC AMOV R6,AMOV A,R5RLC AMOV R5,AXCH A,R4RLC AXCH A,R4MOV PSW.5,CCLR CSUBB A,R3MOV R1,AMOV A,R4SUBB A,R2JB PSW.5,NDVM1JC NDVD1NDVM1: MOV R4,AMOV A,R1MOV R5,AINC R7NDVD1: DJNZ B,NDVL1CLR PSW.5RETNDVE1: SETB PSW.5RETXYSHC: MOV R6,#6FH YYWC: MOV R7,#6FH YYNC: NOPDJNZ R7,YYNC DJNZ R6,YYWC NOPRETRC01: SETB DATAICLR SCKCLR AMOV R7,#08HRC02: SETB SCKMOV C,DATAIRLC ACLR SCKDJNZ R7,RC02 CLR SCKMOV R2,ACLR DATAISETB SCKCLR SCKSETB DATAICLR AMOV R7,#08HRC03: SETB SCKMOV C,DATAIRLC ACLR SCKDJNZ R7,RC03CLR SCKMOV R3,ACLR DATAISETB SCKCLR SCKSETB DATAIRETDISPLAY:SETB P2.0SETB P2.1SETB P2.2MOV A, 30HANL A, #0FHMOV R6, AMOV A, 30HANL A, #0F0H SWAP AMOV B, #10HADD A, R6DA AMOV 31H, #00HMOV 30H,AMOV A,30HANL A,#0F0HSWAP AMOV 54H, AMOV A, 30HANL A, #0FHMOV 55H, AMOV 56H, #00HCHABIAO:MOV DPTR,#TABCLR P2.0MOV A,54HMOVC A,@A+DPTRMOV P1,AACALL DELAY2SETB P2.0CLR P2.1MOV A,55HMOVC A,@A+DPTRMOV P1,ACLR P1.7;SETB P1.7;ACALL DELAY2SETB P2.1CLR P2.2MOV A,56HMOVC A,@A+DPTRMOV P1,AACALL DELAY2SETB P2.2RETTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH DELAY2:MOV R5,#10H DL3:MOV R4,#80HDL4:DJNZ R4,DL4DJNZ R5,DL3RETWRN: MOV R6, #02H LCALL STARTMOV A, #0A0HLCALL CHECKJB F0, WRNMOV A, #00HLCALL WRTLCALL CHECKJB F0, WRNMOV A, #00HLCALL WRTLCALL CHECKJB F0, WRNMOV R0, #20HWRDATA:MOV A, @R0INC R0LCALL WRTLCALL CHECKJB F0, WRNDJNZ R6, WRDATALCALL STOPRETRDN: MOV R6, #02H LCALL STARTMOV A, #0A0HLCALL WRTLCALL CHECKJB F0, RDNMOV A, #00HLCALL WRTLCALL CHECKJB F0, WRNMOV A, #00HLCALL WRTLCALL CHECKJB F0, WRNLCALL STARTMOV A, #0A1HLCALL WRTLCALL CHECKJB F0, WRNRDDATA:MOV R0, #3EHRDN1: LCALL RBMOV @R0, ADJNZ R6, RACKLCALL NACKLCALL STOPRETRACK: LCALL ACKINC R0LJMP RDN1START: SETB SDASETB SCLNOPNOPCLR SDANOPNOPCLR SCLRETSTOP: CLR SDASETB SCLNOPNOPSETB SDANOPNOPCLR SDACLR SCLRETACK: CLR SDASETB SCLNOPNOPCLR SCLSETB SDARETNACK: SETB SDASETB SCLNOPNOPCLR SCLCLR SDARETCHECK: SETB SDA SETB SCL CLR F0MOV C, SDAJNC CENDSETB F0CEND: CLR SCLRETWRT: MOV R7,#08HWLOOP: RLC AJC WRT1WRT0: CLR SDASETB SCLNOPNOPCLR SCLAJMP WNEXTWRT1: SETB SDASETB SCLNOPNOPCLR SCLCLR SDAWNEXT: DJNZ R7, WLOOPRETRB: MOV R7,#08HRLOOP: SETB SDASETB SCLMOV C, SDAMOV A, R2RLC AMOV R2, ACLR SCLDJNZ R7, RLOOPRETSR: PUSH ACC PUSH PSWMOV PSW, #08HMOV A,SBUFCLR RIMOV 20H, AJNB RI, $MOV A, SBUFCLR RIMOV 21H, ALCALL WRNPOP PSWPOP ACCMOV SP, #70HMOV DPTR, #START1PUSH DPL PUSH DPH RETIEND。
温湿度检测控制系统 51单片机毕业设计 C语言源码
//程序头函数#include <reg52.h>//显示函数#include "intrins.h"//宏定义#define uint unsigned int#define uchar unsigned char/*------------------------------------------------------------------ Includes 头文件------------------------------------------------------------------*//*------------------------------------------------------------------ Private typedef ------------------------------------------------------------------*/ /*------------------------------------------------------------------ Private macro 宏定----------------------------------------------------------------*//*------------------------------------------------------------------ Private variables 变量------------------------------------------------------------*//*------------------------------------------------------------------ Private function prototypes 函数--------------------------------------------------*/ //宏定义#define uint unsigned int#define uchar unsigned char//管脚声明sbit LED_wendu = P2^5; //温度上限值操作端口,报警灯吸合继电器;sbit LED_wendu_L = P2^4; //温度下限报警灯sbit LED_humi = P2^2; //湿度上限报警灯sbit LED_humi_L = P2^0; //湿度下限报警灯sbit baojing = P3^2; //蜂鸣器接口//按键sbit Key1=P1^1; //设置键sbit Key2=P1^5; //加按键sbit Key3=P1^6; //减按键sbit Key4=P1^2; //退回监控模式键sbit Key5=P1^3; //手空温度上限指示灯sbit Key6=P1^4; //手空温度下限指示灯sbit Key7=P1^7; //手空湿度上限指示灯sbit Key8=P2^1; //手空湿度下限指示灯sbit DHT11=P1^0; //DHT11sbit P_IR_RX = P3^3; //定义红外接收输入端口uchar key_IR; //红外检测signed char w; //温度值全局变量uint c; //温度值全局变量uchar temp; //用于读取ADC数据uchar yushe_wendu=60; //温度预设值uchar yushe_humi=80; //湿度预设值uchar yushe_wendu_L=15; //温度预设值uchar yushe_humi_L=10; //湿度预设值//按钮模式|uchar Mode=0; //=1是设置温度阀值 =2是设置湿度阀值uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;uchar U8FLAG,U8comdata;uchar U8count,U8temp;ucharU8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_te mp;//软件延时函数void delay(uint z) //延时函数大约延时z ms{uint i,j;for(i=0;i<z;i++)for(j=0;j<121;j++);}void Delay_Ms(uint ms){uint i,j;for(i=ms;i>0;i--)for(j=112;j>0;j--);}/******************************************************************************* ************************LCD1602相关命令******************************************************************************** ************************/。
温湿度检测C源代码
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
//----------------------
//P2_1=0 ; //T
//P2_1=1 ; //T
//----------------------
sbit key_down=P2^6;
sbit key_ok=P2^7;
//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
//----------------------------------------------//
#define DataPort P1 //LCD1602数据端口
sbit LCM_RS=P2^2; //LCD1602命令端口
sbit LCM_RW=P2^1; //LCD1602命令端口
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//
#define uchar unsigned char
#define uint unsigned int
温度监测系统主程序
RI = 0;//接受中断标志位,RI=1表示一帧数据接收完毕,并申请中断,要求CPU从接收SBUF取走数据
rcvbuf = SBUF;
}
}
void WriteByte(unsigned char dat)
{
unsigned char i = 0;
for(i=8; i>0; i--)
{
RW_Port = 0;
RW_Port = (bit)(dat&0x01);
DelayUs(5);
RW_Port = 1;
dat>>=1;
}
}
unsigned char ReadByte()
}
return readDat;
}
void TempConvep;0xf8==0xf8)//负温度
{
TempDec = -(((~TempDat[1]<<4)|(~TempDat[0]>>4))+1);
TempFlag = 0;
}
else //正温度
{
TempDec = (TempDat[1]<<4)|(TempDat[0]>>4);
{
InitUart0();
InitTime0();
while(1)
{
(TempDec>=0)?(Display(TempDec)):(Display(-TempDec));;///显时十六进制温度
}
}
数码管显示程序:led.c
#include"led.h"
#include"config.h"
#include<reg52.h>
数字温度计源程序(使用89C2051控制)
程序源代码;***数字温度计源程序(使用89C2051控制)***dq bit p3.0f1820 bit 38h ;18B20标记dspctrl1 bit p3.1 ;显示控制信号1dspctrl2 bit p3.2dspctrl3 bit p3.3TMP DATA 24HTMP_B DATA 25HDBUF1 DATA 41HDBUF2 DATA 42HDBUF3 DATA 43HBUF DATA 45H ;缓冲区ORG 0000HLJMP MAINORG 0100HMAIN: MOV SP,#60HMOV TMP,#0MOV TMP_B,#0MOV DBUF1,#0 ;显示初始值(0000)MOV DBUF2,#0MOV DBUF3,#0CLR F1820GET_TMP: SETB DQLCALL RST1820JB F1820,NEXTAGAIN: MOV DBUF1,#5MOV DBUF2,#5MOV DBUF3,#5LCALL DISPLAY ;2秒内显示555SJMP GET_TMPNEXT: MOV A,#0CCHLCALL WR1820MOV A,#44H ;温度转换LCALL WR1820LCALL DISPLAY ;显示温度2秒,等待转换LCALL RST1820MOV A,#0CCHLCALL WR1820MOV A,#0BEH ;写命令LCALL WR1820LCALL RD1820 ;读18B20低8位至TMPMOV A,TMPANL A,#0F0H ;取TMP高4位至TMP_BMOV TMP_B,ALCALL RD1820 ;读出温度的高8位至TMP MOV A,TMPANL A,#0FHORL A,TMP_BRR A ;向右循环,移动4次RR ARR ARR A .MOV B,#10DIV ABMOV DBUF1,#0MOV DBUF2,AMOV DBUF3,BLJMP GET_TMP;********子程序********;*****复位子程序*****RST1820: SETB DQNOP ;用于程序的延时CLR DQ ;DQ=0MOV R0,#5 ;延时500usDL Y: MOV R1,#50DJNZ R1,$DJNZ R0,DL YSETB DQ ;DQ=1NOPNOPNOPNOPMOV R0,#35RS2: JNB DQ,RS3 ;等待18B20信号,RQ=0则执行RS3 DJNZ R0,RS2CLR F1820 ;70us后,若DQ=1,则F1820=0AJMP RS4RS3: SETB F1820 ;置“1”F18B20MOV R0,#250 ;延时500usDJNZ R0,$RS4: SETB DQRET;*****写子程序*****WR1820: MOV R2,#8 ;写8位WR1: CLR DQMOV R3,#6 ;延时12usDJNZ R3,$RRC AMOV DQ,CMOV R3,#24 ;延时48usDJNZ R3,$SETB DQNOP ;延时2usNOPDJNZ R2,WR1 ;写下一位SETB DQRET;*****读子程序*****RD1820: MOV R2,#8 ;读取8位RD1: CLR CSETB DQNOPNOPCLR DQNOPMOV R3,#6SETB DQDJNZ R3,$ ;延时12usMOV C,DQ ;读出1位至CPURRC AMOV R4,#40 ;80us后总线空闲DJNZ R4,$DJNZ R2,RD1 ;若R2>0读下一位MOV TMP,A ;将温度值从A传送到TMPSETB DQRET;***** 显示子程序*****DISPLAY: MOV R4,#5LOOP1: MOV R5,#60LOOP2: MOV DPTR,#TABMOV A,DBUF2MOVC A,@A+DPTRMOV P1,A ;显示十位数字SETB DSPCTRL1CLR DSPCTRL2SETB DSPCTRL3ACALL D1MSMOV A,DBUF3MOVC A,@A+DPTRMOV P1,A ;显示一位数字SETB DSPCTRL1SETB DSPCTRL2CLR DSPCTRL3ACALL D1MSMOV A,#0MOVC A,@A+DPTRMOV P1,ACLR DSPCTRL1SETB DSPCTRL2SETB DSPCTRL3ACALL D1MSDJNZ R5,LOOP2 ;循环DJNZ R4,LOOP1RET;***** 延时1ms子程序*****D1MS: MOV R7, #50 ;12M时钟下延时1MS DELAY0: MOV R6, #10DELAY1: DJNZ R6, DELAY1DJNZ R7, DELAY0RETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;(0-9)共阳段码表END。
无线温度测量设计报告(完整源代码)
摘要本系统由两部分组成,温度采集端和温度显示端,通过温度传感器采集温度显示在液晶屏或者数码管上,并将温度通过红外发送到红外接收头,然后解调解码数据,将温度显示出来,实现温度的无线测量关键字:STC89C52RC;红外;温度;调制;解调1.方案论证与选择1.1控制器的选择方案一:采用MSP430来处理Msp430是一种超低功耗的混合信号处理器,采用精简指令集,单个始终走起就可以执行一条指令,速度比51快得多。
因此用430来处理比较器返回来的数据是比较快捷的,但价格相对较贵。
430供电为3.3V,且操作起来较复杂。
方案二:采用51内核单片机单片机操作方便快捷,成本低,开发资源丰富,位寻址方便等,来的数据不需要很大的数据处理过程,51已完全能够胜方便,所以该装置采用STC89c52型的单片机来进行处理,本单片机一个机器一个时钟周期执行一条指令,无法解密,低功耗,超低价,高速,高可靠性。
1.2温度显示方式的选择与比较方案一:采用数码管显示数码管是由多个发光二极管封装在一起组成的8字型的器件,引线已在内部连接完成,只需引出他们的各个笔画和公共电极。
可以用来显示数字和字母。
方案二:采用LCD1602一种专门用来显示字母,数字,符号等的点阵型液晶模块。
它由若干个5X7或者5X11等的点阵字符位组成,每个点阵自字符位都可以显示一个字符,每位之间有一个点距的间隔,可以显示两行,每行16位数字或者字符。
1602采用标准的16脚借口,相比数码管,同样引脚的情况下,显示的内容更多,焊接更加方便快捷,所以我们选用显示部分选用LCD1602.1.3红外的编码和解码采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”,其波形如下图所示。
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。
单片机温度检测记录系统源程序
//**主程序模块**//#include<reg51.h> //包含头文件#include<intrins.h>sbit key0=P1^0; //定义按键sbit key1=P1^1;main(){unsigned char Sec_30=0; //控制温度采样频率unsigned char Temp=0; //当前温度unsigned char DateInit[7]={0x08,0x08,0x08,0x01,0x01,0x01,0x00}; unsigned char DateNow[8]={0}; //时钟读出当前时间unsigned char i,y=0; //坐标unsigned char nTotal=0; //总记录数统计unsigned char UartBuf[8];Initializelcd(); //初始化LCDClearScr(); //清屏GetDate(DateNow); //判断时钟是否已初始化if (DateNOW[0]!=0x08)SetDate(DateInit); //初始化时钟While(1){if (Sec_30++==30)Temp=ReadTemperature(); //大约30s采样一次Getdate(DateNow); //读取数字时钟for (i=0;i<3;i++) //显示年月日{OneChar(0,y,DateNow[i]>>4);y+=8;OneChar(0,y,DateNow[i]&0x0F);y+=8;if (i<2){OneChar(0,y,0x0B);Y+=8;}}for (i=4;i<7;i++){OneChar(2,y,DateNow[i]>>4);y+=8;OneChar(2,y,DateNow[i]&0x0F);Y+=8;if (i<6){OneChar(2,y,0x0A);Y+=8;}}V oid delay_3us(int i){int temp=0;while(temp<i) temp++;}Hanzi(4,0,2,hz_wendu); //显示温度OneChar(4,40,Temp/10);OneChar(4,40,Temp%10);if (!key0) //判断按键{delay_3us(600); //2ms延时去抖if (!key0) //如果按下0键存储数据{nTotal++;DateNow[7]=Temp; //构造存储数据结构,前7字节为时间,后一字节为温度pageWrite(nTotal<<3,DateNow);WriteSingleByte(0X00,nTotal); //在EEPROM第0页首地址存储总记录}}else if(!key1) //判断按键{delay_3us(600); //延时2ms去抖if (!key1) //如果按下1键取出数据{ReadRandom(0x00,&nTotal); //读取总数据for (i=0;i<nTotai;i++); //逐页取出数据发送{ReadSep(i<<3,UartBuf. 8);UartSend(Uartbuf, 8);}}for (i=0;i<100;i++) //1s延时delay_3us(1500);}}//**头文件LM6029.h**////LM6029是LCD显示模块extern void InitializeLCD(); //外部调用函数声明extern void ClearScr();extern void OneChar(unsigned char x,unsigned char y,unsigned char num);extern void Hanzi(unsigned char x,unsigned char y,unsigned char num,unsigned char *hz); extern unsigned char code hz_wendu[]; //声明字模为项目全局变量,可外部调用extern unsigned char code hz_cunchu[];extern unsigned char code char_code[];//**LM6029.C源程序**////程序;LM6029.C//功能;液晶显示#include<reg52.h>#include"intrins.h" //系统函数_nop_(void)的声明头文件sbit P3_7= P3^7; //端口定义sbit P3_6= P3^6;sbit P3_5= P3^5;sbit P3_4= P3^4;#define LcdDataport P2 //数据口定义#define _RD P3_6#define _RW P3_7#define RS P3_4#define _RES P3_5unsigned char code hz_wendu[]={0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,0x02 ,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00, /*"温*/0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,0x80 ,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00};/*"度*/ unsigned char code hz _cunchu[]={0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0xA0,0 xA0,0xA0,0xBF,0xA0,0xA0,0xA0,0xA0,0xBF,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0x80,/*"正*/ 0x00,0x04,0x04,0xC4,0x64,0x9C,0x87,0x84,0x84,0xE4,0x84,0x84,0x84,0x84,0x04,0x00,0x84,0 x82,0x81,0xFF,0x80,0xA0,0xA0,0xA0,0xA0,0xBF,0xA0,0xA0,0xA0,0xA0,0xA0,0x80,/*"在*/0x00,0x04,0x04,0xC4,0x64,0X1C,0x27,0x25,0x24,0x24,0xA4,0x64,0x24,0x04,0x00,0x00,0x84,0 x82,0x81,0xFF,0x80,0x82,0x82,0x82,0xC2,0x82,0xFF,0x82,0x82,0x82,0x82,0x80,/*"存*/0x40,0x20,0xD8,0x27,0x22,0xEC,0x00,0x24,0x24,0xA4,0x7F,0x24,0x34,0x2E,0x24,0x00,0x80, 0x80,0xFF,0x80,0xA0,0xFF,0xA2,0x91,0xFF,0xA5,0xA5,0xA5,0xA5,0xFF,0x80,0x80,};/*"储*/ unsigned char code char_code[]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0"*/ 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"1",*/ 0x00,0x70,0x08,0x08,0x08,0x08,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0X00,/*"2",*/ 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*"3",*/ 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*"4",*/ 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*"5",*/ 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0X00,/*"6",*/ 0x00,0x38,0x08,0x08,0xc8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*"7",*/ 0x00,0x70,0x88,0X08,0X08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8", */0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*"9",*/0X00,0X00,0X00,0XC0,0XC0,0X00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,/*":" */0X00,0X00,0X00,0X00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/*"/"*/ };//**延时DeLx*4个时钟周期**////形式参数:延时时间参数Delxunsigned int类型void LCD_Delay(){Delx=4;while(Delx--);}//**向LCD写命令Com**////形式参数:输出命令字Com,unsigned char 类型void LcdCommand(unsigned char Com){RS=0; //选择命令信号RS=0LcdDataport=Com; //LCD数据线输出显示_nop_();_nop_();_nop_(); //系统函数_nop_()声明在intrins.h中,//功能同汇编指令nop _WR=0 //写信号有效_nop_();_nop_();_nop_();_WR=1;}//**向LCD写数据dat**////形式参数:输出显示数据dat,unsigned char 类型void LcdDataWrite(unsigned char dat ){RS=1; //选择数据信号RS=1LcdDataPort = dat;_WR=0; //写信号有效_nop_();_nop_();_nop_();_WR=1;}//**初始化LCD**//void InitializeLCD(){_RES=0; //LCD复位LCD_Delay(2500); //延时约10ms_RES=1;LcdCommand(0xa0); //设置横向SEG输出方向为正方向(SEG0-SEG131) LcdCommand(0xc8); //设置纵向COM输出方向违反方向(COM63-COMO) LcdCommand(0xa2); //设置LCD驱动电压的变压比为1/9bias0LcdCommand(0x2f); //设置对比度电流量大小为101111LcdCommand(0x81); //对比度电流量调节模式设置LcdCommand(0x29); //内部电源操作设置VF=1LcdCommand(0X40); //DDRAM起始行地址设置为0LcdCommand(0xaf); //开显示}//**设置页地址**////形式参数:页地址page(取0~7),unsigned char 类型void SetPage( unsigned char page){page=page & 0x0f;page=page | 0xb0; //按照命令格式配置页地址的命令LcdCommand(page); //输出设置DDRAM页地址的命令}//**设置列地址**////形式参数:列地址Column(取值0~127),unsigned char 类型void SetColumn( unsigned char Column){unsigned char temp;temp=Column;Column=Column;Column=Column & 0x0f; //按照命令格式配置列地址低4位的命令Column=Column | 0x00;LcdCommand(Column); //输出设置DDRAM低4位列地址的命令字temp=temp>>4;Column=temp & 0x0f;Column=Column | 0x10; //按照命令格式配置设地址高4位命令字LcdCommand(Column) //输出设置DDRAM高4位列地址的命令字}//**写数据0清屏**//void ClearScr(){unsigned char i,j;for(i=0;i<8;i++) //8页(行)字符=64像素点{SetColumn() //设置行列地址Setpage(i);for(j=0;j<128;j++) //128列像素点lcdDataWrite(0x00);}}//**显示1个16*8点阵的字符**////形式参数:行地址x(0~7);列地址y(0~127);查字模表的索引numvoid Onechar(unsigned char x,unsigned char y,unsigned char num){unsigned char i;Setpage(x); //设置行坐标SetColumn(y); //设置列坐标num<<=4; //定位字模位置for(i=num;i<num+8;i++) //显示字模上半部分lcdDatawrite(char_code[i]);Setpage(x+1); //显示字模下半部分SetColumn(y);for(;i<num+16;i++)lcdDatawrite(char_code[i]);}//**显示1个16*16点阵的字符**////形式参数:行地址x(0~7);列地址y(1~127);显示汉字个数num(0~7)void hanzi(unsigned char x,unsigned char y,unsigned char num,unsigned char *hz){ unsigned char i,j,xpage,yColum;xpage=x; //初始化坐标yColum=y;for (j=0;j<num;j++) //显示num个汉字{Setpage(xpage); //设置行坐标SetColumn(yColum); //设置列坐标for(i=0;i<16;i++); //显示字模上半部分lcdDataWrite(hz[i+j<<5]);Setpage(xpage+1); //显示字模下半部分SetColumn(yColum);for(;i<32;i++)lcdDataWrite(hz[i+j<<5]);yColum+=16; //光标移至下一个字符位置}}//**头文件DS18B20.h**//exten unsigned char ReadTemperature(void);//**DS18B20.c程序源**////程序:DS18B20.c//功能:温度检测#include <reg52.h>#include "intrins.h"sbit DQ=P1^7;//**延时time*8时钟周期**//void delay(unsigned char time){unsigned char n;n=0;while(n<time)n++;return;}//**总线初始化复位**////返回值:复位状态, unsigned char 类型unsigned char Init_DS18B20(void){unsigned char x=0;DQ=1;delay(8);DQ=0;delay(85); //低电平480~960 usDQ=1;delay(14); //等待50~100 usx=DQ; //读取复位状态delay(20);return x;}//**读取1字节**////返回值:读取字节数据,unsigned char 类型unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat=0;for(i=8;i>0;i--){DQ=1; //启动前的恢复信号至少延时1 us delay(1);DQ=0; //启动信号至少延时15 us dat>>=1;DQ=1;delay(2); //DS18B20启动后至少等待15 us if(DQ) dat|=0x80;delay(4); //读完需要45 us的等待}return(dat);}//**写1字节**////形式参数:写字节数据dat,unsigned char 类型void WriteOneChar(unsigned char dat){unsigned char i=0;for(i=8;i>0;i--){DQ=0;delay(2); //DS18B20低电平保持15 usDQ=dat&0x01; //向总线写数据delay(5); //延时50 us 等待写完成DQ=1; //回复高电平,至少保持1 us dat>>=1; //下次写作准备,移位数据}delay(4); //延时30 us}//**读取温度值**////返回值:单字节温度值,unsigned char 类型unsigned char ReadTemperature(void){unsigned char tempL=0;unsigned char tempH=0;unsigned char temperature;Init_DS18B20(); /初始化WritOneChar(0xcc); //跳过ROM匹配,跳过读序列号的操作,可节省时间WritOneChar(0x44); //启动DS18B20进行温度转换delay(125);Init_DS18B20(); //开始操作前需要复位WritOneChar(0xcc);WritOneChar(0xbe); //读取温度寄存器的温度tempL=ReadOneChar(); //分别读取温度的低、高字节temp=ReadOneChar();temperature=(tempH*256)+tempL; //温度转换delay(200);return(temperature);}//**M24LC02.h头文件**//extern void WriteSingLeByte(unsigned char nAddr,unsigned char nValue);extern void PageWrite(unsigned char nAddr,unsigned char pBuf[]);extern void ReadRandom(unsigned char nAddr,unsigned char *nValue);extern void ReadSep(unsigned char nAddr,unsigned char nValue[],unsigned char nLen);//**M24LC02.c源程序**////功能:EEPROM读写程序#include <reg52.h>#include "intrins.h"sbit SDA = P1^6; // 数据线定义sbit SCL = P1^5; //时钟线定义#define Write_Code 0xA0 //定义写控制字0xA0#define Read_Code 0xA1 //定义度控制字0xA1void Delay(void) //**延时30us**//{unsigned char i;for(i=0;i<8;i++);}//**I2c基本函数**////**I2c总线起始**////时序说明:I2C总线的起始条件为SCL=1, SDA = 1-->0void I2CStart(void){unsigned char i;SDA = 1; //初始状态SDA和SCL均为高电平_nop_(); _nop_();SCL = 1;for(i=0; i<8; i++); //延时大于SDA + 0; //SCL高电平时,SDA下降沿启动数据传送for(i=0; i<8; i++); //延时大于4 usSCL = 0; //回复初始低电平状态_nop_(); _nop_();}//**I2C总线停止**////时序说明:I2C总线的结束条件为SCL =1, SDA = 0-->0void I2CStop(void){unsigned char i;SDA = 0;_nop_();_nop_();SCL= 1; //SCL高电平时,SDA上升沿信号结束数据传送for(i=0; i<8; i++); //延时大于4.7 usSDA = 1;Delay();SCL = 0; //SCL恢复初始低电平状态fou(i=0; i<16; i++);}。
水温监控系统源代码
毕业设计水温监控系统源代码TIMEL EQU 0E0HTIMEH EQU 0B1HTEMPHEAD EQU 36HBITST DATA 20HTIME1SOK BIT BITST.1TEMPONEOK BIT BITST.2 TEMPL DATA 26HTEMPH DATA 27HTEMPHC DATA 28HTEMPLC DATA 29HTEMPDIN B IT P2.7ORG 0000HLJMP STARTORG 00BHLJMP T0ITORG 100HSTART: MOV SP,#60H CLSMEM: MOV R0,#20HMOV R1,#60HCLSMEM1:MOV @R0,#00HINC R0DJNZ R1,CLSMEM1MOV TMOD,#00100001BMOV TH0,#TIMELMOV TL0,#TIMEHSJMP INITERROR: NOPLJMP STARTNOPINIT: NOPSETB ET0SETB TR0SETB EAMOV PSW,#00HCLR TEMPONEOKLJMP MAINT0IT: PUSH PSWMOV PSW,#10HMOV TH0,#TIMEHMOV TL0,#TIMELINC R7CJNE R7,#32H,T0IT1MOV R7,#00HSETB TIME1SOKT0IT1: POP PSWRETIMAIN:LCALL DISP1JNB TIME1SOK,MAINCLR TIME1SOKJNB TEMPONEOK,MAIN2LCALL READTEMP1LCALL CONVTEMPLCALL DISPBCDLCALL DISP1MAIN2: LCALL READTEMP SETB TEMPONEOKLJMP MAININITDS1820:SETB TEMPDINNOPNOPCLR TEMPDINMOV R6,#0A0HDJNZ R6,$MOV R6,#0A0HDJNZ R6,$SETB TEMPDINMOV R6,#32HDJNZ R6,$MOV R6,#3CH LOOP1820:MOV C,TEMPDINJC INITDS1820OUTDJNZ R6,LOOP1820MOV R6,#064HDJNZ R6,$SJMP INITDS1820RETINITDS1820OUT:SETB TEMPDINRETREADDS1820:MOV R7,#08HSETB TEMPDINNOPREADDS1820LOOP:CLR TEMPDINNOPNOPNOPSETB TEMPDINMOV R6,#07HDJNZ R6,$MOV C,TEMPDINMOV R6,#3CHDJNZ R6,$RRC ASETB TEMPDINDJNZ R7,READDS1820LOOPMOV R6,#3CHDJNZ R6,$RETWRITEDS1820:MOV R7,#08HSETB TEMPDINNOPWRITEDS1820LOP:CLR TEMPDINMOV R6,#07HDJNZ R6,$RRC AMOV TEMPDIN,CMOV R6,#34HDJNZ R6,$SETB TEMPDINDJNZ R7,WRITEDS1820LOPRETREADTEMP:LCALL INITDS1820MOV A,#0CCHLCALL WRITEDS1820MOV R6,#34HDJNZ R6,$MOV A,#44HLCALL WRITEDS1820MOV R6,#34HDJNZ R6,$RETREADTEMP1:LCALL INITDS1820MOV A,#0CCHLCALL WRITEDS1820MOV R6,#34HDJNZ R6,$MOV A,#0BEHLCALL WRITEDS1820MOV R6,#34HDJNZ R6,$MOV R5,#09HMOV R0,#TEMPHEADMOV B,#00H READTEMP2:LCALL READDS1820MOV @R0,AINC R0READTEMP21:LCALL CRC8CALDJNZ R5,READTEMP2MOV A,BJNZ READTEMPOUTMOV A,TEMPHEAD+0MOV TEMPL,AMOV A,TEMPHEAD+1MOV TEMPH,A READTEMPOUT:RETCONVTEMP:MOV A,TEMPHANL A,#80HJZ TEMPC1CLR CMOV A,TEMPLCPL AADD A,#01HMOV TEMPL,AMOV A,TEMPHCPL AADDC A,#00HMOV TEMPH,AMOV TEMPHC,#0BHSJMP TEMPC11TEMPC1: MOV TEMPHC,#0AH TEMPC11:MOV A,TEMPHCSW AP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FHMOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,AMOV A,TEMPLANL A,#0F0HSW AP AMOV TEMPL,AMOV A,TEMPHANL A,#0FHSW AP AORL A,TEMPLLCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSW AP AORL A,TEMPHCMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSW AP AORL A,TEMPLCMOV TEMPLC,AMOV A,R7JZ TEMPC12ANL A,#0FHSW AP AMOV R7,AMOV A,TEMPHCANL A,#0FHORL A,R7MOV TEMPHC,ATEMPC12:RETTEMPDOTTAB:DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H DB 06H,07H,08H,08H,09H,09HDISPBCD:MOV A,TEMPLCANL A,#0FHMOV 70H,AMOV A,TEMPLCSW AP AANL A,#0FHMOV 71H,AMOV A,TEMPHCANL A,#0FHMOV 72H,AMOV A,TEMPHCSW AP AANL A,#0FHMOV 73H,AMOV A,TEMPHCANL A,#0F0HCJNE A,#010H,DISPBCD0SJMP DISPBCD2 DISPBCD0:MOV A,TEMPHCANL A,#0FHJNZ DISPBCD2MOV A,TEMPHCSW AP AANL A,#0FHMOV 73H,#0AHMOV 72H,A DISPBCD2:RETDISP1: M OV R1,#70HMOV R5,#0FEH PLAY: MOV P0,#0FFHMOV A,R5MOV P2,AMOV A,@R1MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,AMOV A,R5JB ACC.1,LOOP5CLR P0.7LOOP5: LCALL DL1MS INC R1JNB ACC.3,ENDOUTRL AMOV R5,AAJMP PLAYENDOUT:MOV P0,#0FFHMOV P2,#0FFHRETTAB: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH DL1MS: MOV R6,#14HDL1: MOV R7,#19HDL2: DJNZ R7,DL2DJNZ R6,DL1RETHEX2BCD1:MOV B,#064HDIV ABMOV R7,AMOV A,#0AHXCH A,BSW AP AORL A,BRETCRC8CAL:PUSH ACCMOV R7,#08HCRC8LOOP1:XRL A,BRRC AMOV A,BJNC CRC8LOOP2XRL A,#18HCRC8LOOP2:RRC AMOV B,APOP ACCRR APUSH ACCDJNZ R7,CRC8LOOP1POP ACCRETEND。
温度测试系统+电路图++程序
1.1.2发挥部分(未实现)
(1)采用适当的控制方法,当设定温度突变(由40℃提高到60℃)时,减小系统的
调节时间和超调量。
(2)温度控制的静态误差≤0.2℃。
(3)在设定温度发生突变(由40℃提高到60℃)时,自动打印温度随时间变化的曲
线。
1.1.3说明
(1)如果采用单片机控制,允许使用已有的单片机最小系统板。
1.2.2系统各模块的最终方案
根据以上分析,结合器件和设备等因素,确定如下方案:
1. 采用AT89S52单片机作为控制器,分别对温度采集、LED显示。
2.温度测量模块采用数字温度传感器DS18B20。此器件经软件设置可以实现高分辨率测量。
3. 显示用LED数码管显示实时温度值。
图1.2.3系统基本框图
系统的基本框图如图1.2.3所示。CPU(AT89S52)首先写入命令给DS18B20,然后DS18B20开始转换数据,转换后通过89S52来处理数据。数据处理后的结果就显示到数码管上。
2.硬件设计与实现
本系统的执行方法是循环查询执行的,键盘扫描也是用循环查询的办法,由于本系统对实时性要求不是很高,所以没有用到中断方式来处理。
算法核心:首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LS Byte)取反加一变成原码。处理过后把DS18B20的温度Copy到单片机的RAM中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位的BCD码存入RAM中。
2.1.2显示部分
测量仪器:空调温度显示屏
测量结果如表4.2.1所示:
方案二:采用模拟运算放大器组成PID控制系统。但要附加显示、温度设定等功能,要附加许多电路,稍显麻烦。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sbit clock=P2^4;
sbit st=P2^5;
sbit eoc=P2^6;
sbit oe=P2^7;
void disp();
//volatile float adc;
/**************************************************************
i10=i2/10;
//i1=i2%10;
i1=ห้องสมุดไป่ตู้1002%10;
// i10=i1001%100/10; //需要分开写
// i1=i1001%100%10; //需要分开写
/*i100=adc/100;//调试用
函数功能:主函数
**************************************************************/
void main(void)
{
EA=1; //开总中断
ET0=1; //定时器T0中断允许
{
st=0;
for(a=0;a<5;a++);
st=1;
for(a=0;a<5;a++);
st=0;//启动AD转换
for(a=0;a<5;a++);
while(eoc==1);//AD转换结束,才执行下面的操作
oe=1;//输出允许控制端有效
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{clock=~clock;
}
P0=led[i10];
P2_2=0;
P0_7=1;
for(j=0;j<500;j++);
P2_2=1;//显示十位
P0=led[i100];
P0_7=0;
P2_1=0;
for(j=0;j<500;j++);
P2_1=1;//显示百位
}
/**************************************************************
adc=P1;
i1001=20.5*adc ;
i1002=i1001-2732;
// i1003=i1002 ;
i100=i1002/100;
i2=i1002 %100;
#include<reg51.h> // 包含51单片机寄存器定义的头文件
unsigned char adc, i1000, i100,i10,i1, i,i2,a;
unsigned int i1001,i1002;
//float i1001,i1002,i1003;
unsigned char code led[]={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f};//定义0-9共阴极显示码
sbit h_alm=P3^0;
sbit l_alm=P3^1;
sbit sound=P3^7;
sbit P0_7=P0^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
ET1=1;
TMOD=0x12; //使用定时器T0的模式2,定时器T0模式1
TH0=245;
TL0=245;
TH1=0XFC;
TL1=0X18;
TR0=1; //启动定时器T0
while(1)
i2=adc%100;
i10=i2/10;
i1=i2%10; */
disp();
}
}
void disp()
{unsigned int j;
P0=led[i1];
P2_3=0;
P0_7=0;
for(j=0;j<500;j++);
P2_3=1;//显示个位
函数功能:定时器T0的中断服务程序,为ADC0808提供时钟
**************************************************************/
void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数