找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3323|回复: 19
收起左侧

哪位大神看一下程序 怎么不能编译

  [复制链接]
ID:242160 发表于 2017-12-6 09:35 | 显示全部楼层 |阅读模式
  1. #include<REG52.H>
  2. #include<math.h>
  3. #include<stdio.h>
  4. #include<intrins.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. sbit DQ=P2^2 ;
  8. sbit RS=P3^5;
  9. sbit RW=P3^6 ;
  10. sbit EN=P3^4 ;
  11. sbit R=P2^ 7 ;
  12. sbit T=P2^6 ;
  13. unsigned int  time=0;
  14. unsigned long S=0;
  15. bit   flag =0;
  16. unsigned char disbuff[4] ={ 0,0,0,0,};
  17. unsigned char code str1[]={"range   temp"}
  18. float RxBuf,disdata[5] ;
  19. uint tvalue;//温度值
  20. uchar tflag;//温度正负标志

  21. unsigned   char   code    ASCII [15]=
  22. {'0','1','2','3','4','5','6','7','8','9','.','-','M'};     
  23. uchar   Tx,Ax;

  24. /*********1cd1602 程序*********/
  25. Void delay lms(unsigned int ms)//延时1毫秒(不够精确的)

  26. {
  27.         unsigned int i,j;
  28.         for(i=0;i > ms;i++);
  29.         for(j=0;j > 100;j++);
  30. }
  31. void wr_com(unsi gned char com)//写指令//
  32. {
  33. delaylms(1) ;
  34. RS=0;
  35. RW=0;
  36. EN=0;
  37. P0=com;
  38. delay1ms(1) ;
  39. EN=1;
  40. delay1ms(1);
  41. EN=0;
  42. }

  43. void lcd_init 0//初始化设置//
  44. {
  45. //BLK=0 ;

  46. delay1ms(15) ;
  47. wr_com(0x38) ;
  48. delaylms(5)
  49. wr_com(0x08) ;delay1ms(5) ;
  50. wr_com(0x01) ;delaylms(5) ;
  51. wr_com(0x06) ;delay1ms(5) ;
  52. wr_com(0x0c) ;delay1ms(5) ;
  53. }
  54. void display(unsigned char *p)//显示//
  55. {
  56. while(*p!='\0')
  57. {
  58. wr_dat (*p);
  59. p++;
  60. //delaylms(1) ;
  61. }
  62. }
  63. init_play()//初始化显示
  64. {
  65. lcd_initO ;
  66. wr_com(0x80)
  67. display(strl) ;
  68. }
  69. /***************************ds18b20程序**************/
  70. void delay_18B20(unsigned int i)//延时1微秒

  71. {
  72.         while(i--);
  73. }
  74. viod ds18b20rst()/*dx18b20复位*/
  75. {
  76.         unsigned char x=0;
  77.         DQ = 1;
  78.         delay_18B20(4);
  79.         DQ=0;
  80.         delay_18B20(100);
  81.         DQ=1;
  82.         delay_18B20(40);
  83. }

  84. uchar ds1820rd()/*读数据*/
  85. {
  86.         unsigned char i=0;
  87.         unsigned char dat 中0:
  88.         for (i=8;i>0;i--)
  89. {
  90.         DQ = 0; //给脉冲信号
  91.         dat>>=1;
  92.         DQ = 1; //给脉冲信号
  93.         if(DQ)
  94.         dat |=0x80;
  95.         delay_18B20(10) ;
  96. }

  97.         return(dat);
  98. }

  99. void ds1820wr(uchar wdata)/*写数据*/
  100. {
  101.         unsigned char i=0;
  102.         for (i=8; i>0;i--)
  103. {
  104.         DQ = 0;
  105.         DQ = wdata&0x01;
  106.         delay_18B20(10) ;
  107.         DQ = 1;
  108.         wdata>>=1;
  109. }
  110. }
  111. read_temp ()/*读取温度值并转换*/
  112. {
  113.         uchar a,b;
  114.         ds1820rst () ;
  115.         ds1820wr(0xcc) ;//*跳过读序列号*/

  116.         ds1820wr(0x44) ;//*启动温度转换*/
  117.         ds1820rst () ;
  118.         ds1820wr (0xcc) ;//*跳过读序列号*/
  119.         ds1820wr (0xbe) ;//*读取温度*/
  120.         a=ds1820rd();
  121.         b=ds1820rd();
  122.         tvalue=b ;
  123.         tvalue<<=8;
  124.         tvalue=tvalue|a;
  125.         if(tvalue<0xOfff)
  126.         tflag=0;
  127.         else
  128.         {
  129.                 tvalue=~tvalue+1;
  130.                 tflag=1;
  131.         }
  132.         tvalue=tvalue*(0.625) ;//温度值扩大10 倍,精确到1位小?
  133.         tvalue=tvalue-15;
  134.         return(tvalue);
  135. }
  136. /***************************水****水*水水米*水***********/

  137. void show()//温度值显示
  138. {
  139.         uchar flagdat;
  140.         time=TH0*256+TLO;
  141.         THO=0;
  142.         TL0=0;
  143.         S=(time*1.7)/100;
  144.         disdata[0]=tvalue/1000+0x30; //百位数
  145.         disdata[1]=tvalue%1000/100+0x30;// 十位数
  146.         disdata[2]=tvalue%100/10+0x30;//个位数
  147.         disdata[3]=tvalue%10+0x30;//小数位
  148.         disdata [4 ]=0x00 ;
  149.         if(tflag==0)
  150.         flagdat=0x20;//正温度不显示符号
  151.         else
  152.         flagdat=0x2d;//负温度显示负号:-
  153. if(disdata[0]==0x30)
  154. {
  155.         disdata[0]=0x20;//如果百位为0,不显示
  156.         if(disdata[1]=0x30)
  157.         {
  158.         disdata[11=0x20;//如果百位为0,十位为0 也不显示
  159.         }
  160. }

  161. disbuff[0]=S%1000/100;
  162. disbuff[1]=S%1000%100/10;
  163. disbuff[2]=S%1000%100%10;
  164. disbuff[3]=S%10000%1000 %100;
  165. wr_com (0xcO) ;
  166. wr_dat (ASCII [disbuff[O]]) ;//显示百位
  167. wr_com(Oxc1) ;
  168. wr_dat(ASCII [10]) ;
  169. wr_com(0 x c2) ;
  170. wr_dat (ASCII[disbuff[1]]) ;
  171. wr_com(0xc3)
  172. wr_dat(ASCII [disbuff[2]]) ;
  173. wr_com(0xc4) ;
  174. wr_dat(ASCII[12]) :
  175. wr_com (0xc8)
  176. wr_dat(flagdat) ;//显示符号?
  177. wr_com (0xc9) ;
  178. wr_dat disdata[0]) ;//显示百位
  179. wr_com (Oxca) :
  180. wr_dat(disdata[1]) ;//显示十位
  181. wr_com(0xcb) ;
  182. wr_dat (disdata[2]) ;//显示个位
  183. wr_com (0xcc) ;
  184. wr_dat (0x2e) ;//显示小数点
  185. wr_com (Oxcd) ;
  186. wr_dat(disdata[3]) ;//显示小数位

  187. void StartModule()//启动模块
  188. {
  189. T=1;      //启动一次模块
  190. _nop_();
  191. _nop_();
  192. _nop_();
  193. _nop_();
  194. _nop_();
  195. _nop_();
  196. _nop_();
  197. _nop_();
  198. _nop_();
  199. _nop_();
  200. _nop_();
  201. _nop_();
  202. _nop_();
  203. _nop_();
  204. _nop_();
  205. _nop_();
  206. _nop_();
  207. _nop_();
  208. _nop_();
  209. _nop_();
  210. _nop_();
  211. _nop_();
  212. _nop_();
  213. _nop_();
  214. _nop_();

  215. T=0;
  216. }
  217. void UART_Init (void) //串口初始化
  218. {
  219.         PCON = 0x00;
  220.         SCON = 0x50; //串口工作方式为1,允许接收.
  221.         TMOD = 0x21; // T1定时方式2 C
  222.         THI = 0xfd;//波特率9600bps @ fosc = 11.0592MHz
  223.         TLI = Oxfd;//启动T1
  224.         THO =0;
  225.         TLO =0;
  226.         ES = 1;//开串中断.


  227.         ETO =1;
  228.         TR1=1;//开总中断。

  229.         EA = 1;
  230. }
  231. void Send (uchar dat)
  232. {
  233.         SBUF = dat; //待发送的数据写心缓冲区
  234.         while(!TI); //等待发送完成
  235.         TI = 0; //清等发送标志位
  236. }
  237.         /************* 主程序********************/



  238. void main()
  239. {
  240.         UART_Init();
  241.         init_play() ;//初始化显示
  242.         while(l)
  243.         {
  244.                 read_tempO);//读取温度

  245.         StartModule();
  246.         while(R) ;//当RX 为零时等待
  247.         TRO=1;//开启计数
  248.         while(R) ;//当RX 为1计数并等待
  249.       
  250.         TRO=0;//关闭计数
  251.         show() ;//显示

  252.         delaylms(80) ;//80M
  253. if(Tx==1)
  254. {
  255. Send('t');
  256. Send('e');
  257. Send('m');
  258. Send('p');
  259. Send('=');
  260. Send(disdata[1]) ;
  261. Send(disdata[2]) ;
  262. Send(C.N);
  263. Send(disdata[3]) ;
  264. Tx=0;
  265. Send ('');
  266. }
  267. if(Ax==1)
  268. {

  269. Send('r');
  270. Send('a');
  271. Send('n');
  272. Send('g');
  273. Send('e');
  274. Send('=');
  275. Send(ASCII[disbuff[0]]) ;
  276. Send('.');
  277. Send(ASCII[disbuff[1]]) ;
  278. Send(ASCII[disbuff[2]]) ;
  279. Send('');
  280. Ax=0
  281.           }
  282.          }
  283.         }
  284. void Uart_INT(void)interrupt 4 //串口中断两数
  285. {
  286.         uchar Rev = 0:
  287.         if(RI) //查询接收标志位(有数据发送过来时置为1)
  288.         {
  289.            RI = 0;
  290.            Rcv =SBUF;
  291.            RxBuf=Rcv ;
  292.            if(RxBuf=='8' ){ TxF1;}
  293.            if(RxBuf==' 0' ){Ax=1; }
  294.         }
  295. }


  296. #include<REG52.H>
  297. #include<math.h>
  298. #include<stdio.h>
  299. #include<intrins.h>
  300. #define uchar unsigned char
  301. #define uint unsigned int
  302. sbit DQ=P2^2 ;
  303. sbit RS=P3^5;
  304. sbit RW=P3^6 ;
  305. sbit EN=P3^4 ;
  306. sbit R=P2^ 7 ;
  307. sbit T=P2^6 ;
  308. unsigned int  time=0;
  309. unsigned long S=0;
  310. bit   flag =0;
  311. unsigned char disbuff[4] ={ 0,0,0,0,};
  312. unsigned char code str1[]={"range   temp"}
  313. float RxBuf,disdata[5] ;
  314. uint tvalue;//温度值
  315. uchar tflag;//温度正负标志

  316. unsigned   char   code    ASCII [15]=
  317. {'0','1','2','3','4','5','6','7','8','9','.','-','M'};     
  318. uchar   Tx,Ax;

  319. /*********1cd1602 程序*********/
  320. Void delay lms(unsigned int ms)//延时1毫秒(不够精确的)

  321. {
  322.         unsigned int i,j;
  323.         for(i=0;i > ms;i++);
  324.         for(j=0;j > 100;j++);
  325. }
  326. void wr_com(unsi gned char com)//写指令//
  327. {
  328. delaylms(1) ;
  329. RS=0;
  330. RW=0;
  331. EN=0;
  332. P0=com;
  333. delay1ms(1) ;
  334. EN=1;
  335. delay1ms(1);
  336. EN=0;
  337. }

  338. void lcd_init 0//初始化设置//
  339. {
  340. //BLK=0 ;

  341. delay1ms(15) ;
  342. wr_com(0x38) ;
  343. delaylms(5)
  344. wr_com(0x08) ;delay1ms(5) ;
  345. wr_com(0x01) ;delaylms(5) ;
  346. wr_com(0x06) ;delay1ms(5) ;
  347. wr_com(0x0c) ;delay1ms(5) ;
  348. }
  349. void display(unsigned char *p)//显示//
  350. {
  351. while(*p!='\0')
  352. {
  353. wr_dat (*p);
  354. p++;
  355. //delaylms(1) ;
  356. }
  357. }
  358. init_play()//初始化显示
  359. {
  360. lcd_initO ;
  361. wr_com(0x80)
  362. display(strl) ;
  363. }
  364. /***************************ds18b20程序**************/
  365. void delay_18B20(unsigned int i)//延时1微秒

  366. {
  367.         while(i--);
  368. }
  369. viod ds18b20rst()/*dx18b20复位*/
  370. {
  371.         unsigned char x=0;
  372.         DQ = 1;
  373.         delay_18B20(4);
  374.         DQ=0;
  375.         delay_18B20(100);
  376.         DQ=1;
  377.         delay_18B20(40);
  378. }

  379. uchar ds1820rd()/*读数据*/
  380. {
  381.         unsigned char i=0;
  382.         unsigned char dat 中0:
  383.         for (i=8;i>0;i--)
  384. {
  385.         DQ = 0; //给脉冲信号
  386.         dat>>=1;
  387.         DQ = 1; //给脉冲信号
  388.         if(DQ)
  389.         dat |=0x80;
  390.         delay_18B20(10) ;
  391. }

  392.         return(dat);
  393. }

  394. void ds1820wr(uchar wdata)/*写数据*/
  395. {
  396.         unsigned char i=0;
  397.         for (i=8; i>0;i--)
  398. {
  399.         DQ = 0;
  400.         DQ = wdata&0x01;
  401.         delay_18B20(10) ;
  402.         DQ = 1;
  403.         wdata>>=1;
  404. }
  405. }
  406. read_temp ()/*读取温度值并转换*/
  407. {
  408.         uchar a,b;
  409.         ds1820rst () ;
  410.         ds1820wr(0xcc) ;//*跳过读序列号*/

  411.         ds1820wr(0x44) ;//*启动温度转换*/
  412.         ds1820rst () ;
  413.         ds1820wr (0xcc) ;//*跳过读序列号*/
  414.         ds1820wr (0xbe) ;//*读取温度*/
  415.         a=ds1820rd();
  416.         b=ds1820rd();
  417.         tvalue=b ;
  418.         tvalue<<=8;
  419.         tvalue=tvalue|a;
  420.         if(tvalue<0xOfff)
  421.         tflag=0;
  422.         else
  423.         {
  424.                 tvalue=~tvalue+1;
  425.                 tflag=1;
  426.         }
  427.         tvalue=tvalue*(0.625) ;//温度值扩大10 倍,精确到1位小?
  428.         tvalue=tvalue-15;
  429.         return(tvalue);
  430. }
  431. /***************************水****水*水水米*水***********/

  432. void show()//温度值显示
  433. {
  434.         uchar flagdat;
  435.         time=TH0*256+TLO;
  436.         THO=0;
  437.         TL0=0;
  438.         S=(time*1.7)/100;
  439.         disdata[0]=tvalue/1000+0x30; //百位数
  440.         disdata[1]=tvalue%1000/100+0x30;// 十位数
  441.         disdata[2]=tvalue%100/10+0x30;//个位数
  442.         disdata[3]=tvalue%10+0x30;//小数位
  443.         disdata [4 ]=0x00 ;
  444.         if(tflag==0)
  445.         flagdat=0x20;//正温度不显示符号
  446.         else
  447.         flagdat=0x2d;//负温度显示负号:-
  448. if(disdata[0]==0x30)
  449. {
  450.         disdata[0]=0x20;//如果百位为0,不显示
  451.         if(disdata[1]=0x30)
  452.         {
  453.         disdata[11=0x20;//如果百位为0,十位为0 也不显示
  454.         }
  455. }

  456. disbuff[0]=S%1000/100;
  457. disbuff[1]=S%1000%100/10;
  458. disbuff[2]=S%1000%100%10;
  459. disbuff[3]=S%10000%1000 %100;
  460. wr_com (0xcO) ;
  461. wr_dat (ASCII [disbuff[O]]) ;//显示百位
  462. wr_com(Oxc1) ;
  463. wr_dat(ASCII [10]) ;
  464. wr_com(0 x c2) ;
  465. wr_dat (ASCII[disbuff[1]]) ;
  466. wr_com(0xc3)
  467. wr_dat(ASCII [disbuff[2]]) ;
  468. wr_com(0xc4) ;
  469. wr_dat(ASCII[12]) :
  470. wr_com (0xc8)
  471. wr_dat(flagdat) ;//显示符号?
  472. wr_com (0xc9) ;
  473. wr_dat disdata[0]) ;//显示百位
  474. wr_com (Oxca) :
  475. wr_dat(disdata[1]) ;//显示十位
  476. wr_com(0xcb) ;
  477. wr_dat (disdata[2]) ;//显示个位
  478. wr_com (0xcc) ;
  479. wr_dat (0x2e) ;//显示小数点
  480. wr_com (Oxcd) ;
  481. wr_dat(disdata[3]) ;//显示小数位

  482. void StartModule()//启动模块
  483. {
  484. T=1;      //启动一次模块
  485. _nop_();
  486. _nop_();
  487. _nop_();
  488. _nop_();
  489. _nop_();
  490. _nop_();
  491. _nop_();
  492. _nop_();
  493. _nop_();
  494. _nop_();
  495. _nop_();
  496. _nop_();
  497. _nop_();
  498. _nop_();
  499. _nop_();
  500. _nop_();
  501. _nop_();
  502. _nop_();
  503. _nop_();
  504. _nop_();
  505. _nop_();
  506. _nop_();
  507. _nop_();
  508. _nop_();
  509. _nop_();

  510. T=0;
  511. }
  512. void UART_Init (void) //串口初始化
  513. {
  514.         PCON = 0x00;
  515.         SCON = 0x50; //串口工作方式为1,允许接收.
  516.         TMOD = 0x21; // T1定时方式2 C
  517.         THI = 0xfd;//波特率9600bps @ fosc = 11.0592MHz
  518.         TLI = Oxfd;//启动T1
  519.         THO =0;
  520.         TLO =0;
  521.         ES = 1;//开串中断.


  522.         ETO =1;
  523.         TR1=1;//开总中断。

  524.         EA = 1;
  525. }
  526. void Send (uchar dat)
  527. {
  528.         SBUF = dat; //待发送的数据写心缓冲区
  529.         while(!TI); //等待发送完成
  530.         TI = 0; //清等发送标志位
  531. }
  532.         /************* 主程序********************/



  533. void main()
  534. {
  535.         UART_Init();
  536.         init_play() ;//初始化显示
  537.         while(l)
  538.         {
  539.                 read_tempO);//读取温度

  540.         StartModule();
  541.         while(R) ;//当RX 为零时等待
  542.         TRO=1;//开启计数
  543.         while(R) ;//当RX 为1计数并等待
  544.       
  545.         TRO=0;//关闭计数
  546.         show() ;//显示

  547.         delaylms(80) ;//80M
  548. if(Tx==1)
  549. {
  550. Send('t');
  551. Send('e');
  552. Send('m');
  553. Send('p');
  554. Send('=');
  555. Send(disdata[1]) ;
  556. Send(disdata[2]) ;
  557. Send(C.N);
  558. Send(disdata[3]) ;
  559. Tx=0;
  560. Send ('');
  561. }
  562. if(Ax==1)
  563. {

  564. Send('r');
  565. Send('a');
  566. Send('n');
  567. Send('g');
  568. Send('e');
  569. Send('=');
  570. Send(ASCII[disbuff[0]]) ;
  571. Send('.');
  572. Send(ASCII[disbuff[1]]) ;
  573. Send(ASCII[disbuff[2]]) ;
  574. Send('');
  575. Ax=0
  576.           }
  577.          }
  578.         }
  579. void Uart_INT(void)interrupt 4 //串口中断两数
  580. {
  581.         uchar Rev = 0:
  582.         if(RI) //查询接收标志位(有数据发送过来时置为1)
  583.         {
  584.            RI = 0;
  585.            Rcv =SBUF;
  586.            RxBuf=Rcv ;
  587.            if(RxBuf=='8' ){ TxF1;}
  588.            if(RxBuf==' 0' ){Ax=1; }
  589.         }
  590. }




复制代码


回复

使用道具 举报

ID:242160 发表于 2017-12-6 09:36 | 显示全部楼层
怎么不能编译
回复

使用道具 举报

ID:255915 发表于 2017-12-6 10:39 来自手机 | 显示全部楼层
需要生成hex文件
回复

使用道具 举报

ID:248503 发表于 2017-12-6 12:12 | 显示全部楼层
多处缺少分号,全角符号不可以用,l和1混用,o和零混用,缺少一个函数,wrdat,错误太多了,楼主应该从某本书上抄的,
回复

使用道具 举报

ID:231046 发表于 2017-12-6 14:00 | 显示全部楼层
应该是抄的,要注意程序书写规则,该用什么用什么,不能乱,也不能少符号。
回复

使用道具 举报

ID:213173 发表于 2017-12-6 14:08 | 显示全部楼层

满满的抄写错误,如何编译?
回复

使用道具 举报

ID:258226 发表于 2017-12-6 16:19 | 显示全部楼层
大部分编译环境都有在线编译功能呀,把代码敲进去的时候明显的语法错误时会被红线标注的,你这样明显的错误先自己查一遍吧,比如什么函数名后面的0),应该是()吧,而且没传递参数个人也习惯写void而不是空着,改完再把编译错误信息也发一下
回复

使用道具 举报

ID:223214 发表于 2017-12-6 17:24 | 显示全部楼层
你这个有多个头文件名呀
回复

使用道具 举报

ID:258304 发表于 2017-12-6 19:14 | 显示全部楼层
有时候重复定义了也会编译不了
回复

使用道具 举报

ID:149988 发表于 2017-12-6 19:58 | 显示全部楼层

RE: 哪位大神看一下程序 怎么不能编译

Pro_main.C(18): error C141: syntax error near 'float'原因unsigned char code str1[]={"range   temp"}缺少“;”号
Void delay lms(unsigned int ms)中Void的V写成了大写V应为v
Void delay lms(unsigned int ms)原因Void delay lms(unsigned int ms)中Void 用了大写V。
Pro_main.C(40): error C202: 'com': undefined identifier原因P0=com;com没有定义
Pro_main.C(37): error C141: syntax error near 'delaylms'
Pro_main.C(37): error C231: '_delaylms': redefinition
char com缺少“;”号
回复

使用道具 举报

ID:111634 发表于 2017-12-6 20:48 | 显示全部楼层
抄不全是因为不懂c51!
回复

使用道具 举报

ID:258375 发表于 2017-12-6 22:41 | 显示全部楼层
unsigned char code str1[]={"range   temp"}//此处缺少分号unsigned char code str1[]={"range   temp"};
Void delay lms(unsigned int ms)//延时1毫秒(不够精确的) Void 错误  void   delay lms - >delay_1ms

void wr_com(unsi gned char com)//写指令//  unsigned

void lcd_init 0//初始化设置//void lcd_init()

void lcd_init()//初始化设置//
{
//BLK=0 ;

delay_1ms(15) ;
wr_com(0x38) ;
delay_1ms(5)//缺少分号
wr_dat//没定义
错误一大堆






回复

使用道具 举报

ID:258478 发表于 2017-12-7 09:45 | 显示全部楼层
基础错误太多了,编译会有错误提示,从一天开始修改
回复

使用道具 举报

ID:257664 发表于 2017-12-7 10:14 | 显示全部楼层
多处缺少分号,全角符号不可以用,l和1混用,o和零混用,缺少一个函数,仔细检查
回复

使用道具 举报

ID:258520 发表于 2017-12-7 10:38 | 显示全部楼层
有错
回复

使用道具 举报

ID:258096 发表于 2017-12-7 11:24 | 显示全部楼层
Void delay lms(unsigned int ms);一看就是复制粘贴出来的程序
回复

使用道具 举报

ID:258556 发表于 2017-12-7 11:38 | 显示全部楼层
一个一个解决错误
回复

使用道具 举报

ID:155507 发表于 2017-12-7 21:47 | 显示全部楼层
解决了, 能编译

  1. #include <REG52.H>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <intrins.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. sbit DQ=P2^2 ;
  8. sbit RS=P3^5;
  9. sbit RW=P3^6 ;
  10. sbit EN=P3^4 ;
  11. sbit R=P2^ 7 ;
  12. sbit T=P2^6 ;
  13. unsigned int  time=0;
  14. unsigned long S=0;
  15. bit   flag =0;
  16. unsigned char disbuff[4] ={ 0,0,0,0,};
  17. unsigned char code str1[]={"range   temp"};
  18. float RxBuf, disdata[5];
  19. uint tvalue; //温度值
  20. uchar tflag; //温度正负标志

  21. unsigned   char   code    ASCII [15]=
  22. {'0','1','2','3','4','5','6','7','8','9','.','-','M'};     
  23. uchar   Tx,Ax;

  24. /*********1cd1602 程序*********/
  25. void delaylms(unsigned int ms)//延时1毫秒(不够精确的)
  26. {
  27.         unsigned int i,j;
  28.         for(i=0;i > ms;i++)
  29.          for(j=0;j > 100;j++);
  30. }

  31. void wr_com(unsigned char com)//写指令//
  32. {
  33.         delaylms(1);
  34.         RS=0;
  35.         RW=0;
  36.         EN=0;
  37.         P0=com;
  38.         delaylms(1);
  39.         EN=1;
  40.         delaylms(1);
  41.         EN=0;
  42. }

  43. void wr_dat(unsigned char dat)//写入数据//
  44. {
  45.         delaylms(1);
  46.         RS=1;
  47.         RW=0;
  48.         EN=0;
  49.         P0=dat;
  50.         delaylms(1);
  51.         EN=1;
  52.         delaylms(1);
  53.         EN=0;
  54. }

  55. void lcd_init()//初始化设置//
  56. {
  57.         //BLK=0 ;

  58.         delaylms(15) ;
  59.         wr_com(0x38) ;
  60.         delaylms(5);
  61.         wr_com(0x08) ;delaylms(5) ;
  62.         wr_com(0x01) ;delaylms(5) ;
  63.         wr_com(0x06) ;delaylms(5) ;
  64.         wr_com(0x0c) ;delaylms(5) ;
  65. }

  66. void display(unsigned char *p)//显示//
  67. {
  68.         while(*p!='\0')
  69.         {
  70.                 wr_dat(*p);
  71.                 p++;
  72.                 //delaylms(1) ;
  73.         }
  74. }

  75. void init_play()//初始化显示
  76. {
  77.         lcd_init();
  78.         wr_com(0x80);
  79.         display(str1) ;
  80. }

  81. //***************************ds18b20程序************** /
  82. void delay_18B20(unsigned int i)//延时1微秒
  83. {
  84.         while(i--);
  85. }

  86. void ds1820rst() //*dx18b20复位* /
  87. {
  88.         unsigned char x=0;
  89.         DQ = 1;
  90.         delay_18B20(4);
  91.         DQ=0;
  92.         delay_18B20(100);
  93.         DQ=1;
  94.         delay_18B20(40);
  95. }

  96. uchar ds1820rd() //*读数据* /
  97. {
  98.         unsigned char i=0;
  99.         unsigned char dat=0;
  100.         for (i=8;i>0;i--)
  101.         {
  102.                 DQ = 0; //给脉冲信号
  103.                 dat>>=1;
  104.                 DQ = 1; //给脉冲信号
  105.                 if(DQ)
  106.                 dat |=0x80;
  107.                 delay_18B20(10) ;
  108.         }

  109.         return(dat);
  110. }

  111. void ds1820wr(uchar wdata)//*写数据* /
  112. {
  113.         unsigned char i=0;
  114.         for (i=8; i>0;i--)
  115.         {
  116.                 DQ = 0;
  117.                 DQ = wdata&0x01;
  118.                 delay_18B20(10) ;
  119.                 DQ = 1;
  120.                 wdata>>=1;
  121.         }
  122. }

  123. unsigned int read_temp() //*读取温度值并转换* /
  124. {
  125.         uchar a,b;
  126.         ds1820rst();
  127.         ds1820wr(0xcc) ;//*跳过读序列号*/

  128.         ds1820wr(0x44) ;//*启动温度转换*/
  129.         ds1820rst() ;
  130.         ds1820wr(0xcc) ;//*跳过读序列号*/
  131.         ds1820wr(0xbe) ;//*读取温度*/
  132.         a=ds1820rd();
  133.         b=ds1820rd();
  134.         tvalue=b ;
  135.         tvalue<<=8;
  136.         tvalue=tvalue|a;
  137.         if(tvalue< 0x0fff)
  138.         tflag=0;
  139.         else
  140.         {
  141.                 tvalue=~tvalue+1;
  142.                 tflag=1;
  143.         }
  144.         tvalue=tvalue*(0.625) ;//温度值扩大10 倍,精确到1位小?
  145.         tvalue=tvalue-15;
  146.         return(tvalue);
  147. }
  148. //***************************水****水*水水米*水*********** /

  149. void show()//温度值显示
  150. {
  151.         uchar flagdat;
  152.         time=TH0*256+TL0;
  153.         TH0=0;
  154.         TL0=0;
  155.         S=(time*1.7)/100;
  156.         disdata[0]=tvalue/1000+0x30; //百位数
  157.         disdata[1]=tvalue%1000/100+0x30;// 十位数
  158.         disdata[2]=tvalue%100/10+0x30;//个位数
  159.         disdata[3]=tvalue%10+0x30;//小数位
  160.         disdata[4]=0x00 ;
  161.         if(tflag==0)
  162.         flagdat=0x20;//正温度不显示符号
  163.         else
  164.         flagdat=0x2d;//负温度显示负号:-
  165.         if(disdata[0]==0x30)
  166.         {
  167.                 disdata[0]=0x20;//如果百位为0,不显示
  168.                 if(disdata[1]==0x30)
  169.                 {
  170.                         disdata[11]=0x20;//如果百位为0,十位为0 也不显示
  171.                 }
  172.         }

  173.         disbuff[0]=S%1000/100;
  174.         disbuff[1]=S%1000%100/10;
  175.         disbuff[2]=S%1000%100%10;
  176.         disbuff[3]=S%10000%1000 %100;
  177.         wr_com (0xc0) ;
  178.         wr_dat (ASCII [disbuff[0]]);//显示百位
  179.         wr_com(0xc1) ;
  180.         wr_dat(ASCII [10]) ;
  181.         wr_com(0xc2) ;
  182.         wr_dat (ASCII[disbuff[1]]);
  183.         wr_com(0xc3);
  184.         wr_dat(ASCII [disbuff[2]]);
  185.         wr_com(0xc4) ;
  186.         wr_dat(ASCII[12]);
  187.         wr_com (0xc8);
  188.         wr_dat(flagdat) ;//显示符号?
  189.         wr_com (0xc9) ;
  190.         wr_dat (disdata[0]) ;//显示百位
  191.         wr_com (0xca);
  192.         wr_dat(disdata[1]) ;//显示十位
  193.         wr_com(0xcb) ;
  194.         wr_dat (disdata[2]) ;//显示个位
  195.         wr_com (0xcc) ;
  196.         wr_dat (0x2e) ;//显示小数点
  197.         wr_com (0xcd) ;
  198.         wr_dat(disdata[3]) ;//显示小数位
  199. }

  200. void StartModule()//启动模块
  201. {
  202.         T=1;      //启动一次模块
  203.         _nop_();
  204.         _nop_();
  205.         _nop_();
  206.         _nop_();
  207.         _nop_();
  208.         _nop_();
  209.         _nop_();
  210.         _nop_();
  211.         _nop_();
  212.         _nop_();
  213.         _nop_();
  214.         _nop_();
  215.         _nop_();
  216.         _nop_();
  217.         _nop_();
  218.         _nop_();
  219.         _nop_();
  220.         _nop_();
  221.         _nop_();
  222.         _nop_();
  223.         _nop_();
  224.         _nop_();
  225.         _nop_();
  226.         _nop_();
  227.         _nop_();

  228.         T=0;
  229. }

  230. void UART_Init(void) //串口初始化
  231. {
  232.         PCON = 0x00;
  233.         SCON = 0x50; //串口工作方式为1,允许接收.
  234.         TMOD = 0x21; // T1定时方式2 C
  235.         TH1 = 0xfd;//波特率9600bps @ fosc = 11.0592MHz
  236.         TL1 = 0xfd;//启动T1
  237.         TH0 =0;
  238.         TL0 =0;
  239.         ES = 1;//开串中断.


  240.         ET0 =1;
  241.         TR1=1;//开总中断。

  242.         EA = 1;
  243. }

  244. void Send(uchar dat)
  245. {
  246.         SBUF = dat; //待发送的数据写心缓冲区
  247.         while(!TI); //等待发送完成
  248.         TI = 0; //清等发送标志位
  249. }


  250. //************* 主程序******************** /



  251. void main()
  252. {
  253.         UART_Init();
  254.         init_play() ;//初始化显示
  255.         while(1)
  256.         {
  257.                 read_temp();//读取温度

  258.                 StartModule();
  259.                 while(R) ;//当RX 为零时等待
  260.                 TR0=1;//开启计数
  261.                 while(R) ;//当RX 为1计数并等待
  262.                
  263.                 TR0=0;//关闭计数
  264.                 show() ;//显示

  265.                 delaylms(80) ;//80M
  266.                 if(Tx==1)
  267.                 {
  268.                         Send('t');
  269.                         Send('e');
  270.                         Send('m');
  271.                         Send('p');
  272.                         Send('=');
  273.                         Send(disdata[1]) ;
  274.                         Send(disdata[2]) ;
  275.                         Send('C');
  276.                         Send(disdata[3]) ;
  277.                         Tx=0;
  278.                         Send (' ');
  279.                 }
  280.                 if(Ax==1)
  281.                 {

  282.                         Send('r');
  283.                         Send('a');
  284.                         Send('n');
  285.                         Send('g');
  286.                         Send('e');
  287.                         Send('=');
  288.                         Send(ASCII[disbuff[0]]) ;
  289.                         Send('.');
  290.                         Send(ASCII[disbuff[1]]) ;
  291.                         Send(ASCII[disbuff[2]]) ;
  292.                         Send(' ');
  293.                         Ax=0;
  294.                 }
  295.         }
  296. }

  297. void Uart_INT(void)interrupt 4 //串口中断两数
  298. {
  299.         uchar Rcv = 0;
  300.         if(RI) //查询接收标志位(有数据发送过来时置为1)
  301.         {
  302.                 RI = 0;
  303.                 Rcv  = SBUF;
  304.                 RxBuf= Rcv;
  305.                 if(RxBuf=='8' ){ Tx=1;}
  306.                 if(RxBuf=='0' ){ Ax=1; }
  307.         }
  308. }
复制代码
回复

使用道具 举报

ID:242160 发表于 2017-12-8 14:14 | 显示全部楼层
angmall 发表于 2017-12-7 21:47
解决了, 能编译

谢谢谢谢   我改了两天还有错误
回复

使用道具 举报

ID:242160 发表于 2017-12-8 14:16 | 显示全部楼层
不倒翁.WZT 发表于 2017-12-6 19:58
Pro_main.C(18): error C141: syntax error near 'float'原因unsigned char code str1[]={"range   temp"} ...

谢谢  改好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表