|
给大家分享2个温度显示程序和仿真
源程序
- /*
- #include <REGX52.H>
- #define uchar unsigned char
- sbit DQ=P2^0; //数据传输线接单片机的相应的引脚
- unsigned char tempL=0; //临时变量低位(无符号字符变量)
- unsigned char tempH=0; //临时变量高位
- unsigned int tempa; //温度值(整型变量)
- uchar display_data[4]={0};
- void DS18_delay(int useconds)//延时函数
- {
- int s;
- for (s=0; s<useconds;s++);
- }
- unsigned char Init_DS18B20(void)
- {
- unsigned char x=0;
-
- DQ=0; //发送复位脉冲
- DS18_delay(29); //延时(>480ms)
- DQ=1; //拉高数据线
- DS18_delay(3); //等待(15~60ms) 等待存在脉冲
- x=DQ; //获得存在信号(用于判断是否有器件)
- DS18_delay(25); // 等待时间隙结束
- return(x); //返回存在信号,0 = 器件存在, 1 = 无器件
- }
- ReadOneChar(void)//读一个字节
- {
- unsigned char i=0;
- unsigned char dat=0;
- for (i=8;i>0;i--)
- {
- DQ=1;
- DS18_delay(1);
- DQ=0;
- dat>>=1;//复合赋值运算,等效dat=dat>>1(dat=dat右移一位后的值)
- DQ=1;
- if(DQ)
- dat|=0x80;
- DS18_delay(4);
- }
- return(dat);
- }
- WriteOneChar(unsigned char dat)//有参函数,功能是"写",而写的内容就是括号内的参数
- {
- unsigned char i=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- DQ=dat&0x01;
- DS18_delay(5);
- DQ=1;
- dat>>=1;//复合赋值运算,等效dat=dat>>1(dat=dat右移一位后的值)
- }
- DS18_delay(4);
- }
- unsigned int ReadTemperature(void)//返回读取的温度.
- {
- Init_DS18B20(); //初始化,调用初始化函数
- WriteOneChar(0xcc); //跳过读序列号的操作,调用写函数,写0xcc指令码(跳过读序列号)
- WriteOneChar(0x44); //启动温度转换,调用写函数,写0x44指令码(启动温度转换)
- DS18_delay(125); //转换需要一点时间,延时
- Init_DS18B20(); //初始化,调用初始化函数
- WriteOneChar(0xcc); //跳过读序列号的操作,调用写函数,写0xcc指令码(跳过读序列号?
- WriteOneChar(0xbe); //调用写函数,写0xbe指令码,读温度寄存器(头两个值分别为温度的低位和高位)
- tempL=ReadOneChar(); //读出温度的低位LSB
- tempH=ReadOneChar(); //读出温度的高位MSB
- tempa=((tempH*256)+tempL)*6.25; //温度转换,扩大100返回
- //DS18_delay(10);
- //tempa=tempL+tempH;
- return(tempa);//运算结果返回到函数
- }
- void display()//显示函数
- {
- unsigned char i,j,k=0x80;
- unsigned char code dis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39};
- for(i=0;i<4;i++)
- {
- P2=0x0f;
- if(i==1)
- P0=dis[display_data[i]]+0x80;
- else
- P0=dis[display_data[i]];
- P2=k;
- k=k>>1;
- for(j=250;j>0;j--);
- }
- P2=0x0f;
- }
- void main()
- {
-
- unsigned int temp;
- uchar i;
- while(1)
- {
- temp=ReadTemperature();
- display_data[0]=temp/1000;
- display_data[1]=(temp/100)%10;
- display_data[2]=(temp/10)%10;
- display_data[3]=temp%10;
- for(i=0;i<250;i++) display();
- }
- } */
- # include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char //宏定义
- sbit p34=P2^4;
- sbit p35=P2^5;
- sbit p36=P2^6;
- sbit dp=P0^7;
- sbit p37=P2^7;
- sbit DQ=P2^2; //定义DS18B20总线I/O
- sbit SET=P3^1; //定义选择报调整警温度上限和下限(1为上限,0为下限) /****P3.2和P3.3为调整温度报警增加键和减少键******/
- sbit LING=P2^0; //定义响铃
- signed char m; //温度值全局变量
- bit sign=0; //外部中断状态标志
- signed char shangxian=38; //上限报警温度,默认值为38
- signed char xiaxian=6; //下限报警温度,默认值为5
- uchar code LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; /*****延时子程序*****/
- void Delay(uint i)
- {
- while( i-- );
- }
- void Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ=1; Delay(8); //稍做延时
- DQ=0; //单片机将DQ拉低
- Delay(80); //精确延时,大于480us
- DQ=1; //拉高总线
- Delay(14);
- x=DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
- Delay(20);
- }
- /*****读一个字节*****/
- unsigned char ReadOneChar(void)
- {
- unsigned char i=0;
- unsigned char dat=0;
- for (i=8;i>0;i--)
- {
- DQ=0; // 给脉冲信号
- dat>>=1;
- DQ=1; // 给脉冲信号
- if(DQ) dat|=0x80;
- Delay(4);
- }
- return(dat); }
- /*****写一个字节*****/
- void WriteOneChar(unsigned char dat)
- { unsigned char i=0;
- for (i=8; i>0; i--)
- {
- DQ=0;
- DQ=dat&0x01;
- Delay(5);
- DQ=1; dat>>=1;
- }
- }
- void Tmpchange(void) //发送温度转换命令
- {
- Init_DS18B20();
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0x44); //启动温度转
- }
- unsigned int ReadTemperature(void)
- {
- unsigned char a=0;
- unsigned char b=0;
- unsigned int t=0;
- float tt=0;
- Tmpchange();
- Init_DS18B20();
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器
- a=ReadOneChar(); //读低8位
- b=ReadOneChar(); //读高8位
- t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*100+0.5; //放大10倍输出并四舍五入
- return(t); } /*****显示开机初始化等待画面*****/
- Disp_init() { P0 = 0x80; //显示-
- p34=1;p35=0;p36=0;p37=0;
- Delay(200);
- P0 = 0x80;
- p34=0;p35=1;p36=0;p37=0;
- Delay(200);
- P0 = 0x80;
- p34=0;p35=0;p36=1;p37=0;
- Delay(200);
- P0 = 0x80;
- p34=0;p35=0;p36=0;p37=1;
- Delay(200);
- P0 = 0x80;
- }
- Disp_Temperature() //显示温度
- { uint a,b,c,d,e;
- e=ReadTemperature(); //获取温度值
- a=e/1000; //计算得到十位数
- b=e/100-a*10; //计算得到个位数字
- d=e%10; //计算得到小数点后两位
- c=(e%100)/10; //计算得到小数点后一位
- m=e/100;
- if(m>shangxian || m<xiaxian) LING=1; //温度不在范围内报警
- else LING=0; p34=0;p35=0;p36=0;p37=0;
- P0 =LEDData[d]; //显示小数点后两位
- p34=1;p35=0;p36=0;p37=0;
- Delay(300); p34=0;p35=0;p36=0;p37=0;
- P0 =LEDData[c]; //显示小数点后一位
- p34=0;p35=1;p36=0;p37=0;
- Delay(300);
- p34=0;p35=0;p36=0;p37=0;
- P0 =LEDData[b]; //显示个位
- dp=0; p34=0;p35=0;p36=1;p37=0;
- Delay(300); p34=0;p35=0;p36=0;p37=0;
- P0 =LEDData[a]; //显示十位
- p34=0;p35=0;p36=0;p37=1;
- Delay(300); p34=0;p35=0;p36=0;p37=0; //关闭显示
- }
- disptiaozheng()
- {
- uchar f,g,j,k;
- f=shangxian/10;
- g=shangxian%10;
- j=xiaxian/10;
- k=xiaxian%10;
- p34=0;p35=0;p36=0;p37=0;
- P0 =0xc0; //显示0 p34=1;p35=0;p36=0;p37=0;
- Delay(200); p34=0;p35=0;p36=0;p37=0; P0 =0xc0; //显示0
- p34=0;p35=1;p36=0;p37=0;
- Delay(200); p34=0;p35=0;p36=0;p37=0;
- if(SET==1)
- {
- P0 =LEDData[g];
- dp=0; //显示上限温度个位
- }
- else
- {
- P0 =LEDData[k];
- dp=0;
- }
- p34=0;p35=0;p36=1;p37=0;
- Delay(200); p34=0;p35=0;p36=0;p37=0;
- if(SET==1) P0 =LEDData[f]; //显示上限温度十位
- else { if(f==0) P0=0x00; //不显示下限温度十位
- else P0 =LEDData[j]; //显示下限温度十位
- } p34=0;p35=0;p36=0;p37=1;
- Delay(200);
- p34=0;p35=0;p36=0;p37=0; //关闭显示
- Delay(20);
- }
- void int0(void) interrupt 0 { EX0=0; //关外部中断0
- sign=1;
- if(SET==1) shangxian++; else xiaxian++;
- Delay(500); EX0=1;
- } /*****外部中断1服务程序*****/
- void int1(void)
- interrupt 2
- {
- EX1=0; //关外部中断0
- sign=1; if(SET==1) shangxian--;
- else xiaxian--; Delay(500); EX1=1;
- } /*****主函数*****/
- void main(void)
- {
- uint z;
- IT0=1;
- IT1=1;
- EX0=1;
- EX1=1;
- EA=1;
- ReadTemperature();
- LING=0;
- for(z=0;z<100;z++)
- {
- Disp_init();
- }
- while(1)
- {
- Disp_Temperature();
- if(sign==1)
- {
- for(z=0;z<300;z++)
- disptiaozheng();
- sign=0;
- }
- }
- }
-
复制代码
2个文件,都含有仿真和程序
|
评分
-
查看全部评分
|