你這程序大量采用dmsec()軟件延時,哪能正常工作?給你改好了,你試試。
智能溫控風扇單片機仿真設計+仿真.zip
(118.09 KB, 下載次數: 24)
2019-3-28 17:32 上傳
點擊文件名下載附件
無標題.jpg (220.44 KB, 下載次數: 53)
下載附件
2019-3-28 17:33 上傳
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DS=P1^6;
- sbit key1=P3^6;
- sbit key2=P3^7;
- sbit dianji=P1^0;
- uchar code smgdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9數碼管段碼
- uchar code smgwei[]={0xef,0xdf,0xbf,0x7f}; //1~4數碼管位碼
- uchar TempData[4];//溫度顯示值緩存
- uchar TempData1[3];//設定顯示值緩存
- uchar set=25; //設定值變量
- uint count=0; //顯示設定值計數延時變量
- bit Flag=0; //讀時間標志
- bit Allow=0;//設置狀態(tài)標志
- void delay_us(uchar us)//約2us延時函數
- {
- while(--us);
- }
- void delay(uchar z)//約1ms延時函數
- {
- while(z--)
- {
- delay_us(245);
- delay_us(245);
- }
- }
- void display() //4個數碼管顯示
- {
- static uchar i;
- P0=0x00; //消隱
- if(Allow==1)
- {
- switch(i) //顯示設定值
- {
- case 0: i++; break;
- case 1: P2=smgwei[i];P0=TempData1[i];i++; break;
- case 2: P2=smgwei[i];P0=TempData1[i];i=0; break;
- }
- }
- else
- {
- switch(i) //顯示溫度值
- {
- case 0: P2=smgwei[i];P0=TempData[i];i++; break;
- case 1: P2=smgwei[i];P0=TempData[i];i++; break;
- case 2: P2=smgwei[i];P0=TempData[i];i++; break;
- case 3: P2=smgwei[i];P0=TempData[i];i=0; break;
- }
- }
- }
- //讀一個字節(jié)
- uchar read_byte()
- {
- uchar i,dat;
- for(i=0;i<8;i++)
- {
- DS=0;
- dat>>=1;
- DS=1;
- if(DS)
- dat|=0x80;
- delay_us(25);
- }
- return (dat);
- }
- //寫一個字節(jié)
- void write_byte(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DS=0;
- DS=dat&0x01;
- delay_us(25);
- DS=1;
- dat>>=1;
- }
- }
- //單總線初始化時序
- bit ds_init()
- {
- bit i;
- DS=1;
- delay_us(5);
- DS=0;
- delay_us(200);
- delay_us(200);
- DS=1;
- delay_us(50);
- i=DS;
- delay_us(25);
- return (i);
- }
- uint ReadTemperature()
- {
- uint H,i;
- uchar L;
- ds_init();//初始化溫度傳感器
- write_byte(0xcc);//發(fā)送跳躍ROM指令
- write_byte(0x44);//發(fā)送溫度轉換指令
- delay(10);
- ds_init();//初始化溫度傳感器
- write_byte(0xcc);//發(fā)送跳躍ROM指令
- write_byte(0xbe);//讀取溫度傳感器暫存器的值
- L=read_byte();
- H=read_byte();
- H<<=8;
- i=L+H;
- return(i);
- }
- /*************************
- 按鍵掃描程序
- *************************/
- void key_scan()
- {
- static bit key1_sign,key2_sign; //按鍵自鎖標志變量
- static uint count1,count2; //消抖計數變量
- if(!key1) //檢測按鍵1按下
- {
- if((++count1>=100)&&(key1_sign==0))//檢測消抖計數與按鍵1自鎖標志
- {
- key1_sign=1; //按鍵1自鎖標志置1
- Allow=1; //顯示設定值
- count=0; //顯示設定值計數延時清0
- if(set<90)
- set++; //調整設定值變量自+1
- TempData1[1]=smgdu[set/10];
- TempData1[2]=smgdu[set%10];
- }
- }
- else
- {
- key1_sign=0; //按鍵1自鎖標志清0
- count1=0; //消抖計數count1清0
- }
- if(!key2) //檢測按鍵2按下
- {
- if((++count2>=100)&&(key2_sign==0))//檢測消抖計數與按鍵1自鎖標志
- {
- key2_sign=1; //按鍵1自鎖標志置1
- Allow=1; //顯示設定值
- count=0; //顯示設定值計數延時清0
- if(set>20)
- set--; //調整設定值變量自-1
- TempData1[1]=smgdu[set/10];
- TempData1[2]=smgdu[set%10];
- }
- }
- else
- {
- key2_sign=0; //按鍵1自鎖標志清0
- count2=0; //消抖計數count1清0
- }
- }
- void Timer0Init() //2毫秒@12.000MHz
- {
- TMOD= 0x01; //設置定時器模式
- TL0 = 0x30; //設置定時初值
- TH0 = 0xF8; //設置定時初值
- TR0 = 1; //定時器0開始計時
- EA=1;
- ET0=1;
- }
- void main()
- {
- uint temp;
- uchar TempH,TempL;
- bit negative;//負數標志
-
- Timer0Init(); //初始化定時器
- while(1)
- {
- if(Flag==1)
- {
- Flag=0;
- temp=ReadTemperature();//讀取溫度
- if(temp&0x8000)
- {
- negative=1; //負號標志
- temp=~temp; //取反加1
- temp +=1;
- }
- else negative=0; //正數
-
- TempH=temp>>4; //分解為整數
- TempL=temp&0x0F; //分解為小數
- TempL=TempL*6/10; //保留一位小數
-
- if(negative==1)
- TempData[0]=0x40;//顯示負號
- else if(TempH/100==0)//小于100
- TempData[0]=0; //百位消隱
- else
- TempData[0]=smgdu[TempH/100]; //顯示百位溫度
-
- if((TempH/100==0)&&((TempH%100)/10==0))
- TempData[1]=0; //十位消隱
- else
- TempData[1]=smgdu[(TempH%100)/10]; //顯示十位溫度
- TempData[2]=smgdu[(TempH%100)%10]|0x80;//顯示個位溫度,帶小數點
- TempData[3]=smgdu[TempL]; //顯示小數溫度1位
- }
- if(TempH>=set) //溫度超過設定溫度,電機啟動
- dianji=0;
- else dianji=1;
- key_scan();
- }
- }
- void timer0int() interrupt 1 //定時器,定時2ms
- {
- static uchar num;
- TL0 = 0x30; //設置定時初值
- TH0 = 0xF8; //設置定時初值
- display();
- if(++num>=250) //延時500ms讀溫度數值
- {
- num=0;
- Flag=1;
- }
- if(Allow==1)
- {
- if(++count>=1000) //顯示設定值計數延時
- {
- Allow=0; //恢復正常顯示
- count=0; //計數清0
- }
- }
- }
復制代碼
|