你這程序大量采用dmsec()軟件延時(shí),哪能正常工作?給你改好了,你試試。
智能溫控風(fēng)扇單片機(jī)仿真設(shè)計(jì)+仿真.zip
(118.09 KB, 下載次數(shù): 24)
2019-3-28 17:32 上傳
點(diǎn)擊文件名下載附件
無標(biāo)題.jpg (220.44 KB, 下載次數(shù): 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數(shù)碼管段碼
- uchar code smgwei[]={0xef,0xdf,0xbf,0x7f}; //1~4數(shù)碼管位碼
- uchar TempData[4];//溫度顯示值緩存
- uchar TempData1[3];//設(shè)定顯示值緩存
- uchar set=25; //設(shè)定值變量
- uint count=0; //顯示設(shè)定值計(jì)數(shù)延時(shí)變量
- bit Flag=0; //讀時(shí)間標(biāo)志
- bit Allow=0;//設(shè)置狀態(tài)標(biāo)志
- void delay_us(uchar us)//約2us延時(shí)函數(shù)
- {
- while(--us);
- }
- void delay(uchar z)//約1ms延時(shí)函數(shù)
- {
- while(z--)
- {
- delay_us(245);
- delay_us(245);
- }
- }
- void display() //4個(gè)數(shù)碼管顯示
- {
- static uchar i;
- P0=0x00; //消隱
- if(Allow==1)
- {
- switch(i) //顯示設(shè)定值
- {
- 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;
- }
- }
- }
- //讀一個(gè)字節(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);
- }
- //寫一個(gè)字節(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;
- }
- }
- //單總線初始化時(shí)序
- 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ā)送溫度轉(zhuǎn)換指令
- 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; //按鍵自鎖標(biāo)志變量
- static uint count1,count2; //消抖計(jì)數(shù)變量
- if(!key1) //檢測(cè)按鍵1按下
- {
- if((++count1>=100)&&(key1_sign==0))//檢測(cè)消抖計(jì)數(shù)與按鍵1自鎖標(biāo)志
- {
- key1_sign=1; //按鍵1自鎖標(biāo)志置1
- Allow=1; //顯示設(shè)定值
- count=0; //顯示設(shè)定值計(jì)數(shù)延時(shí)清0
- if(set<90)
- set++; //調(diào)整設(shè)定值變量自+1
- TempData1[1]=smgdu[set/10];
- TempData1[2]=smgdu[set%10];
- }
- }
- else
- {
- key1_sign=0; //按鍵1自鎖標(biāo)志清0
- count1=0; //消抖計(jì)數(shù)count1清0
- }
- if(!key2) //檢測(cè)按鍵2按下
- {
- if((++count2>=100)&&(key2_sign==0))//檢測(cè)消抖計(jì)數(shù)與按鍵1自鎖標(biāo)志
- {
- key2_sign=1; //按鍵1自鎖標(biāo)志置1
- Allow=1; //顯示設(shè)定值
- count=0; //顯示設(shè)定值計(jì)數(shù)延時(shí)清0
- if(set>20)
- set--; //調(diào)整設(shè)定值變量自-1
- TempData1[1]=smgdu[set/10];
- TempData1[2]=smgdu[set%10];
- }
- }
- else
- {
- key2_sign=0; //按鍵1自鎖標(biāo)志清0
- count2=0; //消抖計(jì)數(shù)count1清0
- }
- }
- void Timer0Init() //2毫秒@12.000MHz
- {
- TMOD= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0x30; //設(shè)置定時(shí)初值
- TH0 = 0xF8; //設(shè)置定時(shí)初值
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- EA=1;
- ET0=1;
- }
- void main()
- {
- uint temp;
- uchar TempH,TempL;
- bit negative;//負(fù)數(shù)標(biāo)志
-
- Timer0Init(); //初始化定時(shí)器
- while(1)
- {
- if(Flag==1)
- {
- Flag=0;
- temp=ReadTemperature();//讀取溫度
- if(temp&0x8000)
- {
- negative=1; //負(fù)號(hào)標(biāo)志
- temp=~temp; //取反加1
- temp +=1;
- }
- else negative=0; //正數(shù)
-
- TempH=temp>>4; //分解為整數(shù)
- TempL=temp&0x0F; //分解為小數(shù)
- TempL=TempL*6/10; //保留一位小數(shù)
-
- if(negative==1)
- TempData[0]=0x40;//顯示負(fù)號(hào)
- 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;//顯示個(gè)位溫度,帶小數(shù)點(diǎn)
- TempData[3]=smgdu[TempL]; //顯示小數(shù)溫度1位
- }
- if(TempH>=set) //溫度超過設(shè)定溫度,電機(jī)啟動(dòng)
- dianji=0;
- else dianji=1;
- key_scan();
- }
- }
- void timer0int() interrupt 1 //定時(shí)器,定時(shí)2ms
- {
- static uchar num;
- TL0 = 0x30; //設(shè)置定時(shí)初值
- TH0 = 0xF8; //設(shè)置定時(shí)初值
- display();
- if(++num>=250) //延時(shí)500ms讀溫度數(shù)值
- {
- num=0;
- Flag=1;
- }
- if(Allow==1)
- {
- if(++count>=1000) //顯示設(shè)定值計(jì)數(shù)延時(shí)
- {
- Allow=0; //恢復(fù)正常顯示
- count=0; //計(jì)數(shù)清0
- }
- }
- }
復(fù)制代碼
|