找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2913|回复: 10
打印 上一主题 下一主题
收起左侧

单片机测温报警系统LED灯不亮,温度的上下限每次退出后就会归零,保存不了

[复制链接]
跳转到指定楼层
楼主
100黑币

这是单片机程序
  1. #include <reg51.h>
  2. #include "intrins.h"
  3. sbit BUZZER = P1^0;                  //蜂鸣器接口3.7脚
  4. sbit LED1= P1^1;                  //高温报警灯
  5. sbit LED2= P1^2;                  //低温报警灯
  6. sbit SET_KEY= P3^7;                  //设置按键
  7. sbit JIA_KEY= P3^6;                  //加键
  8. sbit JIAN_KEY= P3^5;          //减键
  9. sbit QUEREN_KEY= P3^4;          //确认设置按键
  10. #define LCD1602_DATAPINS P0           //LCD1602数据口
  11. sbit LCD1602_E=P2^2;                   //LCD1602使能端口
  12. sbit LCD1602_RW=P2^1;                   //读写选择端口
  13. sbit LCD1602_RS=P2^0;                   //数据/命令选择端口
  14. sbit DSPORT=P3^0;                           //DS18B20数据口
  15. char HTemp = 50;                           //报警高温度值
  16. char LTemp = 0;                                   //报警低温度值
  17. float CurTemp = 0.0;                   //当前测量的温度值
  18. int readVal = 0;                           //从DS18B20读取的数据,该数据用来转换成当前测量的温度值
  19. unsigned int TimeoutNum = 0;//定时器计时次数
  20. unsigned char setKeyVal = 1;
  21. unsigned char jiaKeyVal = 1;
  22. unsigned char jianKeyVal = 1;
  23. unsigned char querenKeyVal = 1;
  24. unsigned char SetMode = 0;           //模式变量
  25. #define NORMAL_MODE        0                   //正常运行模式
  26. #define SET_H_TEMP_MODE        1           //设置报警温度高温值
  27. #define SET_L_TEMP_MODE        2           //设置报警温度低温值
  28. sfr IAP_DATA    =   0xE2;           //STC内部存储器数据寄存器
  29. sfr IAP_ADDRH   =   0xE3;           //STC内部存储器地址高8位寄存器
  30. sfr IAP_ADDRL   =   0xE4;           //STC内部存储器地址低8位寄存器
  31. sfr IAP_CMD     =   0xE5;           //STC内部存储器命令寄存器
  32. sfr IAP_TRIG    =   0xE6;           //STC内部存储器触发命令寄存器
  33. sfr IAP_CONTR   =   0xE7;           //STC内部存储器控制寄存器
  34. #define CMD_IDLE    0               //待机命令
  35. #define CMD_READ    1               //读字节命令
  36. #define CMD_PROGRAM 2               //写字节命令
  37. #define CMD_ERASE   3               //擦除扇区命令
  38. #define ENABLE_IAP   0x81           //if SYSCLK<20MHz        IAP控制命令
  39. #define HTEMP_ADDRESS 0x2000                 //上线温度存储地址,2000存储上线温度符号(0负  1正);2001存储上线温度值
  40. #define LTEMP_ADDRESS 0x2002                 //下线温度存储地址,2002存储下线温度符号(0负  1正);2003存储下线温度值
  41. /*在51单片机12MHZ时钟下的延时函数*/
  42. void Delay10us(unsigned int c);   //误差 0us
  43. /*LCD1602写入8位命令子函数*/
  44. void LcdWriteCom(unsigned char com);
  45. /*LCD1602写入8位数据子函数*/      
  46. void LcdWriteData(unsigned char dat);
  47. /*LCD1602初始化子程序*/               
  48. void LcdInit();
  49. /*LCD1602显示程序*/
  50. void LcdDisplay();
  51. /*在51单片机12MHZ时钟下的延时函数*/
  52. void Delay1ms(unsigned int );
  53. /*DS18B20初始化子程序*/
  54. unsigned char Ds18b20Init();
  55. /*DS18B20写字节数据程序*/
  56. void Ds18b20WriteByte(unsigned char com);
  57. /*DS18B20读字节数据程序*/
  58. unsigned char Ds18b20ReadByte();
  59. /*DS18B20寄存器转温度临时值*/
  60. void  Ds18b20ChangTemp();
  61. /*DS18B20读取温度命令*/
  62. void  Ds18b20ReadTempCom();
  63. /*DS18B20读取数据,即上面定义的readVal变量值*/
  64. int Ds18b20ReadTemp();
  65. /*初始化定时器0  10ms中断一次,扫描按键*/
  66. void InitTimer0(void);
  67. /*扫描按键处理函数*/
  68. void KeyScan(void);
  69. /*IAP空闲待机函数*/
  70. void IapIdle();
  71. /*IAP读取一个字节函数*/
  72. unsigned char IapReadByte(unsigned int addr);
  73. /*IAP写一个字节函数*/
  74. void IapProgramByte(unsigned int addr, unsigned char dat);
  75. /*IAP扇区擦除函数*/
  76. void IapEraseSector(unsigned int addr);
  77. //主函数                              
  78. void main()
  79. {
  80.         unsigned char fh = 0;//0 -  1+
  81.         LED1=1;                   //开机时LED灯1灭
  82.         LED2=1;                   //开机时LED灯2灭
  83.         BUZZER = 0;           //蜂鸣器不响
  84.         fh = IapReadByte(HTEMP_ADDRESS);   //读取上限温度符号
  85.         HTemp = IapReadByte(HTEMP_ADDRESS+1);         //读取上限温度
  86.         if(fh == 0)
  87.                 HTemp = 0 - HTemp;      
  88.         fh = IapReadByte(LTEMP_ADDRESS);   //读取下限温度符号
  89.         LTemp = IapReadByte(LTEMP_ADDRESS+1);  //读取下限温度
  90.         if(fh == 0)
  91.                 LTemp = 0 - LTemp;
  92.         readVal = Ds18b20ReadTemp();  //从DS18B20读取的数据
  93.         Delay1ms(1000);
  94.         readVal = Ds18b20ReadTemp();  //从DS18B20读取的数据
  95.       
  96.         InitTimer0();  //初始化定时器0
  97.         LcdInit();           //LCD1602初始化
  98.         while(1)
  99.         {
  100.                 //readVal = Ds18b20ReadTemp();  //从DS18B20读取的数据
  101.                 if(SetMode == NORMAL_MODE)          //设置模式判断,正常运行时才显示及判断温度值是否需要报警
  102.                 {
  103.                         LcdDisplay();         //LCD1602显示
  104.                         if(CurTemp > HTemp)                  //当前温度大于报警高值
  105.                         {
  106.                                 LED1 = 0;
  107.                                 BUZZER = 1;
  108.                                 Delay1ms(500);
  109.                                 LED1 = 1;
  110.                                 BUZZER = 0;
  111.                                 Delay1ms(500);
  112.                         }
  113.                         else if(CurTemp < LTemp)                  //当前温度小于报警低值
  114.                         {
  115.                                 LED2 = 0;
  116.                                 BUZZER = 1;
  117.                                 Delay1ms(500);
  118.                                 LED2 = 1;
  119.                                 BUZZER = 0;
  120.                                 Delay1ms(500);
  121.                         }
  122.                 }      
  123.         }
  124. }
  125. void Delay10us(unsigned int c)   //误差 0us
  126. {
  127.     unsigned int a,b;
  128.     for(b=c;b>0;b--)
  129.         for(a=2;a>0;a--);
  130. }
  131. /*******************************************************************************
  132. * 函数名         : LcdWriteCom
  133. * 函数功能                   : 向LCD写入一个字节的命令
  134. * 输入           : com
  135. * 输出                  : 无
  136. *******************************************************************************/
  137. void LcdWriteCom(unsigned char com)          //写入命令
  138. {
  139.         LCD1602_E=0;
  140.         LCD1602_RS=0;
  141.         LCD1602_RW=0;
  142.         LCD1602_DATAPINS=com;
  143.         Delay10us(1);
  144.         //Delay1us(10);
  145.         LCD1602_E=1;
  146.         Delay10us(1);
  147.         //Delay1us(10);
  148.         LCD1602_E=0;
  149. }
  150. /*******************************************************************************
  151. * 函数名         : LcdWriteData
  152. * 函数功能                   : 向LCD写入一个字节的数据
  153. * 输入           : dat
  154. * 输出                  : 无
  155. *******************************************************************************/                             
  156. void LcdWriteData(unsigned char dat)                        //写入数据
  157. {
  158.         LCD1602_E=0;
  159.         LCD1602_RS=1;
  160.         LCD1602_RW=0;
  161.         LCD1602_DATAPINS=dat;
  162.         Delay10us(1);
  163.         LCD1602_E=1;
  164.         Delay10us(1);
  165.         LCD1602_E=0;
  166. }
  167. /*******************************************************************************
  168. * 函数名         : LcdInit()
  169. * 函数功能                   : 初始化LCD屏
  170. * 输入           : 无
  171. * 输出                  : 无
  172. *******************************************************************************/                  
  173. void LcdInit()                                                  //LCD初始化子程序
  174. {
  175.         LcdWriteCom(0x38);  //开显示
  176.         LcdWriteCom(0x0c);  //开显示不显示光标
  177.         LcdWriteCom(0x06);  //写一个指针加1
  178.         LcdWriteCom(0x01);  //清屏
  179.         LcdWriteCom(0x80);  //设置数据指针起点
  180. }
  181. void LcdDisplay()
  182. {
  183.         int tmp = 0;
  184.         char tmpH = 50;
  185.         char tmpL = 0;
  186.         unsigned char fh, ge, shi, xs; //定义数组
  187.         float tp;
  188.         tmp = readVal;
  189.         if(tmp< 0)                                //当温度值为负数
  190.         {
  191.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  192.                 tmp=tmp-1;
  193.                 tmp=~tmp;
  194.                 tp=tmp;
  195.                 tmp=tp*0.0625*10+0.5;      
  196.                 //留一个小数点就*10,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  197.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  198.                 //算加上0.5,还是在小数点后面。
  199.                 fh = '-';      
  200.         }
  201.         else
  202.         {
  203.                 tp=tmp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  204.                 //如果温度是正的那么,那么正数的原码就是补码它本身
  205.                 tmp=tp*0.0625*10+0.5;      
  206.                 //留一个小数点就*10,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  207.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  208.                 //算加上0.5,还是在小数点后面。
  209.                 fh = ' ';      
  210.         }
  211.       
  212.         shi = tmp % 1000 / 100; //显示温度十位数
  213.           ge = tmp % 100 / 10;         //显示温度个位数+小数点
  214.           xs = tmp % 10;                         //显示小数一位               
  215.         CurTemp = (shi*10)+ge+(xs*0.1);
  216.         if(fh == '-')
  217.         {
  218.                 CurTemp = 0-CurTemp;
  219.         }
  220.         LcdWriteCom(0x80+0X40);
  221.         LcdWriteData('C');                              
  222.         LcdWriteData('u');
  223.         LcdWriteData('r');                        
  224.         LcdWriteData(':');
  225.         LcdWriteData(fh);
  226.         LcdWriteData('0'+shi);                              
  227.         LcdWriteData('0'+ge);      
  228.         LcdWriteData('.');
  229.         LcdWriteData('0'+xs);                              
  230.         LcdWriteData('C');
  231. LcdWriteCom(0x80);
  232.         LcdWriteData('H');                              
  233.         LcdWriteData(':');
  234.         tmpH=HTemp;
  235.         if(tmpH<0)
  236.         {
  237.                 fh = '-';
  238.                 tmpH = 0-tmpH;
  239.         }      
  240.         else
  241.                 fh = ' ';
  242.         LcdWriteData(fh);
  243.         LcdWriteData('0'+ (tmpH/10));
  244.         LcdWriteData('0'+ (tmpH%10));      
  245.         LcdWriteData('C');
  246.         LcdWriteCom(0x88);
  247.         LcdWriteData('L');                        
  248.         LcdWriteData(':');
  249.         tmpL=LTemp;
  250.         if(tmpL<0)
  251.         {
  252.                 fh = '-';
  253.                 tmpL = 0-tmpL;
  254.         }
  255.         else
  256.                 fh = ' ';
  257.         LcdWriteData(fh);
  258.         LcdWriteData('0'+ (tmpL/10));
  259.         LcdWriteData('0'+ (tmpL%10));
  260.         LcdWriteData('C');                 
  261. }
  262. /*******************************************************************************
  263. * 函数名         : Delay1ms
  264. * 函数功能                   : 延时函数
  265. * 输入           : 无
  266. * 输出                  : 无
  267. *******************************************************************************/
  268. void Delay1ms(unsigned int y)
  269. {
  270.         unsigned int x;
  271.         for(y;y>0;y--)
  272.                 for(x=110;x>0;x--);
  273. }
  274. /*******************************************************************************
  275. * 函数名         : Ds18b20Init
  276. * 函数功能                   : 初始化
  277. * 输入           : 无
  278. * 输出                  : 初始化成功返回1,失败返回0
  279. *******************************************************************************/
  280. unsigned char Ds18b20Init()
  281. {
  282.         unsigned int i;
  283.         DSPORT=0;                         //将总线拉低480us~960us
  284.         i=70;      
  285.         while(i--);//延时642us
  286.         DSPORT=1;                        //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
  287.         i=0;
  288.         while(DSPORT)        //等待DS18B20拉低总线
  289.         {
  290.                 i++;
  291.                 if(i>5000)//等待>5MS
  292.                         return 0;//初始化失败      
  293.         }
  294.         return 1;//初始化成功
  295. }
  296. /*******************************************************************************
  297. * 函数名         : Ds18b20WriteByte
  298. * 函数功能                   : 向18B20写入一个字节
  299. * 输入           : com
  300. * 输出                  : 无
  301. *******************************************************************************/
  302. void Ds18b20WriteByte(unsigned char dat)
  303. {
  304.         unsigned int i,j;
  305.         for(j=0;j<8;j++)
  306.         {
  307.                 DSPORT=0;                        //每写入一位数据之前先把总线拉低1us
  308.                 i++;
  309.                 DSPORT=dat&0x01; //然后写入一个数据,从最低位开始
  310.                 i=6;
  311.                 while(i--); //延时68us,持续时间最少60us
  312.                 DSPORT=1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
  313.                 dat>>=1;
  314.         }
  315. }
  316. /*******************************************************************************
  317. * 函数名         : Ds18b20ReadByte
  318. * 函数功能                   : 读取一个字节
  319. * 输入           : com
  320. * 输出                  : 无
  321. *******************************************************************************/
  322. unsigned char Ds18b20ReadByte()
  323. {
  324.         unsigned char byte,bi;
  325.         unsigned int i,j;      
  326.         for(j=8;j>0;j--)
  327.         {
  328.                 DSPORT=0;//先将总线拉低1us
  329.                 i++;
  330.                 DSPORT=1;//然后释放总线
  331.                 i++;
  332.                 i++;//延时6us等待数据稳定
  333.                 bi=DSPORT;         //读取数据,从最低位开始读取
  334.                 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
  335.                 byte=(byte>>1)|(bi<<7);                                                  
  336.                 i=4;                //读取完之后等待48us再接着读取下一个数
  337.                 while(i--);
  338.         }                              
  339.         return byte;
  340. }
  341. /*******************************************************************************
  342. * 函数名         : Ds18b20ChangTemp
  343. * 函数功能                   : 让18b20开始转换温度
  344. * 输入           : com
  345. * 输出                  : 无
  346. *******************************************************************************/
  347. void  Ds18b20ChangTemp()
  348. {
  349.         Ds18b20Init();
  350.         Delay1ms(1);
  351.         Ds18b20WriteByte(0xcc);                //跳过ROM操作命令                 
  352.         Ds18b20WriteByte(0x44);          //温度转换命令
  353.         Delay1ms(100);
  354. }
  355. /*******************************************************************************
  356. * 函数名         : Ds18b20ReadTempCom
  357. * 函数功能                   : 发送读取温度命令
  358. * 输入           : com
  359. * 输出                  : 无
  360. *******************************************************************************/
  361. void  Ds18b20ReadTempCom()
  362. {      
  363.         Ds18b20Init();
  364.         Delay1ms(1);
  365.         Ds18b20WriteByte(0xcc);         //跳过ROM操作命令
  366.         Ds18b20WriteByte(0xbe);         //发送读取温度命令
  367. }
  368. /*******************************************************************************
  369. * 函数名         : Ds18b20ReadTemp
  370. * 函数功能                   : 读取温度
  371. * 输入           : com
  372. * 输出                  : 无
  373. *******************************************************************************/
  374. int Ds18b20ReadTemp()
  375. {
  376.         int temp=0;
  377.         unsigned char tmh,tml;
  378.         Ds18b20ChangTemp();                                 //先写入转换命令
  379.         Ds18b20ReadTempCom();                        //然后等待转换完后发送读取温度命令
  380.         tml=Ds18b20ReadByte();                //读取温度值共16位,先读低字节
  381.         tmh=Ds18b20ReadByte();                //再读高字节
  382.         temp=tmh;
  383.         temp<<=8;
  384.         temp|=tml;
  385.         return temp;
  386. }               
  387. void KeyScan()
  388. {
  389.         if(SET_KEY==0)
  390.         {
  391.                 Delay1ms(50);
  392.                 if((SET_KEY==0)&&(setKeyVal==1))
  393.                 {
  394.                         setKeyVal = 0;
  395.                         switch(SetMode)
  396.                         {
  397.                                 case NORMAL_MODE:
  398.                                         SetMode = SET_H_TEMP_MODE;
  399.                                        
  400.                                         LcdWriteCom(0x0f);        //显示光标
  401.                                         LcdDisplay();
  402.                                         LcdWriteCom(0x84);  //设置guangbiao
  403.                                         break;
  404.                                 case SET_H_TEMP_MODE:
  405.                                         SetMode = SET_L_TEMP_MODE;
  406.                               
  407.                                         LcdWriteCom(0x0f);        //显示光标
  408.                                         LcdDisplay();
  409.                                         LcdWriteCom(0x8c);  //设置guangbiao
  410.                                         break;
  411.                                 case SET_L_TEMP_MODE:
  412.                                         SetMode = SET_H_TEMP_MODE;
  413.                                         LcdWriteCom(0x0f);        //显示光标
  414.                                         LcdDisplay();
  415.                                         LcdWriteCom(0x84);  //设置guangbiao
  416.                                         break;
  417.                                 default:
  418.                                         SetMode = NORMAL_MODE;
  419.                                         LcdWriteCom(0x0c);  //开显示不显示光标
  420.                                         LcdWriteCom(0x80);  //设置guangbiao
  421.                                         LcdDisplay();
  422.                                         break;
  423.                         }      
  424.                 }
  425.         }
  426.         else
  427.         {
  428.                 setKeyVal = 1;
  429.         }
  430.         if(JIA_KEY == 0)
  431.         {
  432.                 Delay1ms(50);
  433.                 if((JIA_KEY==0)&&(jiaKeyVal==1))
  434.                 {
  435.                         jiaKeyVal = 0;
  436.                         switch(SetMode)
  437.                         {
  438.                                 case SET_H_TEMP_MODE:
  439.                                         if((HTemp>=-55)&&(HTemp<125))
  440.                                                 HTemp++;
  441.                                         LcdDisplay();
  442.                                         LcdWriteCom(0x0f);        //显示光标
  443.                                         LcdWriteCom(0x84);  //设置光标
  444.                                         break;
  445.                                 case SET_L_TEMP_MODE:
  446.                                         if((LTemp>=-55)&&(LTemp<125)&&(LTemp<HTemp-1))
  447.                                                 LTemp++;
  448.                                         LcdDisplay();
  449.                                         LcdWriteCom(0x0f);        //显示光标
  450.                                         LcdWriteCom(0x8c);  //设置光标
  451.                                         break;
  452.                                 default:
  453.                                         break;
  454.                         }
  455.                 }      
  456.         }
  457.         else
  458.         {
  459.                 jiaKeyVal = 1;
  460.         }
  461.         if(JIAN_KEY == 0)
  462.         {
  463.                 Delay1ms(50);
  464.                 if((JIAN_KEY==0)&&(jianKeyVal==1))
  465.                 {
  466.                         jianKeyVal = 0;
  467.                         switch(SetMode)
  468.                         {
  469.                                 case SET_H_TEMP_MODE:
  470.                                         if((HTemp>=-55)&&(HTemp<=125)&&(HTemp>LTemp+1))
  471.                                                 HTemp--;
  472.                                         LcdDisplay();
  473.                                         LcdWriteCom(0x0f);        //显示光标
  474.                                         LcdWriteCom(0x84);  //设置光标
  475.                                         break;
  476.                                 case SET_L_TEMP_MODE:
  477.                                         if((LTemp>-55)&&(LTemp<=125))
  478.                                                 LTemp--;
  479.                                         LcdDisplay();
  480.                                         LcdWriteCom(0x0f);        //显示光标
  481.                                         LcdWriteCom(0x8c);  //设置光标
  482.                                         break;
  483.                                 default:
  484.                                         break;
  485.                         }
  486.                 }      
  487.         }
  488.         else
  489.         {
  490.                 jianKeyVal=1;
  491.         }
  492.         if(QUEREN_KEY == 0)
  493.         {
  494.                 Delay1ms(50);
  495.                 if((QUEREN_KEY==0)&&(querenKeyVal==1))
  496.                 {
  497.                         querenKeyVal = 0;
  498.                         SetMode = NORMAL_MODE;
  499.                         LcdWriteCom(0x0c);  //开显示不显示光标
  500.                         LcdWriteCom(0x80);  //设置guangbiao
  501.                         LcdDisplay();
  502.                         IapEraseSector(HTEMP_ADDRESS);
  503.                         if(HTemp < 0)
  504.                         {
  505.                                 IapProgramByte(HTEMP_ADDRESS, 0);
  506.                                 IapProgramByte(HTEMP_ADDRESS+1, (0-HTemp));
  507.                         }
  508.                         else
  509.                         {
  510.                                 IapProgramByte(HTEMP_ADDRESS, 1);
  511.                                 IapProgramByte(HTEMP_ADDRESS+1, HTemp);
  512.                         }
  513.                         if(LTemp < 0)
  514.                         {
  515.                                 IapProgramByte(LTEMP_ADDRESS, 0);
  516.                                 IapProgramByte(LTEMP_ADDRESS+1, (0-LTemp));
  517.                         }
  518.                         else
  519.                         {
  520.                                 IapProgramByte(LTEMP_ADDRESS, 1);
  521.                                 IapProgramByte(LTEMP_ADDRESS+1, LTemp);
  522.                         }      
  523.                 }      
  524.         }
  525.         else
  526.         {
  527.                 querenKeyVal = 1;
  528.         }      
  529. }
  530. void InitTimer0(void)//10ms
  531. {
  532.     TMOD = 0x01;
  533.     TH0 = 0x0D8;
  534.     TL0 = 0x0F0;
  535.     EA = 1;
  536.     ET0 = 1;
  537.     TR0 = 1;
  538. }
  539. void Timer0Interrupt(void) interrupt 1                 //10ms进一次中断
  540. {
  541.         TR0 = 0;
  542.         TimeoutNum++;
  543.         KeyScan();
  544.         if(TimeoutNum>=200)//2000ms
  545.         {
  546.                 TimeoutNum = 0;
  547.                 readVal = Ds18b20ReadTemp();
  548.         }
  549.         TH0 = 0xD8;
  550.             TL0 = 0xF0;
  551.         TR0 = 1;
  552. }
  553. /*IAP空闲待机函数*/
  554. void IapIdle()
  555. {
  556.     IAP_CONTR = 0;                  //关闭存储器操作
  557.     IAP_CMD = 0;                    //清除命令
  558.     IAP_TRIG = 0;                   //清除触发寄存器
  559.     IAP_ADDRH = 0x20;               //存储器IAP高地址
  560.     IAP_ADDRL = 0;                  //存储器IAP低地址
  561. }
  562. /*IAP读取一个字节函数*/
  563. unsigned char IapReadByte(unsigned int addr)
  564. {
  565.     unsigned char dat;              //定义数据Buf
  566.     IAP_CONTR = ENABLE_IAP;         //使能存储器操作
  567.     IAP_CMD = CMD_READ;             //设置IAP为读操作
  568.     IAP_ADDRL = addr;               //设置读的地址低8位
  569.     IAP_ADDRH = addr >> 8;          //设置读的地址高8位
  570.     IAP_TRIG = 0x46;                //发送触发命令1
  571.     IAP_TRIG = 0xb9;                //发送触发命令2
  572.     _nop_();                        //指令延时
  573.     dat = IAP_DATA;                 //读取数据
  574.     IapIdle();                      //IAP空闲待机
  575.     return dat;                     //返回读取到的数据
  576. }
  577. /*IAP写一个字节函数*/
  578. void IapProgramByte(unsigned int addr, unsigned char dat)
  579. {
  580.     IAP_CONTR = ENABLE_IAP;         //使能存储器操作
  581.     IAP_CMD = CMD_PROGRAM;          //设置IAP为写操作
  582.     IAP_ADDRL = addr;               //设置写的地址低8位
  583.     IAP_ADDRH = addr >> 8;          //设置写的地址高8位
  584.     IAP_DATA = dat;                 //写数据
  585.     IAP_TRIG = 0x46;                //发送触发命令1
  586.     IAP_TRIG = 0xb9;                //发送触发命令2
  587.     _nop_();                        
  588.     IapIdle();                                                //IAP空闲待机
  589. }
  590. /*IAP扇区擦除函数*/
  591. void IapEraseSector(unsigned int addr)
  592. {
  593.     IAP_CONTR = ENABLE_IAP;         //使能存储器操作
  594.     IAP_CMD = CMD_ERASE;            //设置IAP为扇区擦除操作
  595.     IAP_ADDRL = addr;               //设置扇区擦除起始地址低8位
  596.     IAP_ADDRH = addr >> 8;          //设置扇区擦除起始地址高8位
  597.     IAP_TRIG = 0x46;                //发送触发命令1
  598.     IAP_TRIG = 0xb9;                //发送触发命令2
  599.     _nop_();                        
  600.     IapIdle();                                                //IAP空闲待机
  601. }
复制代码


最佳答案

查看完整内容

你必须将上下限放在非易失性的存储器,每次初始化时取之,修改后存之,这样就不会归0了。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2018-6-8 16:15 | 只看该作者
你必须将上下限放在非易失性的存储器,每次初始化时取之,修改后存之,这样就不会归0了。
回复

使用道具 举报

板凳
ID:347552 发表于 2018-6-8 17:58 | 只看该作者
可以不用这个程序,但是要实现测量温度,温度上下限设置,超过温度上下限就会报警,LED灯会亮,蜂鸣器报警就可以了,希望有大神可以解答。
回复

使用道具 举报

地板
ID:320306 发表于 2018-6-8 21:19 | 只看该作者
LED灯的电阻设置有问题!!
回复

使用道具 举报

5#
ID:303383 发表于 2018-6-8 21:53 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

6#
ID:347552 发表于 2018-6-8 23:48 | 只看该作者
小猫猫爱吃鱼 发表于 2018-6-8 21:53
你好!加一个存储芯片吧,论文也能增加字数

老师要的是仿真结果,要字数有什么用,字数也不差,而且单片机内部有存储器,你这也够水的
回复

使用道具 举报

7#
ID:347552 发表于 2018-6-8 23:48 | 只看该作者
zsyzdx 发表于 2018-6-8 21:19
LED灯的电阻设置有问题!!

具体是怎么设置的呢
回复

使用道具 举报

8#
ID:295874 发表于 2018-6-9 14:51 来自手机 | 只看该作者
你的原图的指示灯限流电阻可以改为1000的。其次程序中看不出在哪里存储温度设定值了!只看到上电初始化就读取。
回复

使用道具 举报

9#
ID:347552 发表于 2018-6-9 22:35 | 只看该作者
liyongan_1985 发表于 2018-6-9 14:51
你的原图的指示灯限流电阻可以改为1000的。其次程序中看不出在哪里存储温度设定值了!只看到上电初始化就读 ...

可以帮我加一个可以存储温度设定的程序吗?谢谢!
回复

使用道具 举报

10#
ID:663013 发表于 2019-12-25 10:20 | 只看该作者
太好了
回复

使用道具 举报

11#
ID:130230 发表于 2019-12-31 16:20 | 只看该作者
想掉电保存必须使用eeprom或者用flash模拟
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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