欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
藍(lán)橋杯2012年初賽題目+答案,串口設(shè)置溫度報(bào)警+DS1302顯示時(shí)間
[打印本頁]
作者:
大力做大力愛
時(shí)間:
2018-1-13 16:13
標(biāo)題:
藍(lán)橋杯2012年初賽題目+答案,串口設(shè)置溫度報(bào)警+DS1302顯示時(shí)間
選用材料為藍(lán)橋杯官方提供的開發(fā)板。
因?yàn)榇税暹x用了4塊74LS573芯片用于鎖存P0口信號,這種設(shè)計(jì)可節(jié)約很多的i/0口,與市面上很多的開發(fā)板不一樣,所以如果要換到其他開發(fā)板上使用,需要改一下顯示代碼 和LED亮滅代碼,但是大致思路不變,只要改變一下那幾個(gè)比較特殊的使用到了573鎖存來編程的函數(shù)即可。
我也是一名菜雞 如果有那個(gè)大神有更好的編程思路的話 那就拜托大神賜教了。
設(shè)計(jì)要求如下:
1、 讀取DS18B20溫度,在數(shù)碼管的最后兩位顯示。
2、讀取DS1302時(shí)間,初始化為13:30。在數(shù)碼管的高五位顯示,格式為:13-30
3、其余沒用到的數(shù)碼管滅。
4、通過串口設(shè)置DS18B20溫度上限和下限,設(shè)置格式為:30-28,其中30是高溫上限,28是低溫下限
5、采集DS18B20溫度,通過串口上傳實(shí)時(shí)數(shù)據(jù)給上位機(jī)。
6、當(dāng)溫度超過上限,LED1隔1秒亮一次。超過下限,LED2隔1秒亮一次。
7、串口波特率一律用2400bps
效果圖:
1.png
(36.23 KB, 下載次數(shù): 46)
下載附件
2018-1-13 16:09 上傳
3.jpg
(138.65 KB, 下載次數(shù): 37)
下載附件
2018-1-13 16:09 上傳
代碼如下:
#include<reg52.h>
#include<intrins.h> //_nop_()延時(shí)函數(shù)頭文件
#define uchar unsigned char
#define uint unsigned int
sfr AUXR=0x8e; //定義stc15芯片的特殊寄存器AUXR地址 因?yàn)椴捎玫氖?2的頭文件 如果采用15的頭文件擇不用設(shè)置
// 如果改為51系列芯片的話只需刪掉這行然后把定時(shí)器和中斷的初始化函數(shù)改掉 此寄存器的作用在此為設(shè)置定時(shí)器速度為1T還是12T模式
sbit DQ=P1^4; //溫度引腳
sbit CE=P1^3; //1302芯片引腳
sbit SCL=P1^7;
sbit io=P2^3;
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF}; //共陽數(shù)碼管數(shù)值
// 0, 1 , 2 , 3 , 4 ........ — ,關(guān)顯示
uchar dspbuf[]={11,11,11,11,11,11,11,11}; //顯示緩沖區(qū)
uchar DSP;
uchar zi[]={"wendu:"}; //串口發(fā)送數(shù)據(jù)
uchar jieshou[6];
uchar zd4_add;
uchar max,min;
uchar cmd_ds[3]; //接收1302時(shí)間
uchar int_ds[]={30,13,0,0,0,0}; //初始化1302
uchar temp;
uint sec_add;
bit sec_flag;
bit sz_flag;
void int_t0(); //定時(shí)器t0初始化
void int_chuankou(); //串口初始化
void display();
//*********************1302*****************************************//
void DS1302_wuchar(uchar cmd); //寫一個(gè)字節(jié)到1302
uchar DS1302_ruchar(); //讀取一個(gè)字節(jié)
void write_DS1302(uchar cmd,uchar dat); //寫dat數(shù)據(jù)到cmd寄存器地址
uchar red_DS1302(uchar cmd); //讀取cmd地址中的數(shù)據(jù)
void red_ds(); //讀取全部時(shí)間
void int_DS1302(); //初始化1302
//***********************溫度函數(shù)**********************************//
void w_18(uchar cmd); //寫cmd到1820
uchar r_18(); //讀取一個(gè)字節(jié)
uchar red_18(); //讀取溫度
void int_18(); //初始化溫度
void Delay500us(); //延時(shí)
void Delay100us();
void open_led1(); //開LED1
void cls_led1(); //關(guān)LED1
void open_led2();
void cls_led2();
void ckfz(); //串口發(fā)送
void main()
{
max=30; //初始最大值與最小值
min=28;
int_t0(); //初始化定時(shí)器t0
int_DS1302(); //初始化1302
int_chuankou(); //串口初始化
while(1)
{
temp=red_18(); //讀取溫度
red_ds(); //讀取時(shí)間
dspbuf[6]=temp/10; //顯示
dspbuf[7]=temp%10; //顯示格式為 xx—xx xx
dspbuf[0]=cmd_ds[1]/10;
dspbuf[1]=cmd_ds[1]%10;
dspbuf[2]=10; //顯示橫杠
dspbuf[3]=cmd_ds[0]/10;
dspbuf[4]=cmd_ds[0]%10;
ckfz(); //串口發(fā)送溫度到PC
if(sz_flag) //如果串口接收到修改最大值最小值指令 sz_flag會由0變1 最大值與最小值更新
{
max=jieshou[0]*10+jieshou[1];
min=jieshou[3]*10+jieshou[4];
sz_flag=0; //標(biāo)志位清零
}
// dspbuf[6]=jieshou[0];
// dspbuf[7]=jieshou[1];
// dspbuf[2]=jieshou[2];
// dspbuf[3]=jieshou[3];
// dspbuf[4]=jieshou[4];
}
}
void t0() interrupt 1
{
sec_add++;
if(sec_add==1000) //1s
{
sec_add=0;
sec_flag=~sec_flag; //1秒標(biāo)志位
}
if(temp>max) //如果溫度大于最大值 LED1隔1秒閃爍
{
if(sec_flag)
{open_led1();}
else
{cls_led1();}
}
if(temp<min) //如果溫度小于最小值 LED2隔1秒閃爍
{
if(sec_flag)
{open_led2();}
else
{cls_led2();}
}
display(); //中斷刷新顯示函數(shù)
}
void ck() interrupt 4 //串口接收中斷
{
if(RI) //如果RI接收標(biāo)志位為1
{
EA=0;
RI=0;
jieshou[zd4_add]=SBUF-48; //接收 xx-xx格式數(shù)據(jù) 5個(gè)字節(jié) 串口應(yīng)為文本發(fā)送 因?yàn)樽址? 代表十進(jìn)制48 所以應(yīng)減去48 才是10進(jìn)制的0
zd4_add++;
if(zd4_add==5) //接收5次
zd4_add=0;
EA=1;
}
sz_flag=1; //單片機(jī)接收到數(shù)據(jù)時(shí) sz_flag=1
}
void int_t0()
{
AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0x9A; //設(shè)置定時(shí)初值 //1ms延時(shí)
TH0 = 0xA9; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
EA=1;
ET0=1;
}
void int_chuankou() //2400波特率
{
SCON = 0x50; //8位數(shù)據(jù),可變波特率
AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T
AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器
TMOD &= 0x0F; //設(shè)定定時(shí)器1為16位自動重裝方式
TL1 = 0x80; //設(shè)定定時(shí)初值
TH1 = 0xFB; //設(shè)定定時(shí)初值
ET1 = 0; //關(guān)閉定時(shí)器1中斷
ES=1; //開啟串口中斷
TR1 = 1; //啟動定時(shí)器1
}
void display() //顯示函數(shù)
{
P2=(P2&0x1f)|0xe0; //關(guān)顯示
P0=0xff;
P2&=0X1F;
P2=(P2&0x1f)|0xc0; //位選
P0=1<<DSP;
P2&=0X1F;
P2=(P2&0x1f)|0xe0; //查表顯示
P0=tab[dspbuf[DSP]];
P2&=0X1F;
DSP++;
if(DSP==8)
DSP=0;
}
//******************溫度函數(shù)************************//
void int_18() //初始化溫度傳感器
{
DQ = 0;
Delay500us();// 延時(shí)大于480us
DQ = 1;
Delay500us();
}
void w_18(uchar cmd)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=cmd&0x01; //從低位寫起
Delay100us();
DQ=1;
cmd>>=1;
}
}
uchar r_18()
{
uchar num,i;
for(i=0;i<8;i++)
{
DQ=0; //溫度從低位讀起
num>>=1;
DQ=1;
if(DQ)
{
num=num|0x80;
}
Delay100us();
}
return num;
}
uchar red_18()
{
uchar low,high,num;
int_18();
w_18(0xcc);
w_18(0x44);
// Delayus(200);
int_18();
w_18(0xcc);
w_18(0xbe);
low=r_18(); //先讀低八位
high=r_18();
num=high<<4;
num=num|(low>>4);
return num;
}
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
void Delay100us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
//**************DS1302****************//
void int_DS1302() //初始化DS1302,把int_ds[]數(shù)組里的數(shù)寫入相應(yīng)時(shí)間寄存器地址
{
write_DS1302(0x8e,0x00); //寫保護(hù)關(guān)
write_DS1302(0x80,int_ds[0]);
write_DS1302(0x82,int_ds[1]);
write_DS1302(0x8e,0x80); //寫保護(hù)開
}
void DS1302_wuchar(uchar cmd)
{
uchar i;
for(i=0;i<8;i++)
{
SCL=0;
io=cmd&0x01;
SCL=1;
cmd>>=1;
}
}
uchar DS1302_ruchar()
{
uchar dat,i;
for(i=0;i<8;i++)
{
SCL=0;
dat>>=1;
if(io)
dat|=0x80;
SCL=1;
}
return dat;
}
void write_DS1302(uchar cmd,uchar dat)
{
uchar x;
CE=0;
SCL=0;
CE=1;
DS1302_wuchar(cmd);
x=(dat/10<<4)|(dat%10);//十進(jìn)制轉(zhuǎn)換十六進(jìn)制
DS1302_wuchar(x);
CE=0;
}
uchar red_DS1302(uchar cmd)
{
uchar dat;
uchar dat1,dat2;
CE=0;
SCL=0;
CE=1;
DS1302_wuchar(cmd);
dat=DS1302_ruchar();
dat1=dat/16; //十六進(jìn)制轉(zhuǎn)十進(jìn)制
dat2=dat%16;
dat=dat1*10+dat2;
io=0;
CE=0;
return dat;
}
void red_ds()
{
write_DS1302(0x8e,0x00);
cmd_ds[0]=red_DS1302(0x81);
cmd_ds[1]=red_DS1302(0x83);
write_DS1302(0x8e,0x80);
}
void ckfz()
{
uchar i;
if(sec_flag)
{
for(i=0;i<6;i++) //發(fā)送溫度數(shù)據(jù)到PC
{
SBUF=zi[i];
while(TI==0);
TI=0;
}
SBUF=temp/10+0x30;//(temp/10)<<4|(temp%10);
while(TI==0);
TI=0;
SBUF=temp%10+0x30;//(temp/10)<<4|(temp%10);
while(TI==0);
TI=0;
SBUF='\n';
while(TI==0);
TI=0;
sec_flag=0;
}
}
void open_led1()
{
P2=(P2&0x1f)|0x80;
P0=0x7f;
P2&=0x1f;
}
void cls_led1()
{
P2=(P2&0x1f)|0x80;
P0=0xff;
P2&=0x1f;
}
void open_led2()
{
P2=(P2&0x1f)|0x80;
P0=0xbf;
P2&=0x1f;
}
void cls_led2()
{
P2=(P2&0x1f)|0x80;
P0=0xff;
P2&=0x1f;
}
復(fù)制代碼
附上代碼和原理圖
2012.rar
(312.39 KB, 下載次數(shù): 25)
2018-1-13 16:13 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1