久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
模擬糧倉溫度檢測報警系統設計
[打印本頁]
作者:
青春風鈴
時間:
2016-12-6 16:04
標題:
模擬糧倉溫度檢測報警系統設計
這是我們的免試題目,有仿真原理圖,源代碼沒希望能給大家提供幫助
0.png
(33.16 KB, 下載次數: 83)
下載附件
2016-12-6 16:56 上傳
0.png
(72.63 KB, 下載次數: 92)
下載附件
2016-12-6 16:58 上傳
仿真文件下載:
模擬糧倉溫度檢測報警系統-董曉臣.rar
(115.09 KB, 下載次數: 59)
2016-12-6 16:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
源程序:
#include <reg52.h>
#include<intrins.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
sbit RW = P2^1; //定義LCD的讀、寫選擇端
sbit RS = P2^0; //定義LCD的數據、命令選擇端
sbit EN = P2^2; //定義LCD的使能信號端
sbit DS = P3^5; //定義DS18B20的IO口
sbit L=P1^3; //綠燈
sbit H=P1^4; //紅燈
sbit LS=P3^4; //蜂鳴器
sbit k1=P2^7; //顯示64位的ROM
sbit k2=P2^6; //顯示當前溫度
sbit k3=P2^3; //顯示溫度上限及下線,并支持調節
sbit k4=P2^4; // 上限加
sbit k5=P2^5; // 下限減
uchar k=2; //當前溫度顯示標志位
uchar table0[] = " Current Temp : "; //當前溫度
uchar table1[] = " -- ROM CODE -- "; //顯示DS18B20的ROM
uchar table2[] = "ALARM TEMP Hi Lo"; //顯示上下限溫度
uchar table3[] = "Hi: Lo: ";
uchar table4[] = {0,0,0,0,0,0,0,0};
uchar tempHL[] = { 40, 10}; //上下限溫度的初始值
void delayms(uint ms) //延時函數1
{
uint i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void writecom(uchar com) //寫地址,也就是顯示的數據的位置
{
RS = 0;
P0 = com;
EN = 1;
delayms(1);
EN = 0;
}
void writedata(uchar dat) //寫數據,也就是顯示的數據
{
RS = 1;
P0 = dat;
EN = 1;
delayms(1);
EN = 0;
}
void init() //LCD初始化
{
RW = 0;
writecom(0x38); //16*2顯示,5*7點陣
writecom(0x0c);
writecom(0x06);
writecom(0x01); //清除LCD的顯示內容
}
void writestring(uchar * str, uchar length) //寫數據的過度函數。length:長度
{
uchar i;
for(i = 0; i < length; i++)
{
writedata(str[i]);
}
}
void delay(uint num) //延時函數
{
while( --num );
}
DSinit(void) //初始化ds1820
{
DS= 1; //DS復位
delay(8); //稍做延時
DS= 0; //將DS拉低
delay(90); //精確延時 大于 480u
DS= 1; //拉高總線
delay(110);
DS= 1;
}
uchar read_bit(void) //讀一位(bit)
{
uchar i;
DS= 0; //將DS拉低開始讀時間隙
DS= 1; // then return high
for (i=0; i<3; i++); // 延時15μs
return(DS); // 返回 DS線上的電平值
}
uchar readbyte() // 讀一個字節
{
uchar i = 0;
uchar dat = 0;
for (i=0;i<8;i++)
{ // 讀取字節,每次讀取一個字節
if(read_bit()) dat|=0x01<<i; // 然后將其左移
delay(4);
}
return (dat);
}
void write_bit(char bitval) //寫一位
{
DS= 0; // 將DS拉低開始寫時間隙
if(bitval==1) DS=1; // 如果寫1,DS返回高電平
delay(5); // 在時間隙內保持電平值,
DS= 1; // delay函數每次循環延時16μs,因此delay(5) = 104μs
}
void writebyte(uchar dat) //寫一個字節
{
uchar i = 0;
uchar temp;
for (i=0; i<8; i++) // 寫入字節, 每次寫入一位
{
temp = dat>>i;
temp &= 0x01;
write_bit(temp);
}
delay(5);
}
void sendchangecmd() //DS18B20?開始獲取溫度并轉換
{
DSinit(); //DS18B20復位
delayms(1);
writebyte(0xcc); //寫跳過讀ROM指令
writebyte(0x44); //寫溫度轉換指令
}
void sendreadcmd() //讀取寄存器中存儲的溫度數據
{
DSinit(); //DS18B20復位
delayms(1);
writebyte(0xcc); //寫跳過讀ROM指令
writebyte(0xbe); //讀取暫存器的內容
}
int gettmpvalue()
{
uint tmpvalue;
float t;
uchar low, high;
sendreadcmd(); //讀取寄存器中存儲的溫度數據
low = readbyte(); //讀取低八位
high = readbyte(); //讀取高八位
tmpvalue = high;
tmpvalue <<= 8; //高八位左移八位
tmpvalue |= low; //兩個字節組合為1個字
t = tmpvalue * 0.0625 * 100; //分辨率為0.0625,在此將值擴大100倍
return t;
}
void display(int v) //顯示子函數
{
uchar i;
uchar datas[] = {0, 0, 0, 0, 0, 0, 0, 0}; //定義緩存數組datas
uint tmp = abs(v); //abs是求絕對值函數
datas[0] = tmp % 10000 / 1000;
datas[1] = tmp % 1000 / 100;
datas[2] = tmp % 100 / 10;
datas[3] = tmp % 10;
datas[4] = 80; //空格的前30的ASCALL碼
datas[5] = 175; //溫度符號的前30的ASCALL碼
datas[6] = 19; //C的前30的ASCALL碼
writecom(0xc0+3);
if(v < 0) //當V小于0則輸出負號
{
writestring("- ", 2);
}
else
{
writestring("+ ", 2); //當V大于0則輸出正號
}
for(i = 0; i != 7; i++)
{
writedata('0'+datas[i]); //顯示溫度
if(i == 1)
{
writedata('.'); //顯示溫度的小數點
}
}
}
void Read_RomCord() //讀取64位序列碼
{
unsigned char j;
DSinit();
writebyte(0x33); // 讀序列碼的操作
for (j = 0; j < 8; j++)
{
table4[j] = readbyte();
}
}
void Disp_RomCode() //數據轉換與顯示
{
uchar j,i;
writecom(0xc0); //LCD第二行初始位置
for(j=0;j<8;j++)
{
i=((table4[j]&0xf0)>>4);
if(i>9)
{ i=i+0x37;}
else{i=i+0x30;}
writedata(i); //高位數顯示
i=(table4[j]&0x0f);
if(i>9)
{i=i+0x37;}
else {i=i+0x30;}
writedata(i); //低位數顯示
}
}
void lcd_display() //按鍵掃描
{
uchar i,m;
uchar hl[]={0, 0, 0, 0, 0};
if(k1 == 0) k = 1;
if(k2 == 0) k = 2;
if(k3 == 0) k = 3;
if(tempHL[0]<=gettmpvalue()/100)
delayms(100),LS=!LS,H=~H;
else
LS=1,H=1;
if(m==1)
{
if(tempHL[1]>=gettmpvalue()/100)
delayms(100),LS=!LS,L=~L;
else
LS=1,L=1;
}
switch(k)
{
case 1: //顯示64位的ROM
writecom(0x01);
writecom(0x80);
writestring(table1, 16);
Read_RomCord(); //讀取64位序列碼
Disp_RomCode(); //顯示64位序列
delayms(500); //溫度轉換時間需要750ms以上
break;
case 2: //顯示當前溫度
delayms(750); //溫度轉換時間需要750ms以上
sendchangecmd();
writecom(0x01);
writecom(0x80);
writestring(table0, 16);
display(gettmpvalue());
break;
case 3: //顯示溫度上限及下線,并支持調節
writecom(0x80);
writestring(table2, 16);
writecom(0xC0);
writestring(table3, 16);
if(k4==0) {tempHL[0]++;if(m==1) tempHL[1]++;if(m==0){tempHL[1]--;if(tempHL[1]==0)m=1;}delayms(100);}
if(k5==0) {tempHL[0]--;if(m==0) tempHL[1]++;if(m==1){tempHL[1]--;if(tempHL[1]==0)m=0;}delayms(100);}
hl[0]=tempHL[0]/10;
hl[1]=tempHL[0]%10;
if(m==1) hl[2]=80;
if(m==0) hl[2]=128;
hl[3]=tempHL[1]/10;
hl[4]=tempHL[1]%10;
writecom(0xC0+4);
for(i = 0; i != 2; i++)
{
writedata('0'+hl[i]); //顯示上限溫度
}
writecom(0xC0+11);
for(i = 2; i != 5; i++)
{
writedata('0'+hl[i]); //顯示下限溫度
}
break;
}
}
void main()
{
sendchangecmd(); //讀取寄存器中存儲的溫度數據
init(); //LCD初始化
writecom(0x80); //選擇LCD第一行
writestring(table0, 16); //顯示當前溫度的英文字母
while(1)
{
lcd_display(); //掃描按鍵
}
}
復制代碼
作者:
admin
時間:
2016-12-6 17:00
你這個壓縮包里面有程序啊.
作者:
pomelo123
時間:
2016-12-12 20:24
好棒好棒!!!
作者:
pomelo123
時間:
2016-12-12 20:32
可是黑幣不夠 = =
作者:
pomelo123
時間:
2016-12-12 20:54
請問又沒有什么元件介紹什么的啊。謝謝拉
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久久www成人免费精品
|
婷婷中文网
|
91亚洲精品在线
|
日韩精品免费
|
日韩伦理一区二区
|
色天天综合
|
日韩在线小视频
|
国产午夜视频
|
a级一级片
|
国产乱码一区二区三区
|
色婷婷网
|
青青五月天
|
欧美另类综合
|
新香蕉视频
|
亚洲第一色网
|
亚洲视频一区在线观看
|
久久久在线
|
国产免费福利
|
国产精品视频一区二区三区
|
黄色一级片免费
|
久久香蕉网
|
黄色免费网
|
黄色免费在线看
|
成人毛片100免费观看
|
911看片
|
国产理论在线观看
|
日韩av在线免费看
|
www.狠狠操.com
|
午夜国产在线观看
|
91一区二区
|
日本在线看
|
欧美性生交xxxxx久久久
|
www.婷婷
|
91精品国产99久久久久久红楼
|
成人欧美一区二区三区黑人孕妇
|
国产成人亚洲精品自产在线
|
国产精品国产精品国产专区不片
|
亚洲国产三级
|
中文字幕在线资源
|
免费在线成人
|
可以免费看的av
|