河南理工大学毕业论文 第 36 页 共 52 页
系统源程序
#include #include
#define wlcdcom XBYTE[0xf8ff] #define rlcdcom XBYTE[0xfcff] #define wlcddata XBYTE[0xfaff] #define rlcddata XBYTE[0xfeff]
typedef unsigned char byte; typedef unsigned int word;
unsigned char code tab0[]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};
unsigned char code tab1[]={'T','h','e',' ','p','r','o','g','r','a','m','m','e',' ','i','s',0x00}; unsigned char code tab2[]={'d','e','s','i','g','n','e','d',' ','b','y',' ','h','i','f','i',0x00}; unsigned char code tab3[]={'0','1','2','3','4','5','6','7','8','9'};
unsigned char code tab4[16][4]={{'0','0','0','0'},{'0','6','2','5'},{'1','2','5','0'},{'1','8','7','5'}, {'2','5','0','0'},{'3','1','2','5'},{'3','7','5','0'},{'4','3','7','5'},
{'5','0','0','0'},{'5','6','2','5'},{'6','2','5','0'},{'6','8','7','5'}, {'7','5','0','0'},{'8','1','2','5'},{'8','7','5','0'},{'9','3','7','5'}};
char
Unsigned
temp[9],time[9],high[7]={'H','T','0','0','.','0',0x00},low[7]={'L','T','0','0','.','0',0x00}; unsigned char h[3],l[3],nonce_t[3]; sbit busy=ACC^7; sbit DQ=P3^2;
sbit time_set=P1^0; sbit temp_set=P1^1; sbit inc=P1^2; sbit dec=P1^3; sbit bell=P1^6; sbit fan=P1^4; sbit heater=P1^5; sbit l_led=P2^6; sbit h_led=P2^7;
河南理工大学毕业论文 第 37 页 共 52 页
unsigned int b,c;
unsigned char t,tf,set_coun,temp_coun; unsigned char hour,minute,second; bit time_flag,set_flag,temp_flag; bit t_c,bell_flag,ring_flag; bit flag1;flag2;
//查询忙标志位// void wait(void) { do
ACC=rlcdcom;
while(busy); }
//LCD初始化//
void lcd_init(void) { wlcdcom=0x38; wait();
wlcdcom=0x06; wait();
wlcdcom=0x0c; wait();
wlcdcom=0x01; wait(); }
//LCD驱动
void lcd_display(c_a,pos) unsigned char pos; unsigned char *c_a; { wlcdcom=pos; wait();
while(*c_a!=0x00) { wlcddata=*c_a;
河南理工大学毕业论文 第 38 页 共 52 页
wait(); } //延时
void delay(word useconds) {
for(;useconds>0;useconds--); } //复位
byte ow_reset(void) {
byte presence; DQ = 0; delay(29); DQ = 1; delay(3); presence = DQ; delay(25); return(presence); }
//从 1-wire 总线上读取一个字节 byte read_byte(void) { byte i; byte v_alue = 0; for (i=8;i>0;i--) {
v_alue>>=1; DQ = 0; DQ = 1;
c_a++; }
河南理工大学毕业论文 第 39 页 共 52 页
delay(1);
if(DQ) v_alue|=0x80; delay(6); }
return(v_alue); }
//向 1-WIRE 总线上写一个字节 void write_byte(char val) { byte i;
for (i=8; i>0; i--) { DQ = 0; DQ = val&0x01; delay(5); DQ = 1; val=val/2; } delay(5); }
//读取温度
unsigned int Read_Temperature(void) { union{ byte c[2]; unsigned int x; }temp; ow_reset(); write_byte(0xCC); write_byte(0xBE); temp.c[1]=read_byte(); temp.c[0]=read_byte(); ow_reset();
河南理工大学毕业论文 第 40 页 共 52 页
write_byte(0xCC); write_byte(0x44); return temp.x; }
//BCD码转换
void bcd_transform(void) { unsigned char b,c,n; unsigned int; unsigned int tm,a; tm=Read_Temperature(); a=tm>>4;
c=(unsigned char)a&0x00ff; n=c/100; b=c0; temp[0]=tab3[n]; n=b/10; temp[1]=tab3[n]; nonce_t[0]=n; n=b; temp[2]=tab3[n]; nonce_t[1]=n; temp[3]='.';
a=(unsigned char)tm&0x000f; for(b=0;b<=4;b++) { temp[b+4]=tab4[a][b]; }
nonce_t[2]=tab0[a]; temp[8]=0x00; }
//定时器0中断服务程序 void time0() interrupt 1 using 1 { TH0=0x3c; TL0=0xa8;
//整数部分 //小数部分