呀呀呀,大佬們可以在我的程序基礎上讓溫度顯示出小數點嘛!!!萬分感謝,,代碼邊上的亂碼是我原來的注釋,仿真圖已附上
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uchar code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
- char displayData[4];
- uint shi,fen=9,miao=9,T50ms;
- uchar bai,sh,ge,a,b,t;
- sbit a0=P2^0;
- sbit a1=P2^1;
- sbit a2=P2^2;
- sbit a3=P2^3;
- sbit DQ=P3^7;
- void delay(uint n)
- {
- while(n--);
- }
- void init()
- {
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- ET0=1;
- EA=1;
- TR0=1;
- EX0=1;
-
-
- }
- void scan()
- {
- displayData[0] = tab[miao%10];
- displayData[1] = tab[(miao/10)%10];
- displayData[2] = tab[fen%10]|0x80;
- displayData[3] = tab[(fen/10)%10];
- }
- void display()
- {
- char i;
- for(i=0;i<=3;i++)
- {
- switch(i)
- {
- case 0:a0=0;a1=0;a2=0;a3=1;break;
- case 1:a0=0;a1=0;a2=1;a3=0;break;
- case 2:a0=0;a1=1;a2=0;a3=0;break;
- case 3:a0=1;a1=0;a2=0;a3=0;break;
- }
- if(i==2){
- P0=(displayData[i]&0x7f);
- }else
- P0=displayData[i];
- delay(200);
- P0=0xff;
- }
- }
- int_DS18b20()
- {
- uchar x=0;
- DQ = 1;
- delay(8);
- DQ=0;
- delay(80);
- DQ=1;
- delay(10);
- x=DQ;
- delay(20);
- return x;
- }
- void write_byte(uchar dat)
- {
- uchar i=0;
- for(i=8;i>0;i--){
- DQ=0;
- DQ=dat&0x01;
- delay(5);
- DQ=1;
- dat>>=1;
- }
- delay(4);
- }
- read_byte()
- {
- uchar i=0;
- uchar dat=0;
- for(i=8;i>0;i--){
- DQ=0;
- dat>>=1;
- DQ=1;
- if(DQ)
- dat|=0x80;
- delay(4);
- }
- return (dat);
- }
-
- void int_()
- {
- while(int_DS18b20());
- write_byte(0xcc);
- write_byte(0x44);
- }
- void retemp()
- {
- uint count=0,j=0;
- P2=0xff;
- int_();
- delay(220);
- for(count=0;count<100;count++){
- a0=1;
- P0=tab[0];
- delay(100);
- a0=0;
- a1=1;
- P0=tab[0];
- delay(100);
- a1=0;
- a2=1;
- P0=tab[0];
- delay(100);
- a2=0;
- a3=1;
- P0=0xc6;
- delay(100);
- a3=0;
- }
- for(j=0;j<40;j++) {
- delay(10);
- while(int_DS18b20());
- write_byte(0xcc);
- write_byte(0xbe);
- a=read_byte();
- b=read_byte();
- if(b>127){
- a=~a;
- b=~b;
- a=a>>4;
- t=b<<4;
- t=t|a;
- t+=1;
- sh=t/10;
- ge=t%10;
- for(count=0;count<123;count++){
- if(t>=10){
- a0=1;
- P0=0xbf;
- delay(30);
- a0=0;
- a1=1;
- P0=tab[sh];
- delay(30);
- a1=0;
- a2=1;
- P0=tab1[ge];
- delay(30);
- a2=0;
- a3=1;
- P0=0xc6;
- delay(30);
- a3=0;
- }else{
- a0=0;
- a1=1;
- P0=0xbf;
- delay(30);
- a1=0;
- a2=1;
- P0=tab1[ge];
- delay(30);
- a2=0;
- a3=1;
- P0=0xc6;
- delay(30);
- a3=0;
- }
- }
- }else{
- count=0;
- a=a>>4;
- t=b<<4;
- t=t|a;
- bai=t/100;
- sh=t%100/10;
- ge=t%10;
- for(count=0;count<100;count++){
- if(bai){
- a0=1;
- P0=tab[bai];
- delay(20);
- a0=0;
- }else
- a0=0;
- if(sh){
- a1=1;
- P0=tab[sh];
- delay(20);
- a1=0;
- }
- a1=0;
- a2=1;
- P0=tab1[ge];
- delay(20);
- a2=0;
- a3=1;
- P0=0xc6;
- delay(20);
- a3=0;
- }
- }
- int_();
- }
- }
- void main()
- {
- init();
- while(1){
- scan();
- display();
- }
- }
- void timer0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- T50ms++;
- if(T50ms==20)
- {
- T50ms=0;
- miao++;
- if(miao>=60)
- {
- miao=miao-60;
- fen++;
- if(fen>=60)
- {
- fen=fen-60;
- shi++;
- }
- }
- }
- }
- void timer1() interrupt 0
- {
- miao=miao+5;
- retemp();
- }
復制代碼
所有資料51hei提供下載:
溫度測控顯示系統.rar
(18.4 KB, 下載次數: 7)
2019-6-26 08:59 上傳
點擊文件名下載附件
這是我的仿真圖 下載積分: 黑幣 -5
|