历史上的今天
今天是:2024年12月22日(星期日)
2020年12月22日 | 单片机微波炉控制系统
2020-12-22 来源:51hei

单片机源程序如下:
Wendu.h (头文件)
#define jump_ROM 0xCC//ds18B20定义
#define start 0x44
#define read_EEROM 0xBE
void delay(unsigned int N);
void delay_1();
unsigned char Reset(void);//复位DS18B20
unsigned char read_bit(void);//从DS18B20读一个位值
void write_bit(unsigned char bitval);//向DS18B20写一位
unsigned char read_byte(void);//从DS18B20读一个字节
void write_byte(unsigned char val);// 向DS18B20写一个字节
Wendu.c (Wendu.h 的实现)
#include #include"wendu.h" sbit DQ = P2^3; //DS18B20数据口 /******************************************************************** * 名称 : delay() * 功能 : 延时,延时时间大概为140US。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delay_1() { int i,j; for(i=0; i<=10; i++) for(j=0; j<=2; j++); } /******************************************************************** * 名称 : delay() * 功能 : 延时函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delay(unsigned int N) { int i; for(i=0; i /******************************************************************** * 名称 : Reset() * 功能 : 复位DS18B20 * 输入 : 无 * 输出 : 无 ***********************************************************************/ unsigned char Reset(void) { unsigned char deceive_ready; DQ = 0; delay(29); DQ = 1; delay(3); deceive_ready = DQ; delay(25); return(deceive_ready); } /******************************************************************** * 名称 : read_byte() * 功能 : 从DS18B20读一个字节 * 输入 : 无 * 输出 : 从DS18B20读到的值 ***********************************************************************/ /******************************************************************** * 名称 : read_bit() * 功能 : 从DS18B20读一个位值 * 输入 : 无 * 输出 : 从DS18B20读出的一个位值 ***********************************************************************/ unsigned char read_bit(void) { unsigned char i; DQ = 0; DQ = 1; for(i=0; i<3; i++); return(DQ); } /******************************************************************** * 名称 : write_bit() * 功能 : 向DS18B20写一位 * 输入 : bitval(要对DS18B20写入的位值) * 输出 : 无 ***********************************************************************/ void write_bit(unsigned char bitval) { DQ=0;if(bitval==1) DQ=1; delay(5); DQ=1; } /******************************************************************** * 名称 : read_byte() * 功能 : 从DS18B20读一个字节 * 输入 : 无 * 输出 : 从DS18B20读到的值 ***********************************************************************/ unsigned char read_byte(void) { unsigned char i,m,receive_data; m = 1; receive_data = 0; for(i=0; i<8; i++) { if(read_bit()) { receive_data = receive_data + (m << i); } delay(6); } return(receive_data); } /******************************************************************** * 名称 : write_byte() * 功能 : 向DS18B20写一个字节 * 输入 : val(要对DS18B20写入的命令值) * 输出 : 无 ***********************************************************************/ void write_byte(unsigned char val) { unsigned char i,temp; for(i=0; i<8; i++) { temp = val >> i; temp = temp & 0x01; write_bit(temp); delay(5); } } 主函数的实现 #include #include"wendu.h" sbit key1=P1^4; //矩阵键盘定义 sbit key2=P1^5; sbit key3=P1^6; sbit key4=P1^7; sbit S1=P3^2; //按键定义 sbit S2=P3^3; sbit S3=P3^4; sbit RS=P2^5; //12864定义 sbit RW=P2^6; sbit E=P2^7; sbit BEEP = P2^0; //蜂鸣器定义 sbit Hot=P2^1; unsigned char TMPH,TMPL,key41=1,Temp,T; //温度常量 unsigned int count1,count2,count3; //时间常量 unsigned int countor,m,s; //计时常量 unsigned char button,sound; //其他常量 unsigned char code table[]={"0123456789"}; /******************子程序说明********************/ void delay_1ms(unsigned int i); //1ms延时 void delay(); //延时子程序 void beep(); //响铃程序 void set(char n); //12864写指令子程序 void weizhi(int hang,int lie); //12864字符显示位置 void wdata(unsigned char d); //往12864写数据,单个字符 void wsdata(char tab[]); //往12864写数据,字符串 void scan(); //矩阵键盘第一列扫描,确定所输入的时间 void setTemp(); //温度设定,采用扫描独立键盘来确定输入 void setTime(); //时间设定 void showTime(); //显示时间 void chu12864(); //初始化12864 void chuDS(); //初始化DS18B20 /********************主程序*************************/ void main() //主函数 { chu12864();//12864的初始化 setTemp(); setTime(); while(1) { chuDS(); if(Temp==T) TR0=1; showTemp(); showTime(); if(sound==1) beep(); } } /******************************************/ void time0(void) interrupt 1 using 1 //定时中断程序 { countor++; if(countor==20) { if(m==0&&s==0) //倒计时 { m=0; s=0; sound=1; Hot=0; TR0=0; } else if(s==0) { m--;s=59;} else s--; countor=0; } TH0=(65536-50000)/256; TL0=(65536-50000)%256; } /************************************************/ void delay_1ms(unsigned int i) //1ms延时 { unsigned char x,j; for(j=0;j for(x=0;x<=148;x++); } /************************************************/ void delay() //延时子程序 { int a,b; for(a=0;a<100;a++) for(b=0;b<10;b++); }/************************************************/ void beep() //响铃程序 { unsigned char i; for (i=0;i<100;i++) { delay_1ms(1); BEEP=!BEEP; //BEEP取反 } BEEP=1; //关闭蜂鸣器 } /************************************************/ void set(char n) //12864写指令子程序 { P0=n; RS=0; RW=0; E=0; delay(); E=1; delay(); } /******************************************/ void weizhi(int hang,int lie) //12864字符显示位置 { char a; if(hang==1) a=0x80; if(hang==2) a=0xc0; a=a+lie-1; set(a); } /******************************************/ void wdata(unsigned char d) //往12864写数据,单个字符 { RS=1; RW=0; P0=d; E=0; delay(); E=1; delay(); } /******************************************/ void wsdata(char tab[]) //往12864写数据,字符串 { int i=0; RS=1; RW=0; while(tab[i]!='




