首先是仿真圖,文件中含有仿真軟件proteus8.10文件,因此需要8.10的版本才可以
電路圖如下:
仿真圖.jpg (404.48 KB, 下載次數: 42)
下載附件
2022-6-28 13:01 上傳
然后程序采用模塊化封裝,方便修改和調用以及學習,程序圖如下:
程序源碼.jpg (102.64 KB, 下載次數: 45)
下載附件
2022-6-28 13:03 上傳
然后最后仿真的效果圖:
仿真1.jpg (417.84 KB, 下載次數: 38)
下載附件
2022-6-28 13:03 上傳
單片機源程序如下:- #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)
2022-6-28 13:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|