完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #endif //--重定义函数变量--// #define uchar unsigned char #define uint unsigned int #define ulong unsigned long //--定义SPI要使用的 IO--// ***it MOSIO = P3^4; ***it R_CLK = P3^5; ***it S_CLK = P3^6; //---全局变量声明--// ulong column; //点阵列 ulong row; //点阵行 ulong dt; int k,tempge,tempshi,temp; //int high=416,low=400; int state; //--定义使用的IO口--// ***it DSPORT=P3^7; ***it Beep = P1^5 ; ***it set=P2^4; ***it add=P2^3; ***it dec=P2^2; uchar code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00}; uchar code tab1[] = {0, 0, 0, 0, 0, 12, 0, 18, 0, 33, 0, 33, 0, 33, 0, 33, 0, 33, 0, 33, 0, 33, 0, 18, 0, 12, 0, 0, 0, 0, 0, 0}; uchar code tab2[] = {0, 0, 0, 0, 0, 8, 0, 12, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 28, 0, 0, 0, 0, 0, 0}; uchar code tab3[] = {0, 0, 0, 0, 0, 28, 0, 34, 0, 33, 0, 32, 0, 16, 0, 16, 0, 8, 0, 4, 0, 66, 0, 33, 0, 63, 0, 0, 0, 0, 0 ,0}; uchar code tab4[] = {0, 0, 0, 0, 0, 28, 0, 34, 0, 32, 0, 16, 0, 12, 0, 16, 0, 32, 0, 32, 0, 32, 0, 17, 0, 14, 0, 0, 0, 0, 0, 0}; uchar code tab5[] = {0, 0, 0, 0, 0, 16, 0, 24, 0, 20, 0, 20, 0, 18, 0, 18, 0, 17, 0, 63, 0, 16, 0, 16, 0, 16, 0, 0, 0, 0, 0, 0}; uchar code tab6[] = {0, 0, 0, 0, 0, 62, 0, 2, 0, 2, 0, 14, 0, 16, 0, 32, 0, 32, 0, 32, 0, 32, 0, 17, 0, 14, 0, 0, 0, 0, 0, 0}; uchar code tab7[] = {0, 0, 0, 0, 0, 60, 0, 2, 0, 1, 0, 13, 0, 19, 0, 33, 0, 33, 0, 33, 0, 33, 0, 18, 0, 12, 0, 0, 0, 0, 0, 0}; uchar code tab8[] = {0, 0, 0, 0, 0, 63, 0, 33, 0, 17, 0, 16, 0, 16, 0, 8, 0, 8, 0, 8, 0, 4, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0}; uchar code tab9[] = {0, 0, 0, 0, 0, 12, 0, 18, 0, 33, 0, 33, 0, 18, 0, 12, 0, 18, 0, 33, 0, 33, 0, 18, 0, 12, 0, 0, 0, 0, 0, 0}; uchar code tab10[] = {0, 0, 0, 0, 0, 12, 0, 18, 0, 33, 0, 33, 0, 33, 0, 33, 0, 50, 0, 44, 0, 16, 0, 8, 0, 7, 0, 0, 0, 0, 0, 0}; uchar code tab11[] = {0, 4, 252, 15, 4, 4, 252, 7, 4, 4, 252, 7, 0, 0, 252, 7, 64, 0, 255, 63, 160, 0, 16, 1, 12, 6, 3, 56, 0, 0, 0, 0}; uchar code tab00[] = {0, 0, 0, 0, 12, 0, 18, 0, 33, 0, 33, 0, 33, 0, 33, 0, 33, 0, 33, 0, 33, 0, 18, 0, 12, 0, 0, 0, 0, 0, 0, 0}; uchar code tab01[] = {0, 0, 0, 0, 8, 0, 12, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 28, 0, 0, 0, 0, 0, 0, 0}; uchar code tab02[] = {0, 0, 0, 0, 28, 0, 34, 0, 33, 0, 32, 0, 16, 0, 16, 0, 8, 0, 4, 0, 66, 0, 33, 0, 63, 0, 0, 0, 0, 0, 0, 0}; uchar code tab03[] = {0, 0, 0, 0, 28, 0, 34, 0, 32, 0, 16, 0, 12, 0, 16, 0, 32, 0, 32, 0, 32, 0, 17, 0, 14, 0, 0, 0, 0, 0, 0, 0}; uchar code tab04[] = {0, 0, 0, 0, 16, 0, 24, 0, 20, 0, 20, 0, 18, 0 ,18, 0, 17, 0, 63, 0, 16, 0, 16, 0, 16, 0, 0, 0, 0, 0, 0, 0}; uchar code tab05[] = {0, 0, 0, 0, 62, 0, 2, 0, 2, 0, 14, 0, 16, 0, 32, 0, 32, 0, 32, 0, 32, 0, 17, 0, 14, 0, 0, 0, 0, 0, 0, 0}; uchar code tab06[] = {0, 0, 0, 0, 60, 0, 2, 0, 1, 0, 13, 0, 19, 0, 33, 0, 33, 0, 33, 0, 33, 0, 18, 0, 12, 0, 0, 0, 0, 0, 0, 0}; uchar code tab07[] = {0, 0, 0, 0, 63, 0, 33, 0, 17, 0, 16, 0, 16, 0, 8, 0, 8, 0, 8, 0, 4, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0}; uchar code tab08[] = {0, 0, 0, 0, 12, 0, 18, 0, 33, 0, 33, 0, 18, 0, 12, 0, 18, 0, 33, 0, 33, 0, 18, 0, 12, 0, 0, 0, 0, 0, 0, 0}; uchar code tab09[] = {0, 0, 0, 0, 12, 0, 18, 0, 33, 0, 33, 0, 33, 0, 33, 0, 50, 0, 44, 0, 16, 0, 8, 0, 7, 0, 0, 0, 0, 0, 0, 0}; //--声明全局函数--// void xianshige(); void xianshiten(); void keyscan(); void delay(unsigned int i); void buzz(); void alarm(); void HC595SendData( uchar BT3, uchar BT2,uchar BT1,uchar BT0); void Delay1ms(uint ); uchar Ds18b20Init(); void Ds18b20WriteByte(uchar com); uchar Ds18b20ReadByte(); void Ds18b20ChangTemp(); void Ds18b20ReadTempCom(); int Ds18b20ReadTemp(); void LcdDisplay(int temp); void main() { while(1) { if(state==0) { LcdDisplay(Ds18b20ReadTemp()); alarm(); // Delay1ms(1000);//1s钟刷一次 keyscan(); } else keyscan(); } } void LcdDisplay(int temp) //lcd显示 { float tp; if(temp< 0) //当温度值为负数 { //因为读取的温度是实际温度的补码,所以减1,再取反求出原码 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算由?.5,还是在小数点后面。 } else { tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 } tempshi=temp % 10000 / 1000; tempge= temp % 1000 / 100; for(k = 0; k < 16; k++) { xianshiten(); xianshige(); } } /******************************************************************************* * 函 数 名 : Delay1ms * 函数功能 : 延时函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Delay1ms(uint y) { uint x; for( ; y>0; y--) { for(x=110; x>0; x--); } } /******************************************************************************* * 函 数 名 : Ds18b20Init * 函数功能 : 初始化 * 输 入 : 无 * 输 出 : 初始化成功返回1,失败返回0 *******************************************************************************/ uchar Ds18b20Init() { uchar i; DSPORT = 0; //将总线拉低480us~960us i = 70; while(i--);//延时642us DSPORT = 1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低 i = 0; while(DSPORT) //等待DS18B20拉低总线 { i++; if(i>5)//等待>5MS { return 0;//初始化失败 } Delay1ms(1); } return 1;//初始化成功 } /******************************************************************************* * 函 数 名 : Ds18b20WriteByte * 函数功能 : 向18B20写入一个字节 * 输 入 : com * 输 出 : 无 *******************************************************************************/ void Ds18b20WriteByte(uchar dat) { uint i, j; for(j=0; j<8; j++) { DSPORT = 0; //每写入一位数据之前先把总线拉低1us i++; DSPORT = dat & 0x01; //然后写入一个数据,从最低位开始 i=6; while(i--); //延时68us,持续时间最少60us DSPORT = 1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值 dat >>= 1; } } /******************************************************************************* * 函 数 名 : Ds18b20ReadByte * 函数功能 : 读取一个字节 * 输 入 : com * 输 出 : 无 *******************************************************************************/ uchar Ds18b20ReadByte() { uchar byte, bi; uint i, j; for(j=8; j>0; j--) { DSPORT = 0;//先将总线拉低1us i++; DSPORT = 1;//然后释放总线 i++; i++;//延时6us等待数据稳定 bi = DSPORT; //读取数据,从最低位开始读取 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/ byte = (byte >> 1) | (bi << 7); i = 4; //读取完之后等待48us再接着读取下一个数 while(i--); } return byte; } /******************************************************************************* * 函 数 名 : Ds18b20ChangTemp * 函数功能 : 让18b20开始转换温度 * 输 入 : com * 输 出 : 无 *******************************************************************************/ void Ds18b20ChangTemp() { Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0x44); //温度转换命令 // Delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了 } /******************************************************************************* * 函 数 名 : Ds18b20ReadTempCom * 函数功能 : 发送读取温度命令 * 输 入 : com * 输 出 : 无 *******************************************************************************/ void Ds18b20ReadTempCom() { Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0xbe); //发送读取温度命令 } /******************************************************************************* * 函 数 名 : Ds18b20ReadTemp * 函数功能 : 读取温度 * 输 入 : com * 输 出 : 无 *******************************************************************************/ int Ds18b20ReadTemp() { int temp = 0; uchar tmh, tml; Ds18b20ChangTemp(); //先写入转换命令 Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令 tml = Ds18b20ReadByte(); //读取温度值共16位,先读低字节 tmh = Ds18b20ReadByte(); //再读高字节 temp = tmh; temp <<= 8; temp |= tml; return temp; } /******************************************************************************* * 函 数 名 : HC595SendData * 函数功能 : 通过595发送四个字节的数据 * 输 入 : BT3:第四个595输出数值 * * BT2: 第三个595输出数值 * * BT1:第二个595输出数值 * * BT0:第一个595输出数值 * 输 出 : 无 *******************************************************************************/ void HC595SendData( uchar BT3, uchar BT2,uchar BT1,uchar BT0) { uchar i; //--发送第一个字节--// for(i=0;i<8;i++) { MOSIO = BT3 >> 7 ; //从高位到低位 BT3 <<= 1; S_CLK = 0; S_CLK = 1; } //--发送第一个字节--// for(i=0;i<8;i++) { MOSIO = BT2 >>7; //从高位到低位 BT2 <<= 1; S_CLK = 0; S_CLK = 1; } //--发送第一个字节--// for(i=0;i<8;i++) { MOSIO = BT1 >> 7; //从高位到低位 BT1 <<= 1; S_CLK = 0; S_CLK = 1; } //--发送第一个字节--// for(i=0;i<8;i++) { MOSIO = BT0 >> 7; //从高位到低位 BT0 <<= 1; S_CLK = 0; S_CLK = 1; } //--输出--// R_CLK = 0; //set dataline low R_CLK = 1; //片选 R_CLK = 0; //set dataline low } void xianshige() { switch(tempge) { case 0: HC595SendData(~tab1[2*k +1],~tab1[2*k],tab0[2*k],tab0[2*k + 1]); break; case 1: HC595SendData(~tab2[2*k +1],~tab2[2*k],tab0[2*k],tab0[2*k + 1]); break; case 2: HC595SendData(~tab3[2*k +1],~tab3[2*k],tab0[2*k],tab0[2*k + 1]); break; case 3: HC595SendData(~tab4[2*k +1],~tab4[2*k],tab0[2*k],tab0[2*k + 1]); break; case 4: HC595SendData(~tab5[2*k +1],~tab5[2*k],tab0[2*k],tab0[2*k + 1]); break; case 5: HC595SendData(~tab6[2*k +1],~tab6[2*k],tab0[2*k],tab0[2*k + 1]); break; case 6: HC595SendData(~tab7[2*k +1],~tab7[2*k],tab0[2*k],tab0[2*k + 1]); break; case 7: HC595SendData(~tab8[2*k +1],~tab8[2*k],tab0[2*k],tab0[2*k + 1]); break; case 8: HC595SendData(~tab9[2*k +1],~tab9[2*k],tab0[2*k],tab0[2*k + 1]); break; case 9: HC595SendData(~tab10[2*k +1],~tab10[2*k],tab0[2*k],tab0[2*k + 1]); break; } } void xianshiten() { switch(tempshi) { case 0: HC595SendData(~tab00[2*k +1],~tab00[2*k],tab0[2*k],tab0[2*k + 1]); break; case 1: HC595SendData(~tab01[2*k +1],~tab01[2*k],tab0[2*k],tab0[2*k + 1]); break; case 2: HC595SendData(~tab02[2*k +1],~tab02[2*k],tab0[2*k],tab0[2*k + 1]); break; case 3: HC595SendData(~tab03[2*k +1],~tab03[2*k],tab0[2*k],tab0[2*k + 1]); break; case 4: HC595SendData(~tab04[2*k +1],~tab04[2*k],tab0[2*k],tab0[2*k + 1]); break; case 5: HC595SendData(~tab05[2*k +1],~tab05[2*k],tab0[2*k],tab0[2*k + 1]); break; case 6: HC595SendData(~tab06[2*k +1],~tab06[2*k],tab0[2*k],tab0[2*k + 1]); break; case 7: HC595SendData(~tab07[2*k +1],~tab07[2*k],tab0[2*k],tab0[2*k + 1]); break; case 8: HC595SendData(~tab08[2*k +1],~tab08[2*k],tab0[2*k],tab0[2*k + 1]); break; case 9: HC595SendData(~tab09[2*k +1],~tab09[2*k],tab0[2*k],tab0[2*k + 1]); break; } } void alarm() { int tmp; tmp=Ds18b20ReadTemp(); if(tmp<=400||tmp>=432) {buzz();} else {Beep=0;} } void buzz() { Beep= 1; delay(5); Beep= 0; delay(5); } void delay(unsigned int i) { char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); } void keyscan() { int state; if(set==0) { while(1) { delay(500); if(set==0) { state++; while(!set) LcdDisplay(Ds18b20ReadTemp()); } if(state==2) { temp=high; LcdDisplay(temp); if(add==0) { while(!add) LcdDisplay(temp); high+=1; } if(dec==0) { while(!dec) LcdDisplay(temp); high-=1; } } if(state==3) { temp=low; LcdDisplay(temp); if(add==0) { while(!add) LcdDisplay(temp); low+=1; } if(dec==0) { while(!dec) LcdDisplay(temp); low-=1; } } if(state==1) { for(k = 0; k < 16; k++) { HC595SendData(~tab11[2*k +1],~tab11[2*k],tab0[2*k],tab0[2*k + 1]); } } if(state>=4) { state=0; break; } } } } |
|
相关推荐
6个回答
|
|
虽然有点长,但是谢谢各位大神,帮我看下,我很着急
|
|
|
|
好心的大神们,帮我看下。
|
|
|
|
|
|
这个东西太要命了,一点层次感没有不说,还没有工程文件!
|
|
|
|
路过。。。。。。。。。。。。。
|
|
|
|
楼主问题解决了嘛
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
4244 浏览 3 评论
5530 浏览 1 评论
5807 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
7533 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1212 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-18 21:14 , Processed in 0.617824 second(s), Total 86, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号