|
自己寫的代碼 打算分享出來 雖然不是最精簡算法,但是能基本實現賽題要求的功能,僅供參考。和大家一起交流
單片機源程序如下:
- #include <stc15f2k60s2.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit S4=P3^3;
- sbit S5=P3^2;
- sbit S6=P3^1;
- sbit S7=P3^0;
- sbit DQ = P1^4; //單總線接口
- uchar SMG_duanma[12]={0XC0,0XF9,0XA4,0XB0,
- 0X99,0X92,0X82,0XF8,
- 0X80,0X90,0XFF,0XBF};
- uchar SMG_pianxuan[8]={0X01,0X02,0X04,0X08,
- 0X10,0X20,0X40,0X80};
- uchar SMG_huanchong[8]={10,10,10,10,10,11,0,1};
- uchar SMGTIME_huanchong[8]={2,3,11,5,9,11,5,0};
- uchar SMGWD_huanchong[8]={11,0,0,10,10,11,2,4};
- uchar DS18B20[10]={0};
- int flag,jiange_flag=1,jiange=1,qiehuan=0,cishu;
- int miao=50,fen=59,xiaoshi=23,shanshuo,miao_flag,xuhao_flag;
- void Delay1ms(int time) //@12.000MHz
- {
- unsigned char i, j;
- while(time--)
- {
- i = 12;
- j = 169;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- void Delay500us() //@12.000MHz
- {
- unsigned char i, j;
- i = 6;
- j = 211;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay80us() //@12.000MHz
- {
- unsigned char i, j;
- i = 1;
- j = 236;
- do
- {
- while (--j);
- } while (--i);
- }
- //通過單總線向DS18B20寫一個字節
- void Write_DS18B20(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DQ = 0;
- DQ = dat&0x01;
- Delay80us();
- DQ = 1;
- dat >>= 1;
- }
- Delay80us();
- }
- //從DS18B20讀取一個字節
- uchar Read_DS18B20()
- {
- uchar i;
- uchar dat;
- for(i=0;i<8;i++)
- {
- DQ = 0;
- dat >>= 1;
- DQ = 1;
- if(DQ)
- {
- dat |= 0x80;
- }
- Delay80us();
- }
- return dat;
- }
- //DS18B20設備初始化
- void init_ds18b20()
- {
- DQ = 0;
- Delay500us();
- DQ = 1;
- Delay500us();
- }
- uchar DS18B20_qudong()
- {
- uchar low;
- uchar high;
- long temp;
- init_ds18b20();
- Write_DS18B20(0XCC); //忽略rom指令
- Write_DS18B20(0X44); //溫度轉換
- init_ds18b20();
- Write_DS18B20(0XCC);
- Write_DS18B20(0XBE); //讀暫存器
- low=Read_DS18B20();
- high=Read_DS18B20();
- temp=low>>4;
- temp=temp|(high<<4);
- return temp;
- }
- void AllInit()
- {
- P2=0XA0;
- P0=0;
- P2=0X80;
- P0=0XFF;
- }
- void SEY_SCAN() //flag相應數字對應鍵盤標號
- {
- if(S4==0)
- {
- Delay1ms(3);
- if(S4==0)
- {
- flag=4;
- }
- while(S4==0);
- }
- if(S5==0)
- {
- Delay1ms(3);
- if(S5==0)
- {
- flag=5;
- }
- while(S5==0);
- }
- if(S6==0)
- {
- Delay1ms(3);
- if(S6==0)
- {
- flag=6;
- }
- while(S6==0);
- }
- if(S7==0)
- {
- Delay1ms(3);
- if(S7==0)
- {
- flag=7;
- }
- while(S7==0);
- }
- }
- void zhixing() //執行鍵盤的操作
- {
- if(flag==4) //當s4被摁下
- {
- flag=0;
- jiange_flag++;
- if(jiange_flag==2)jiange=5;
- if(jiange_flag==3)jiange=10;
- if(jiange_flag==4)jiange=30;
- if(jiange_flag==5)jiange=60;
- if(jiange_flag==6){jiange_flag=1;jiange=1;}
- SMG_huanchong[6]=jiange/10;
- SMG_huanchong[7]=jiange%10;
- }
- if(flag==5) //當s5被摁下
- {
- flag=0;
- qiehuan=1;
- ET0=1;
- }
- if(flag==6)
- {
- flag=0;
- if(cishu==10) //只有采集完十次之后 才有效
- {
- cishu=0;
- ET1=1; //開始顯示溫度
- }
- }
- if(xuhao_flag==9) //摁鍵無效
- {
- if(flag==7) //初始化 還原所有參數
- {
- flag=0;
- miao=50;
- fen=59;
- xiaoshi=23;
- qiehuan=0;
- miao_flag=0;
- xuhao_flag=0;
- jiange=1;
- ET0=0;
- ET1=0;
- SMGWD_huanchong[2]=0;
- }
- }
- }
- void JanGe_Display() //開機默認顯示 調整間隔頁面 1 5 10 30s
- {
- int i;
- for(i=0;i<8;i++)
- {
- P2=0XC0;
- P0=SMG_pianxuan[i];
- P2=0XE0;
- P0=SMG_duanma[SMG_huanchong[i]];
- Delay1ms(3);
- }
- }
- void TIME_Display()
- {
- int i;
- shanshuo++;
- if(shanshuo==41)shanshuo=0;
- for(i=0;i<8;i++)
- {
- if(i==2 | i==5)
- {
- if(shanshuo<20) //控制兩個 - 閃爍
- {
- P2=0XC0;
- P0=SMG_pianxuan[i];
- P2=0XE0;
- P0=SMG_duanma[10];
- }
-
- else
- {
- P2=0XC0;
- P0=SMG_pianxuan[i];
- P2=0XE0;
- P0=SMG_duanma[11];
- }
- }
- else
- {
- P2=0XC0;
- P0=SMG_pianxuan[i];
- P2=0XE0;
- P0=SMG_duanma[SMGTIME_huanchong[i]];
- }
- Delay1ms(3);
- }
- }
- void WenDu_Display()
- {
- int i;
- shanshuo++;
- if(shanshuo==41)shanshuo=0;
- if(ET1==0&&xuhao_flag!=9)
- {
- if(shanshuo<20)
- {
- P2=0X80;
- P0=0XFE;
- }
- else
- {
- P2=0X80;
- P0=0XFF;
- }
- }
- else
- {
- P2=0X80;
- P0=0XFF;
- }
- for(i=0;i<8;i++)
- {
- P2=0XC0;
- P0=SMG_pianxuan[i];
- P2=0XE0;
- P0=SMG_duanma[SMGWD_huanchong[i]];
- Delay1ms(3);
- }
- }
- void CaiJi()
- {
- if(miao_flag==jiange) //求余,到達一次設定時間 記錄一次
- {
- miao_flag=0;
- DS18B20[cishu]=DS18B20_qudong();
- cishu++;
- if(cishu==10) //當溫度記錄到10次停止切換到溫度顯示界面
- {
- qiehuan=2;
- //cishu=0;
- ET0=0;
- }
- }
-
- }
- void Timer0Init() //5毫秒@12.000MHz
- {
- AUXR |= 0xC0; //定時器時鐘1T模式
- TMOD &= 0xFF; //設置定時器模式
- TL0 = 0xA0; //設置定時初值
- TH0 = 0x15; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- EA=1;
- ET0=0;
- }
- void Timer1Init() //5毫秒@12.000MHz
- {
- TL1 = 0xA0; //設置定時初值
- TH1 = 0x15; //設置定時初值
- TF1 = 0; //清除TF1標志
- TR1 = 1; //定時器1開始計時
- ET1=0;
- }
- void main()
- {
- AllInit();
- Timer0Init();
- Timer1Init();
- while(1)
- {
- SEY_SCAN();
- zhixing();
- CaiJi();
- if(qiehuan==0)
- JanGe_Display();
- if(qiehuan==1)
- TIME_Display();
- if(qiehuan==2)
- WenDu_Display();
- }
- }
- void Timer0() interrupt 1
- {
- uint num;
- num++;
- if(num==200)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
|
|