首先是仿真图,文件中含有仿真软件proteus8.10文件,因此需要8.10的版本才可以
电路图如下:
然后程序采用模块化封装,方便修改和调用以及学习,程序图如下:
然后最后仿真的效果图:
单片机源程序如下:- #include <main.h>
- #include "Time.h"
- #include "LCD1602.h"
- #include "DS18B20.h"
- void Delayms(unsigned int xms);
- void DS18B20_service();
- void Int01_init();
- float Temp;
- unsigned int shang[]={0x33,0x22,0x66,0x44,0xCC,0x88,0x99,0x11};//正
- unsigned int xia []={0x33,0x11,0x99,0x88,0xcc,0x44,0x66,0x22};//反
- unsigned int shang1[]={0x03,0x02,0x06,0x04,0x0C,0x08,0x09,0x01};
- unsigned char Flag=0,flag1=0,flag2=0;
- void main()
- {
- uchar i;
- Ds18b20_ConvertTemperature(); //上电先转换一次温度,防止第一次读数据错误
- Delayms(1000); //等待转换完成
- LCD_init();
- LCD_dis_string(1,1,"Temperature:");
- Int01_init();
- Timer0_Init();
- Timer1_Init();
- while(1)
- {
- switch(flag1)
- {
- case 0:
-
- break;
- case 1:
- if(Temp<20)
- {
- P2_3=1;
- P2_4=1;
- P2_5=1;
- }
- else if(Temp>=20 && Temp<=25)
- {
- P2_3=0;
- P2_4=1;
- P2_5=1;
- if(Flag==1)//正
- {
- P1=xia[i++];
- i%=8;
- Flag=0;
- }
- }
- else if(Temp>25 && Temp<30)
- {
- P2_3=1;
- P2_4=1;
- P2_5=1;
- }
- else if(Temp>=30 && Temp<=35)
- {
- P2_3=1;
- P2_4=0;
- P2_5=1;
- if(Flag==1)//反
- {
- P1=shang1[i++];
- i%=8;
- Flag=0;
- }
- }
- else if(Temp>35 && Temp<=37)
- {
- P2_3=1;
- P2_4=1;
- P2_5=1;
- }
- else if(Temp>37)
- {
- P2_3=1;
- P2_4=1;
- P2_5=0;
- if(Flag==1)//反
- {
- P1=shang[i++];
- i%=8;
- Flag=0;
- }
- }
- break;
- }
-
- }
- }
- void Int0_interrupt() interrupt 0 //每进一次中断就是1ms
- {
- flag1=!flag1;
- }
- void Int1_interrupt() interrupt 2 //每进一次中断就是1ms
- {
- if(Temp>37){flag2=!flag2;}
- }
- void Timer0_Routine() interrupt 1 //每进一次中断就是1ms
- {
- static unsigned int T0Count,time1=0;
- TL0 = 0x18; //设置定时初值65536
- TH0 = 0xFC; //设置定时初值
- T0Count++;
- if(T0Count>=80)//80就是步进电机的转速,80ms换拍
- {
- T0Count=0;
- Flag=1;
- }
- if(flag2==1)
- {
- time1++;
- if(time1>=12500)
- {
- time1=0;
- flag1=0;
- }
- }
- }
- void Timer1_Routine() interrupt 3
- {
- static unsigned int T1Count;
- TL1 = 0x18; //设置定时初值
- TH1 = 0xFC; //设置定时初值
- T1Count++;
- if(T1Count>=300)
- {
- T1Count=0;
- switch (flag1)
- {
- case 0:break;
- case 1:DS18B20_service();break;
- }
-
- }
- }
- void Delayms(unsigned int xms)
- {
- unsigned char i, j;
- while(xms--)
- {
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- void DS18B20_service()
- {
- Ds18b20_ConvertTemperature(); //转换温度
- Temp=DS18B20_ReadTemperature(); //读取温度
- if(Temp<0) //如果温度小于0
- {
- LCD_dis_char(2,1,'-'); //显示负号
- Temp=-Temp; //将温度变为正数
- }
- else //如果温度大于等于0
- {
- LCD_dis_char(2,1,'+'); //显示正号
- }
- LCD_dis_number(2,2,Temp,3); //显示温度整数部分
- LCD_dis_char(2,5,'.'); //显示小数点
- LCD_dis_number(2,6,(unsigned long)(Temp*10000)%10000,1);//显示温度小数部分
- }
- void Int01_init()
- {
- IT0=1;
- IT1=1;
- EX0=1;
- EX1=1;
- EA=1;
- }
复制代码 仿真只能用proteus8.10这个版本 其他版本都会报错
源码与仿真文件的的附件如下:
01温度步进电机.rar
(133.55 KB, 下载次数: 34)
|