原创 18B20+1602+字符移动

2008-3-28 18:15 2388 7 10 分类: MCU/ 嵌入式

点击下载根据网友的程序改编


 


18B20+液晶显示+字符移动(EDN51验证


 


呵呵,大家再优化哈吧,

文章评论3条评论)

登录后参与讨论

用户1587891 2009-7-9 23:29

//我请问的程序出了什么问题,串口不出温度 #include #define uchar unsigned char #define COM_TXD_BUFF_SIZE 50 #define COM_RXD_BUFF_SIZE 90 sbit TMDAT = P3^3; //根据实实际情况设定 sbit bb =P3^4; uchar TMP[4]; //读取后的4个温度值,将其除以2即可得出实际温度; uchar SN[4][8]; //4个器件的序列号,先读出单个序列号后填上才可以读取温度 uchar f[4]; //结果是否为负温,“0”为正温,“1”为负温。 ////////////////////////////////////////延时部分////////////////////////// void dmsec (unsigned int count) // { // unsigned int i; // while (count) // { // i = 115; // while (i>0) i--; // count--; // } // } // ////////////////////////////////////////////////////////////////////////// /////////////////////////////////////// 发送复位////////////////////////// void tmreset (void) // { // unsigned int i; // TMDAT = 0; // i = 103; // while (i>0) i--; // 延时 900 uS(11.0592Mhz时) // TMDAT = 1; // i = 4; // while (i>0) i--; // } // ////////////////////////////////////////////////////////////////////////// //判断DS1820是否存在的子程序。最好不要用,因为当器件不存在时将会进入死循环 ////////////////////////////////////// 等待存在脉冲/////////////////////// void tmpre (void) //判断器件是否存在 // { // unsigned int i; // while (TMDAT); // while (~TMDAT); // i = 4; while (i>0) i--; // } // ////////////////////////////////////////////////////////////////////////// ///////////////////////////////////// 读一位////////////////////////////// bit tmrbit (void) // { // unsigned int i; // bit dat; // TMDAT = 0; i++; // TMDAT = 1; i++; i++; //微量延时 // dat = TMDAT; // i = 8; while (i>0) i--; // 延时 // return (dat); // } // ////////////////////////////////////////////////////////////////////////// //////////////////////////////////////// 读一个字节/////////////////////// unsigned char tmrbyte (void) // { // unsigned char i,j,dat; // dat = 0; // for (i=1;i<=8;i++) // { // j = tmrbit (); // dat = (j << 7) | (dat >> 1); // } // return (dat); // } // ////////////////////////////////////////////////////////////////////////// /////////////////////////////////////// 写一个字节//////////////////////// void tmwbyte (unsigned char dat) // { // unsigned int i; // unsigned char j; // bit testb; // for (j=1;j<=8;j++) // { // testb = dat & 0x01; // dat = dat >> 1; // if (testb) // { // TMDAT = 0; // 写0 // i++; i++; // TMDAT = 1; // i = 8; while (i>0) i--; // } // else // { // TMDAT = 0; // 写0 // i = 8; while (i>0) i--; // TMDAT = 1; // i++; i++; // } // } // } // ////////////////////////////////////////////////////////////////////////// /////////////////////////////////发送ds1820 开始转换////////////////////// void tmstart (void) // { // tmreset (); //复位 // //tmpre (); //等待存在脉冲 // dmsec (1); //延时 // tmwbyte (0xcc); //跳过序列号命令,对所有器件有效 // tmwbyte (0x44); //发转换命令 44H, // } // ////////////////////////////////////////////////////////////////////////// //////////////////////////////////读取温度//////////////////////////////// void tmrtemp () // { // uchar i,j; // uchar a,b; // for(j=0;j<4;j++) // { // tmreset(); //复位 // dmsec(1); //延时 // tmwbyte(0x55); //发送ROM匹配命令 // for(i=0;i<8;i++) // { // tmwbyte(SN[j][i]); //发送64位序列号 // } // tmwbyte (0xbe); //发送读取命令 // a = tmrbyte (); //连续读取两位温度 // b = tmrbyte (); // f[j]=b; //若b为1则为负温 // if(f[j]) // { // TMP[j]=~a+1; //如果为负温则去除其补码 // } // else // { // TMP[j]=a; // } // } // } // ////////////////////////////////////////////////////////////////////////// //以下是读取器件序列号的子程序,需要读取序列时可在程序中调用; //调用时确保总线中只有一只器件,若有多个器件时则读取出来的号码无效; //将读取出来的序列号填到前面的数组中即可使用; //平时可以将此子程序删除以节约空间。 //////////////////////////读取器件序列号子程序//////////////////////////// void rom() // { // //以下是定义8个序列号变量 // uchar sn1; // uchar sn2; // uchar sn3; // uchar sn4; // uchar sn5; // uchar sn6; // uchar sn7; // uchar sn8; // // tmreset (); //复位 // dmsec (1); //延时 // tmwbyte(0x33); //发送读序列号子程序 // sn1=tmrbyte(); //读取第一个序列号,应为16H; // sn2=tmrbyte(); //读取第二个序列号,应为10H; // sn3=tmrbyte(); // sn4=tmrbyte(); // sn5=tmrbyte(); // sn6=tmrbyte(); // sn7=tmrbyte(); // sn8=tmrbyte(); // } // ////////////////////////////////////////////////////////////////////////// code uchar test[] ={0x1,0x2,0x3,0x4,0x5}; xdata uchar ComTxdBuf[COM_TXD_BUFF_SIZE ]; xdata uchar ComRxdBuf[COM_RXD_BUFF_SIZE ]; xdata unsigned char Frame[40]; xdata uchar TimeCount; xdata uchar ComTxdRead ; xdata uchar ComTxdWrite ; xdata uchar ComRxdRead ; xdata uchar ComRxdWrite; bit ComTxdBufempty ; bit Frame_End ; void ComPrintf(unsigned char lengh ,unsigned char * PData ); void Init_Device(); void Interrupts_Init(); void InitCom(unsigned char BaudRate); ////////////////////////////////////////////////////////////////////////// main() // { bb=0; Init_Device(); ComPrintf(5,&test[0]); // do{ // //rom(); //调用读序列号子程序 // tmstart(); // dmsec(100); //如果是不断地读取的话可以不延时 // tmrtemp(); //读取温度,执行完毕温度将存于TMP[]数组中// }while(1); // } // ////////////// //-------------------------------------------------------------------------- // com_int() interrupt 4 using 0 //-------------------------------------------------------------------------- void com_int() interrupt 4 using 0 { bit GetaFrame; unsigned char i,temp,tlength ; GetaFrame = 0; if( TI ) { //串口发送中断处理 TI=0; if(ComTxdRead!=ComTxdWrite)//发缓区有数据,继续发送数据 { SBUF=ComTxdBuf[ComTxdRead]; ComTxdRead++; if(ComTxdRead>=COM_TXD_BUFF_SIZE) ComTxdRead=0; if(ComTxdRead==ComTxdWrite) { ComTxdBufempty= 1; //ComSwithTxRx = 0; } } else { ComTxdBufempty=1; //ComSwithTxRx = 0; } } if (RI) { //串口接收中断处理 RI=0; temp=SBUF; ComRxdBuf[ComRxdWrite]=temp; if(temp == 0xd) { if(ComRxdWrite == 0) tlength = ComRxdBuf[COM_RXD_BUFF_SIZE-1]; else tlength = ComRxdBuf[ComRxdWrite-1]; if( tlength >= ComRxdWrite -1 ) { ComRxdRead = tlength -(ComRxdWrite -1); ComRxdRead = (COM_RXD_BUFF_SIZE -1)- ComRxdRead ; } else { ComRxdRead = ComRxdWrite-tlength-2; } if(ComRxdBuf[ ComRxdRead] == 0xa) GetaFrame = 1; } ComRxdWrite++; if(ComRxdWrite > COM_RXD_BUFF_SIZE-1) ComRxdWrite=0; if(GetaFrame) { Frame[0] = tlength ; for(i =0; i < tlength; i++) { ComRxdRead++; if(ComRxdRead>COM_RXD_BUFF_SIZE-1) ComRxdRead = 0; Frame[i+1] = ComRxdBuf[ComRxdRead]; } } } } void ComPrintf(unsigned char lengh ,unsigned char * PData ) //注:lengh要小于COM_TXD_BUFF_SIZE { unsigned char * Lpdata; unsigned char i,j; Lpdata = PData; j= lengh; for(i=0;i=COM_TXD_BUFF_SIZE) ComTxdWrite=0; Lpdata++; } if (ComTxdBufempty==1) { TI = 1; } } void InitCom(unsigned char BaudRate) { unsigned char THTL; switch (BaudRate) { case 1: THTL = 64; break; //波特率300 case 2: THTL = 160; break; //600 case 3: THTL = 208; break; //1200 case 4: THTL = 232; break; //2400 case 5: THTL = 244; break; //4800 case 6: THTL = 250; break; //9600 case 7: THTL = 253; break; //19200 case 8: THTL = 255; break; //57600 default: THTL = 243;//晶振为12M,波特率4800. } SCON = 0x50; //串口方式1,允许接收 TMOD = 0x20; //定时器1定时方式2 TCON = 0x40; //设定时器1开始计数 TH1 = THTL; TL1 = THTL; PCON = 0x80; //波特率加倍控制,SMOD位 RI = 0; //清收发标志 TI = 0; TR1 = 1; //启动定时器 } void Interrupts_Init() { IE=0x90; } void Init_Device() { InitCom(9600); Interrupts_Init(); }

jizzll_617398179 2008-3-28 21:36

是温度传感器

用户789411 2008-3-28 20:41

18B20也是某种液晶型号吗
相关推荐阅读
jizzll_617398179 2010-02-08 10:53
正确理解A/D转换器的输入
http://www.freescale.com.cn/tech_ariticles/2005/1102_1.asp 许多嵌入式应用都会用到A/D转换器。然而,如果错误连接了A/D转换器输入端的电路,...
jizzll_617398179 2010-01-12 13:37
好久没来,都长草了
好久没来,都长草了,呵呵。整天忙得很,不过估计再过两个月会轻松点~\(≧▽≦)/~啦啦啦...
jizzll_617398179 2009-03-16 21:57
很奇怪,我收到站内信,但是却找不到发信人呢
发信人是个[],点击就跳到我自己的主页了。只好在这里给那位朋友留言了。 我不知道你说的哪篇文章,还有我也不知道你的EDN的ID。你可以在博客上面留言的。...
jizzll_617398179 2009-03-14 13:08
如何在EXCEL中使用16进制数
最近需要计算串口发送的数据,太多而且比较麻烦。知道EXECL功能强大,所以网上找了找,刚好,不错,很方便。网上找到的http://hi.bccn.net/space-99452-do-blog-id-...
jizzll_617398179 2009-03-05 14:37
〖常识〗不同晶振的最大波特率及其误差
最近犯了个错误,呵呵,晶振和波特率的问题,特查了记在这里,O(∩_∩)O~〖常识〗不同晶振的最大波特率及其误差http://www.aoxue.org/bbs/read.php?tid=65585不同...
jizzll_617398179 2009-02-11 14:30
大端模式和小端模式
转载http://www.cnblogs.com/TsuiLei/archive/2008/10/29/1322504.html大端格式:在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则...
我要评论
3
7
关闭 站长推荐上一条 /2 下一条