|
大佬们我想问一下为什么数码管会突然闪一下呢,然后蜂鸣器就会叫有时候不会有时候就会这样是为什么呢,现在仿真不会这样了,但是实物会,求求了!!
单片机源程序如下:
- #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--;
- }
- }
复制代码
|
|