这是我之前做过的微波炉单片机课程设计,用了大概一周的时间
我是用protues做的仿真
附件里面有文档,源码和protues仿真的实验
希望和大家多多交流
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- 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<reg52.h>
- #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<N; 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<reg52.h>
- #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<i;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]!='\0') //不是结束符时执行
- {
- P0=tab[i];
- E=0;
- delay();
- E=1;
- delay();
- i++;
- }
- }
- /******************************************/
- void scan() //矩阵键盘第一列扫描,确定所输入的时间
- {
- P1=0xfe;
- if(key1==0)
- { delay();
- if(key1==1)
- { count1++;
- beep();
- }
- }
- if(key2==0)
- { delay();
- if(key2==1)
- {
- count2++;
- beep();
- }
- }
- if(key3==0)
- { delay();
- if(key3==1)
- {
- count3++;
- beep();
- }
- }
- if (key4==0)
- {
- key41=0;
- beep();
- }
- }
- /******************************************/
- void setTemp() //温度设定,采用扫描独立键盘来确定输入
- {
- while(1)
- {
- P3=0xff;
- if(S1==0) button=1; //20度
- if(S2==0) button=2; //30度
- if(S3==0) button=3; //50度
- if(button==1)
- {
- T=20;
- weizhi(2,5);
- wdata(table[2]);
- delay_1ms(1);
- weizhi(2,6);
- wdata(table[0]);
- }
- if(button==2)
- {
- T=30;
- weizhi(2,5);
- wdata(table[3]);
- delay_1ms(1);
- weizhi(2,6);
- wdata(table[0]);
- }
- if(button==3)
- {
- T=50;
- weizhi(2,5);
- wdata(table[5]);
- delay_1ms(1);
- weizhi(2,6);
- wdata(table[0]);
- }
- if(button==1||button==2||button==3)
- break;
- }
- }
- /****************************************/
- void setTime() //时间设定
- {
- while(1)
- {
- scan();
- if(key41==0)
- break;
- }
- m=(1*count1)+(2*count2)+(5*count3); //计算所设定的时间
- Hot=1;
- }
- void showTime() //显示时间
- {
- weizhi(2,11);
- wdata(table[m/10]); //显示分
- delay_1ms(1);
- weizhi(2,12);
- wdata(table[m%10]);
- delay_1ms(1);
- weizhi(2,13);
- wdata(':');
- delay_1ms(1);
- weizhi(2,14);
- wdata(table[s/10]); //显示秒
- delay_1ms(1);
- weizhi(2,15);
- wdata(table[s%10]);
- delay_1ms(1);
- }
- /****************************************/
- void showTemp() //显示温度
- {
- delay_1ms(1);
- weizhi(1,13);
- wdata(table[Temp/10]);
- delay_1ms(1);
- weizhi(1,14);
- wdata(table[Temp%10]);
- delay_1ms(1);
- }
- /****************************************/
- void chu12864() //初始化12864
- {
- set(0x01); //清屏
- set(0x38); //显示模式
- set(0x0c); //显示开
- set(0x06); //光标设置
- weizhi(1,4); //定义字符显示位置 第一行,第四列
- wsdata("Welcome"); //显示开机欢迎语
- weizhi(2,3);
- wsdata("T=");
- weizhi(2,7);
- wsdata("oC");
- IE=0x82; //设定定时器工作方式
- TMOD=0X01;
- TH0=(65536-50000)/256; //设定计时器的定时时长50MS
- TL0=(65536-50000)%256;
- button=0; //初始化参数
- count1=0;
- count2=0;
- count3=0;
- Hot=0;
- m=0;
- s=0;
- T=0;
- }
- void chuDS() //初始化DS18B20
- {
- Reset();
- write_byte(jump_ROM);
- write_byte(start);
- Reset();
- write_byte(jump_ROM);
- write_byte(read_EEROM);
- TMPL = read_byte();
- TMPH = read_byte();
- Temp = TMPL / 16 + TMPH * 16;
- delay_1ms(1);
- }
复制代码
全部资料51hei下载地址:
仿真 程序.zip
(82.38 KB, 下载次数: 97)
|