|
大佬們我想問一下為什么數碼管會突然閃一下呢,然后蜂鳴器就會叫有時候不會有時候就會這樣是為什么呢,現在仿真不會這樣了,但是實物會,求求了!!
單片機源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- void ksxs();
- sbit DQ=P2^0; //溫度數據口
- sbit set=P3^1; //設置鍵
- sbit add=P3^2; //增加
- sbit dec=P3^3; //減少
- sbit beer=P2^5; //蜂鳴器
- sbit out =P2^1; //風扇電機
- sbit wx1=P0^0; //位選1
- sbit wx2=P0^1; //位選2
- sbit wx3=P0^2; //位選3
- sbit wx4=P0^3; //位選4
- sbit wx5=P0^4; //位選5
- sbit wx6=P0^5; //位選6
- sbit wx7=P0^6;
- sbit wx8=P0^7;
- uint high=30,low=5;
- uint a=0;
- bit fg=0;
- uint temp,js,djs;
- uchar temp_xs,flag;
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x82,0xf8,0x80,0x90,
- 0x7f };
- void init()
- {
- TMOD=0x10;
- TR1=1;
- ET1=1;
- IT1=1; //脈沖方式
- IT0=1;
- EX1=1; //打開中斷
- EX0=1;
- EA=1;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- }
- /******延時程序*******/
- void delay_ms(unsigned int m)
- {
- unsigned int i,j;
- for(i=m;i>0;i--)
- for(j=110;j>0;j--);
- }
- /******ds18b20延時程序(微秒)*******/
- void delay_us(unsigned int m) //溫度延時程序
- {
- for(m;m>0;m--);
- }
- /***********ds18b20的初始化**************/
- void Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ = 1; //DQ復位 ds18b20通信端口
- delay_us(8); //稍做延時
- DQ = 0; //單片機將DQ拉低
- delay_us(80); //精確延時 大于 480us
- DQ = 1; //拉高總線
- delay_us(4);
- x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
- delay_us(20);
- }
- /***********ds18b20讀一個字節**************/
- uchar ReadOneChar(void)
- {
- unsigned char i;
- unsigned char dat = 0;
- for (i=8;i>0;i--)
- { DQ=1;
- delay_us(1);
- DQ = 0; // 高電平拉成低電平時讀周期開始
- dat>>=1;
- DQ = 1; // 給脈沖信號
- if(DQ)
- dat|=0x80; //
- delay_us(10);
- }
- return(dat);
- }
- /*************ds18b20寫一個字節****************/
- void WriteOneChar(unsigned char dat)
- {
- unsigned char i;
- for (i=8; i>0; i--)
- {
- DQ = 0; //從高電平拉至低電平時,寫周期的開始
- DQ = dat&0x01; //數據的最低位先寫入
- delay_us(15); //60us到120us延時
- DQ = 1;//釋放總線準備下一次數據的寫入
- dat>>=1; //從最低位到最高位傳入
- }
- delay_us(4);
- }
- /**************讀取ds18b20當前溫度************/
- void ReadTemperature(bit flag)
- {
- uchar a=0;
- uchar b=0;
- uint i;
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳過讀序號列號的操作/
- WriteOneChar(0x44); // 啟動溫度轉換
- if(flag==1)
- {
- ksxs();
- }
- else
- delay_us(125); // this message is wery important
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度/
- a=ReadOneChar(); //讀取溫度值低位 /
- b=ReadOneChar(); //讀取溫度值高位 /
- i=b;
- i>>=4;
- if(i!=0)
- {
- fg=1;
- a=~(a)+1;
- b=~b;
- if(a==0) b=b+1; //寫的過程發現-16度本來是0x10卻輸出0x00,20卻是10,這樣就好了
- temp=((a>>4)|(b<<4));
- a=(a&0x0f);
- temp_xs=a;
- }
- else
- {
- fg=0;
- temp=((a>>4)|(b<<4));
- a=(a&0x0f);
- temp_xs=a;
- }
- }
- /*************主顯示函數************/
- void display()
- {
- uint a,b,c,d,e,j;
- a=temp/100; // 百位
- b=temp/10%10; // 十位
- c=temp%10; // 個位
- temp_xs=(int)(temp_xs*6.25+0.5);
- d=temp_xs/10; // 小數第一位
- e=temp_xs%10; // 小數第二位
- for(j=0;j<7;j++)
- {
- switch(j)
- {
- case 0:
- wx1=1;
- if(fg==0)
- {
- if(a==0) P1=0Xff;
- else P1=table[a];
- }
- if(fg==1)
- {
- if(b==0) P1=0Xff;
- else P1=0xbf;
- }
- delay_ms(1);
- wx1=0;
- break;
-
- case 1:
- wx2=1;
- if(fg==0)
- {
- if((a==0)&&(b==0)) P1=0Xff;
- else P1=table[b];
- }
- if(fg==1)
- {
- if(b==0) P1=0Xbf;
- else P1=table[b];
- }
- delay_ms(1);
- wx2=0;
- break;
- case 3:
- wx3=1;
- P1=table[c]; //+0x80 表示字母加小數點
- delay_ms(1);
- wx3=0;
- break;
- case 2:
- wx4=1;
- P1=table[10];
- delay_ms(1);
- wx4=0;
- break;
- case 4:
- wx5=1;
- P1=table[d];
- delay_ms(1);
- wx5=0;
- break;
- case 5:
- wx6=1;
- P1=table[e];
- delay_ms(1);
- wx6=0;
- break;
- }
- }
- }
- /**********調溫顯示函數***********/
- void xianshi(temp1)
- {
- uint x,y,z,j;
- x=temp1/100; // 百位
- y=temp1/10%10; // 十位
- z=temp1%10; // 個位
- for(j=0;j<4;j++)
- {
- switch(j)
- {
- case 0:
- wx1=1;
- if(a==1) P1=0x89;
- if(a==2) P1=0xc7;
- delay_ms(5);
- wx1=0;
-
- case 1:
- wx5=1;
- if(x==0) P1=0Xff;
- else P1=table[x];
- delay_ms(5);
- wx5=0;
- break;
- case 2:
- wx6=1;
- if((x==0)&&(y==0)) P1=0Xff;
- else P1=table[y];
- delay_ms(5);
- wx6=0;
- break;
- case 3:
- wx7=1;
- P1=table[z];
- delay_ms(5);
- wx7=0;
- break;
- }
- }
- }
- /**********開機顯示函數***********/
- void ksxs()
- { uchar i;
- for (i=0;i<120;i++)
- {
- P1=0x10c;
- wx1=1;
- delay_ms(1);
- wx1=0;
- P1=0x10c;
- wx2=1;
- delay_ms(1);
- wx2=0;
- P1=0x10c;
- wx3=1;
- delay_ms(1);
- wx3=0;
- P1=0x10c;
- wx4=1;
- delay_ms(1);
- wx4=0;
- P1=0x10c;
- wx5=1;
- delay_ms(1);
- wx5=0;
- P1=0x10c;
- wx6=1;
- delay_ms(1);
- wx6=0;
- wx7=1;
- P1=0x10c;
- delay_ms(1);
- wx7=0;
- wx8=1;
- P1=0x10c;
- delay_ms(1);
- wx8=0;
- }
- }
- /**********按鍵函數***********/
- void keyscan()
- {
- if(set==0)
- {
- while(1)
- {
- if(set==0)
- {
- while(!set);
- a++;
-
- }
- if(a==1||a==2)
- {
- if(a==1) xianshi(high);
- if(add==0)
- {
- delay_ms(10);
- while(!add);
- if(flag==1)
- {
- while(!flag);
- if(a==1&&high<125)
- {
- high=high+5;
- }
- if(a==2)
- low=low+5;
- }
- flag=0;
- EX0=1;
- }
- if(a==2) xianshi(low);
- if(dec==0)
- {
- delay_ms(5);
- if(flag==2)
- {
- while(!flag);
- if(a==1) high=high-1;
- if(a==2) low=low-1;
- }
- flag=0;
- EX1=1;
- }
- }
- if(a>=3)
- {
- a=0;
- break;
- }
- }
- }
- }
- /**********報警函數***********/
- void alarm()
- {
- if(temp<=low||temp>=high)
- {
- delay_ms(10);
- beer=0;
- if(djs==0&&temp>=high)
- {
- TR1=0;
- beer=1;
- out=0;
- }
- else
- {
- beer=0;
- out=1;
- }
- }
- else
- {
- out=1;
- beer=1;
- TR1=1;
- djs=10;
- }
- }
- /**********主函數***********/
- void main()
- {
- beer=1;
- out=1;
- init();
- ReadTemperature(1);
- ksxs();
- djs=3;
- js=0;
- while(1)
- {
- keyscan();
- ReadTemperature(0);
- display();
- alarm();
- }
- }
- void exzd0(void)interrupt 0
- {
- flag=1;
- EX0=0;
- }
- void exzd1(void)interrupt 2
- {
- flag=2;
- EX1=0;
- }
- void time1() interrupt 3 //定時器中斷1
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- js++;
- if(js>=20)
- {
- js=0;
- djs--;
- }
- }
復制代碼
|
|