被課程設計虐的死去活來,實在是沒有思路特此前來一問~
題目的要求如下:初始溫度50度,通過按鍵設定加熱溫度并顯示在數碼管上。環境溫度由Ds18b20進行檢測,傳到單片機進行處理。蜂鳴器用來報警,溫度超過70度發出警報。加熱電路我的想法是用繼電器和LED燈進行模擬,不知道可不可行。
現在栽到了數碼管顯示上面,仿真時會閃爍一下,然后熄滅不亮。我研究一天了,無奈實在看不懂,希望各位答疑解惑,先謝過了~程序和原理圖如下。
這個仿真結果看得我也是一臉懵逼啊,咋個電平都不變換的?本人是真的純單片機小白一枚了,請各位見諒!
這個程序是c和匯編的綜合,我在編譯的時候設置過了,編譯是沒有問題的,0error。就是顯示不出來,急的我嘴上冒了三個大泡了!
數碼管選用的是共陽,也試了把數碼管的參數改成了0.1us,都沒有用,不知道是程序出了問題還是電路都畫錯了,希望各位指點一二,跪謝!!!
如果看不清我上傳了一份附件,歡迎各位下載指正!在此跪謝!!!
程序如下:
- #include "reg52.h"
- #define Disdata P0 //段碼輸出口
- #define discan P2 //位選輸出口
- #define uchar unsigned char
- #define uint unsigned int
- sbit DQ=P3^7; //溫度輸入口
- sbit Ha=P1^5; //加熱器
- sbit Wa=P1^5; //報警器
- sbit Key_I=P3^2;
- sbit Key_II=P3^3;
- uint h;
- uint key_[2]={5,0}; //初始溫度
- uchar dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- //數碼管顯示列表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
- uchar code scan_con[2]={0xfd,0xfe}; // 列掃描控制字 */
- uchar temp_data[2];
- //11US延時函數
- void delay(uint t)
- {
- for(;t>0;t--);
- }
- //顯示掃描函數
- void scan()
- {
- uchar k;
- for(k=0;k<2;k++) //2位LED掃描控制
- {Disdata=dis_7[key_[k]];
- discan=scan_con[k];}
- delay(20);
- discan=0xff;
- }
- //18B20寫命令函數
- void write_byte(uchar val)
- {
- uchar i;
- for (i=8; i>0; i--) //
- {
- DQ=1;
- DQ = 0;
- DQ = 0;
- #pragma ASM
- NOP
- NOP
- NOP
- NOP
- NOP
- #pragma ENDASM //5us
- DQ = val&0x01; //最低位移出
- delay(6); //66us
- val=val/2; //右移一位
- }
- DQ = 1;
- delay(1);
- }
- //18B20讀1個字節函數
- uchar read_byte(void)
- {
- uchar i;
- uchar value = 0;
- for (i=8;i>0;i--)
- {
- DQ=1;
- #pragma ASM
- NOP
- NOP
- #pragma ENDASM
- value>>=1;
- DQ = 0;
- #pragma ASM
- NOP
- NOP
- NOP
- NOP
- #pragma ENDASM //4us
- DQ = 1;
- DQ = 0;
- #pragma ASM
- NOP
- NOP
- NOP
- NOP
- #pragma ENDASM
- if(DQ)value|=0x80;
- delay(6); //66us
- }
- DQ=1;
- return(value);
- }
- //18B20復位函數
- ow_reset(void)
- {
- char presence=1;
- while(presence)
- {
- while(presence)
- {
- DQ=1;
- DQ = 0;
- #pragma ASM
- NOP
- NOP
- #pragma ENDASM
- DQ=0;
- delay(50);
- DQ=1;
- delay(6);
- presence=DQ; // presence=0繼續下一步
- }
- delay(45); //延時500us
- presence = ~DQ;
- }
- DQ=1;
- }
- void read_temp()
- {
- write_byte(0xCC); // 發Skip ROM命令
- write_byte(0xBE); // 發讀命令
- temp_data[0]=read_byte(); //溫度低8位
- temp_data[1]=read_byte(); //溫度高8位
- ow_reset();
- write_byte(0xCC); // Skip ROM
- write_byte(0x44); // 發轉換命令
- }
- //溫度數據處理函數
- //越線報警
- //加熱控制
- void work_temp()
- {uchar tt_[2],tt,key;
- key=key_[0]*10+key_[1];
- tt_[0]=temp_data[0]&0xf0;
- tt_[1]=temp_data[1]&0x0f;
- tt=tt_[1]+tt_[2];
- if(tt>0x70){Wa=0;} //報警
- if(tt>key)
- Ha=1; //關加熱器
- if(tt<key)
- Ha=0; //開加熱器
- }
- main()
- {
- Wa=1;
- Ha=1;
- P3=0XFF;
- EX0=1;
- EX1=1;
- EA=1;
- Disdata=0xff; //初始化端口
- discan=0X00;
- scan();
- write_byte(0xCC); // 發Skip ROM命令
- write_byte(0xBE);
- while(1)
- {
- read_temp(); //讀出18B20溫度數據
- work_temp(); //加熱控制
- }
- }
- //
- void intto(void) interrupt 0
- {delay(2);
- if(Key_I==1)
- {
- if(key_[0]==9)
- key_[0]=0;
- else
- key_[0]++;
- scan();
- }
- Key_I=0;
- }
- void intt1(void) interrupt 1
- {delay(2);
- if(Key_II==1)
- {
- if(key_[1]==9)
- key_[1]=0;
- else
- key_[1]++;
- scan();
- }
- Key_II=0;
- }
復制代碼
溫度3.rar
(79.43 KB, 下載次數: 19)
2018-5-1 00:22 上傳
點擊文件名下載附件
程序+原理圖
|