|
被課程設(shè)計(jì)虐的死去活來(lái),實(shí)在是沒(méi)有思路特此前來(lái)一問(wèn)~
題目的要求如下:初始溫度50度,通過(guò)按鍵設(shè)定加熱溫度并顯示在數(shù)碼管上。環(huán)境溫度由Ds18b20進(jìn)行檢測(cè),傳到單片機(jī)進(jìn)行處理。蜂鳴器用來(lái)報(bào)警,溫度超過(guò)70度發(fā)出警報(bào)。加熱電路我的想法是用繼電器和LED燈進(jìn)行模擬,不知道可不可行。
現(xiàn)在栽到了數(shù)碼管顯示上面,仿真時(shí)會(huì)閃爍一下,然后熄滅不亮。我研究一天了,無(wú)奈實(shí)在看不懂,希望各位答疑解惑,先謝過(guò)了~程序和原理圖如下。
QQ截圖20180501001533.png (35.31 KB, 下載次數(shù): 26)
下載附件
2018-5-1 00:16 上傳
QQ截圖20180501001558.png (38.79 KB, 下載次數(shù): 29)
下載附件
2018-5-1 00:16 上傳
QQ截圖20180501001738.png (26.47 KB, 下載次數(shù): 29)
下載附件
2018-5-1 00:16 上傳
這個(gè)仿真結(jié)果看得我也是一臉懵逼啊,咋個(gè)電平都不變換的?本人是真的純單片機(jī)小白一枚了,請(qǐng)各位見(jiàn)諒!
這個(gè)程序是c和匯編的綜合,我在編譯的時(shí)候設(shè)置過(guò)了,編譯是沒(méi)有問(wèn)題的,0error。就是顯示不出來(lái),急的我嘴上冒了三個(gè)大泡了!
數(shù)碼管選用的是共陽(yáng),也試了把數(shù)碼管的參數(shù)改成了0.1us,都沒(méi)有用,不知道是程序出了問(wèn)題還是電路都畫錯(cuò)了,希望各位指點(diǎn)一二,跪謝!!
如果看不清我上傳了一份附件,歡迎各位下載指正!在此跪謝!!
程序如下:
- #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; //報(bào)警器
- 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};
- //數(shù)碼管顯示列表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
- uchar code scan_con[2]={0xfd,0xfe}; // 列掃描控制字 */
- uchar temp_data[2];
- //11US延時(shí)函數(shù)
- void delay(uint t)
- {
- for(;t>0;t--);
- }
- //顯示掃描函數(shù)
- 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寫命令函數(shù)
- 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個(gè)字節(jié)函數(shù)
- 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復(fù)位函數(shù)
- 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繼續(xù)下一步
- }
- delay(45); //延時(shí)500us
- presence = ~DQ;
- }
- DQ=1;
- }
- void read_temp()
- {
- write_byte(0xCC); // 發(fā)Skip ROM命令
- write_byte(0xBE); // 發(fā)讀命令
- temp_data[0]=read_byte(); //溫度低8位
- temp_data[1]=read_byte(); //溫度高8位
- ow_reset();
- write_byte(0xCC); // Skip ROM
- write_byte(0x44); // 發(fā)轉(zhuǎn)換命令
- }
- //溫度數(shù)據(jù)處理函數(shù)
- //越線報(bào)警
- //加熱控制
- 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;} //報(bào)警
- if(tt>key)
- Ha=1; //關(guān)加熱器
- if(tt<key)
- Ha=0; //開(kāi)加熱器
- }
- main()
- {
- Wa=1;
- Ha=1;
- P3=0XFF;
- EX0=1;
- EX1=1;
- EA=1;
- Disdata=0xff; //初始化端口
- discan=0X00;
- scan();
- write_byte(0xCC); // 發(fā)Skip ROM命令
- write_byte(0xBE);
- while(1)
- {
- read_temp(); //讀出18B20溫度數(shù)據(jù)
- 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;
- }
復(fù)制代碼
溫度3.rar
(79.43 KB, 下載次數(shù): 19)
2018-5-1 00:22 上傳
點(diǎn)擊文件名下載附件
程序+原理圖
|
|