OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3485|回复: 2

网上找的程序出了错误,还请大佬们看看

[复制链接]

2

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2022-2-18
在线时间
2 小时
发表于 2022-4-22 20:51:52 | 显示全部楼层 |阅读模式
7金钱
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <stdio.h>

  4. typedef unsigned int uint;
  5. typedef unsigned char uchar;

  6. /********************引脚定义********************/
  7. #define LCD_DATA P0
  8. sbit LCD_RS = P2^0;
  9. sbit LCD_RW = P2^1;
  10. sbit LCD_EN = P2^2;
  11. sbit KEY_1 = P1^7;                        //功能键
  12. sbit KEY_2 = P1^4;                        //减少键
  13. sbit KEY_3 = P1^2;                        //增加按键
  14. sbit DS18B20 = P2^6;                //电机使能端
  15. /************************************************/

  16. /********************全局变量********************/
  17. #define KeyTime 200                                        //200 * 1ms = 200ms
  18. #define DispTime 100                                //100 * 1ms = 100ms
  19. volatile uchar KEY_1ms = 0;
  20. volatile uchar Disp_1ms = 0;
  21. volatile uchar Menu = 0;        //0(显示当前温度), 1(设置最低温度), 2(设置最低温度)
  22. volatile int MaxTemp = 40;
  23. volatile int MinTemp = -10;
  24. volatile float Temperature = 0;
  25. /************************************************/

  26. /********************函数声明********************/
  27. void Delay_us(uchar x);
  28. void Delay_ms(uchar x);
  29. void Timer0Init(void);
  30. void KEY_Proc(void);
  31. void DispTemp(void);
  32. void LCD_WriteCommand(uchar com);
  33. void LCD_WriteData(uchar dat);
  34. void LCD_Init(void);
  35. void LCD_Show_Home(void);
  36. void LCD_Show_Setting(void);
  37. void DS18B20_Init(void);
  38. uchar DS18B20_ReadByte(void);
  39. void DS18B20_WriteByte(uchar dat);
  40. float DS18B20_ReadTmp(void);
  41. /************************************************/

  42. /*********************主函数*********************/
  43. int main(void)     //主函数
  44. {
  45.         LCD_Init();
  46.         Temperature = DS18B20_ReadTmp();
  47.         Delay_ms(200);
  48.         Delay_ms(200);
  49.         Timer0Init();
  50.         LCD_Show_Home();
  51.         while(1)
  52.         {
  53.                 DispTemp();
  54.                 KEY_Proc();
  55.         }
  56. }
  57. /************************************************/

  58. /*****************延时函数******************/
  59. void Delay_us(uchar x)                //@12.000MHz
  60. {
  61.         while(x--)
  62.         {
  63.                 _nop_();
  64.                 _nop_();
  65.                 _nop_();
  66.                 _nop_();
  67.         }
  68. }

  69. void Delay_ms(uchar x)                //@12.000MHz
  70. {
  71.         uchar i, j;
  72.         while(x--)
  73.         {
  74.                 _nop_();
  75.                 _nop_();
  76.                 i = 12;
  77.                 j = 169;
  78.                 do
  79.                 {
  80.                         while (--j);
  81.                 } while (--i);
  82.         }
  83. }
  84. /************************************************/

  85. /*******************计数器0模块*******************/
  86. void Timer0Init(void)
  87. {
  88.         TMOD |= 0X01;        //选择为定时器0模式,工作方式1,仅用TR0打开启动。
  89.         TH0 = 0xFC;                //给定时器赋初值,定时1ms   65536-1ms/1us
  90.         TL0 = 0x18;       
  91.         ET0 = 1;                        //打开定时器0中断允许
  92.         EA = 1;                                //打开总中断
  93.         TR0 = 1;                        //打开定时器
  94. }

  95. void Timer0(void) interrupt 1
  96. {
  97.         TH0 = 0xFC;                //给定时器赋初值,定时1ms
  98.         TL0 = 0x18;
  99.         KEY_1ms ++;
  100.         Disp_1ms ++;
  101.        
  102. }
  103. /************************************************/

  104. /*****************按键模块******************/
  105. void KEY_Proc(void)
  106. {
  107.         if (KEY_1ms >= KeyTime)
  108.         {
  109.                 KEY_1ms = 0;
  110.                 if (KEY_1 == 0)
  111.                 {
  112.                         Menu ++;
  113.                         LCD_Show_Setting();
  114.                         if (Menu == 3)
  115.                         {
  116.                                 Menu = 0;
  117.                                 LCD_Show_Home();
  118.                         }
  119.                 }
  120.                 else if (KEY_2 == 0)
  121.                 {
  122.                         if (Menu == 1)
  123.                         {
  124.                                 MinTemp --;
  125.                         }
  126.                         else if (Menu == 2)
  127.                         {
  128.                                 MaxTemp --;
  129.                                 if ((MaxTemp - 1) == MinTemp)
  130.                                 {
  131.                                         MaxTemp ++;
  132.                                 }
  133.                         }
  134.                 }
  135.                 else if (KEY_3 == 0)
  136.                 {
  137.                         if (Menu == 1)
  138.                         {
  139.                                 MinTemp ++;
  140.                                 if ((MaxTemp - 1) == MinTemp)
  141.                                 {
  142.                                         MinTemp --;
  143.                                 }
  144.                         }
  145.                         else if (Menu == 2)
  146.                         {
  147.                                 MaxTemp ++;
  148.                         }
  149.                 }
  150.         }
  151. }
  152. /************************************************/

  153. /*****************温度显示函数******************/
  154. void DispTemp(void)
  155. {
  156.         if (Disp_1ms >= DispTime)
  157.         {
  158.                 uchar i;
  159.                 uchar Disp[6] = "      ";
  160.                 uchar Disp1[4] = "    ";
  161.                 Disp_1ms = 0;
  162.                 if (Menu == 0)
  163.                 {
  164.                         LCD_WriteCommand(0xC7);
  165.                         Temperature = DS18B20_ReadTmp();
  166.                         sprintf(Disp, "%.1f", Temperature);
  167.                         for(i=0; i<6; i++)
  168.                         {
  169.                                 LCD_WriteData(Disp[i]);
  170.                         }
  171.                 }
  172.                 else if (Menu == 1)
  173.                 {
  174.                         LCD_WriteCommand(0x80);
  175.                         LCD_WriteData('>');
  176.                         LCD_WriteCommand(0xC0);
  177.                         LCD_WriteData(' ');
  178.                         LCD_WriteCommand(0x8B);
  179.                         sprintf(Disp, "%d", MinTemp);
  180.                         for(i=0; i<4; i++)
  181.                         {
  182.                                 LCD_WriteData(Disp[i]);
  183.                         }
  184.                 }
  185.                 else if (Menu == 2)
  186.                 {
  187.                         LCD_WriteCommand(0x80);
  188.                         LCD_WriteData(' ');
  189.                         LCD_WriteCommand(0xC0);
  190.                         LCD_WriteData('>');
  191.                         LCD_WriteCommand(0xCB);
  192.                         sprintf(Disp, "%d", MaxTemp);
  193.                         for(i=0; i<4; i++)
  194.                         {
  195.                                 LCD_WriteData(Disp[i]);
  196.                         }
  197.                 }
  198.         }
  199. }
  200. /************************************************/

  201. /*******************LCD模块*******************/
  202. void LCD_WriteCommand(uchar com)
  203. {
  204.         LCD_EN = 0;     //使能
  205.         LCD_RS = 0;                  //选择发送命令
  206.         LCD_RW = 0;                   //选择写入
  207.        
  208.         LCD_DATA = com; //放入命令
  209.         Delay_us(1);                //等待数据稳定

  210.         LCD_EN = 1;            //写入时序
  211.         Delay_us(5);          //保持时间
  212.         LCD_EN = 0;
  213. }
  214.                      
  215. void LCD_WriteData(uchar dat)
  216. {
  217.         LCD_EN = 0;                        //使能清零
  218.         LCD_RS = 1;                        //选择输入数据
  219.         LCD_RW = 0;                        //选择写入

  220.         LCD_DATA = dat; //写入数据
  221.         Delay_us(1);

  222.         LCD_EN = 1;           //写入时序
  223.         Delay_us(5);          //保持时间
  224.         LCD_EN = 0;
  225. }

  226. void LCD_Init(void)
  227. {
  228.         LCD_WriteCommand(0x38);  //开显示
  229.         LCD_WriteCommand(0x0C);  //开显示不显示光标
  230.         LCD_WriteCommand(0x06);  //写一个指针加1
  231.         LCD_WriteCommand(0x01);  //清屏
  232.         LCD_WriteCommand(0x80);  //设置数据指针起点
  233. }

  234. void LCD_Show_Home(void)
  235. {
  236.         uchar i;
  237.         uchar Disp[16];
  238.         LCD_WriteCommand(0x80);
  239.         sprintf(Disp, " Current Temp:  ");
  240.         for(i=0; i<16; i++)
  241.         {
  242.                 LCD_WriteData(Disp[i]);
  243.         }
  244.         LCD_WriteCommand(0xC0);
  245.         sprintf(Disp, " Temp:        C ");
  246.         for(i=0; i<16; i++)
  247.         {
  248.                 LCD_WriteData(Disp[i]);
  249.         }
  250.         LCD_WriteCommand(0xCD);
  251.         LCD_WriteData(0xDF);
  252. }

  253. void LCD_Show_Setting(void)
  254. {
  255.         uchar i;
  256.         uchar Disp[16];
  257.         LCD_WriteCommand(0x80);
  258.         sprintf(Disp, " Min Temp: %d   ", MinTemp);
  259.         for(i=0; i<16; i++)
  260.         {
  261.                 LCD_WriteData(Disp[i]);
  262.         }
  263.         LCD_WriteCommand(0xC0);
  264.         sprintf(Disp, " Max Temp: %d   ", MaxTemp);
  265.         for(i=0; i<16; i++)
  266.         {
  267.                 LCD_WriteData(Disp[i]);
  268.         }
  269. }
  270. /************************************************/

  271. /*******************DS18B20模块*******************/
  272. void DS18B20_Init(void)
  273. {
  274.         DS18B20 = 1;
  275.         Delay_us(1);
  276.         DS18B20 = 0;
  277.         Delay_us(40);
  278.         DS18B20 = 1;
  279.         Delay_us(11);
  280. }

  281. uchar DS18B20_ReadByte(void)
  282. {
  283.         uchar i,dat=0;
  284.         DS18B20 = 1;
  285.         for(i=0;i<8;i++)
  286.         {
  287.                 DS18B20 = 1;
  288.                 Delay_us(1);
  289.                  DS18B20 = 0;
  290.                 dat >>= 1;
  291.                 DS18B20 = 1;
  292.                 if(DS18B20)
  293.                         dat |= 0X80;
  294.                 Delay_us(2);
  295.         }
  296.         return dat;
  297. }

  298. void DS18B20_WriteByte(uchar dat)
  299. {
  300.         uchar i;
  301.         for(i=0;i<8;i++)
  302.         {
  303.                  DS18B20 = 0;
  304.                 DS18B20 = dat& 0x01;
  305.                 Delay_us(2);
  306.                 DS18B20 = 1;
  307.                 dat >>= 1;
  308.         }
  309.         Delay_us(2);
  310. }

  311. float DS18B20_ReadTmp(void)
  312. {
  313.         float Temp;
  314.         uint Temp_Value[]={0, 0};
  315.         DS18B20_Init();
  316.         DS18B20_WriteByte(0xCC);
  317.         DS18B20_WriteByte(0x44);
  318.         Delay_us(20);
  319.         DS18B20_Init();
  320.         DS18B20_WriteByte(0xCC);
  321.         DS18B20_WriteByte(0xBE);
  322.         Temp_Value[0] = DS18B20_ReadByte();
  323.         Temp_Value[1] = DS18B20_ReadByte();
  324.         if((Temp_Value[1]&0xF8)==0xF8)
  325.         {
  326.                 Temp = -1 * (128 - 0.0625 * (Temp_Value[0] | ((Temp_Value[1]&0x07)<<8)));
  327.         }
  328.         else
  329.         {
  330.                 Temp = 0.0625 * (Temp_Value[0] | ((Temp_Value[1]&0x07)<<8));
  331.         }
  332.         return Temp;
  333. }
  334. /************************************************/
复制代码
错误显示
  1. LCD\LCD.c(10): error C202: 'P2': undefined identifier
  2. LCD\LCD.c(14): error C202: 'P1': undefined identifier
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8204
金钱
8204
注册时间
2020-5-11
在线时间
3697 小时
发表于 2022-4-23 11:23:32 | 显示全部楼层
没看出原因,工程传上来看看。
专治疑难杂症
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2022-2-18
在线时间
2 小时
 楼主| 发表于 2022-4-24 22:00:46 | 显示全部楼层
LcwSwust 发表于 2022-4-23 11:23
没看出原因,工程传上来看看。

新人,不会上传工程,方便留个邮箱吗
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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