当前位置:   article > 正文

蓝桥杯单片机准备总结_51单片机中rb2是什么电阻

51单片机中rb2是什么电阻

        对蓝桥杯单片机类知识点的一次抱佛脚总结 :(

目录

1、DS18B20

2、DS1302

3、定时计数器

4、PWM脉宽调制

5、NE555频率测量

6、A/D&D/A转换

7、AT24C02(EEPROM)

8、超声波测距

9、串口通信

10、底层驱动修改

11、第十四届模拟二程序(主函数)


1、DS18B20

(1)简单读取出温度

  1. #include "onewire.h"
  2. float temp=0; //定义一个温度变量
  3. void Read_Temp()
  4. {
  5. uchar LSB,MSB; //定义出低八位和高八位接收变量
  6. init_ds18b20();//初始化DS18B20
  7. Write_DS18B20(0xcc); //跳过RAM
  8. Write_DS18B20(0x44); //开始温度转换
  9. Delay_Display(500); //延时等待应答,同时不影响数码管和LED灯的显示
  10. init_ds18b20();//重新初始化DS18B20
  11. Write_DS18B20(0xcc); //跳过RAM
  12. Write_DS18B20(0xbe); //读取温度
  13. LSB=Read_DS18B20(); //先读低八位
  14. MSB=Read_DS18B20(); //再读高八位
  15. temp=(MSB<<8)|LSB; //合并高低位
  16. if(temp&0xf800==0x0000) //判断temp是否大于0(高五位为符号位)
  17. temp==temp>>4; //低四位为小数位,若要读出整数,则直接将低四位丢弃
  18. else
  19. temp=(1-temp)>>4; //若温度小于0,先取反后移走小数位
  20. }

(2)温度保留小数

        若题目要求保留*位小数(以两位小数为例):

  1. temp=temp>>4; //先将小数位移走
  2. temp=temp*100; //将整数部分放大一百倍(利于后续显示)
  3. temp=temp+((LSB&0x0f)*0.0625)*100; //取出低四位(小数位),乘以精度(0.0625),再放大100倍
  4. //或直接:
  5. temp=temp*0.0625*100;

2、DS1302

(1)将时间写入芯片

        通常是将初始化时间写入其中(放在主函数while之前):

  1. #include "ds1302.h"
  2. uchar DS1302_WriteAddress[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //写地址
  3. uchar Time[7]={0x59,0x59,0x23,0x04,0x04,0x02,0x23}; //初始化时间2023/4/4 23:59:59 星期二
  4. void Write_DS1302()
  5. {
  6. uchar i;
  7. Write_Ds1302_Byte(0x8e,0x00); //打开写保护
  8. for(i=0;i<7;i++)
  9. Write_Ds1302_Byte(DS1302_WriteAddress[i],Time[i]); //将每一位写入
  10. Write_Ds1302_Byte(0x8e,0x80); //关闭写保护
  11. }

(2)从芯片中读时间

  1. #include "ds1302.h"
  2. uchar Read_DS1302Address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
  3. void Read_DS1302()
  4. {
  5. uchar i;
  6. for(i=0;i<7;i++)
  7. Time[i]=Read_Ds1302_Byte(Read_DS1302Address[i]);
  8. }

        时间和温度传感器比较基础简单,一些记不住的指令、地址格式,要学会查找芯片手册,很容易就能找到。

3、定时计数器

        可用来定时、计数。可用定时计数器实现的模块有PWM脉宽调制、NE555、超声波测距、串口调制......

        通常可以用烧录软件直接生成定时器初始化代码,选择12T然后再将总中断和定时器中断打开即可。

        演示定时器0,16位定时器,定时100us:

  1. void Timer0Init(void) //100微秒@12.000MHz
  2. {
  3. AUXR &= 0x7F; //定时器时钟12T模式
  4. TMOD &= 0xF0; //设置定时器模式
  5. TMOD |= 0x01; //设置定时器模式
  6. TL0 = 0x9C; //设置定时初始值
  7. TH0 = 0xFF; //设置定时初始值
  8. TF0 = 0; //清除TF0标志
  9. TR0 = 1; //定时器0开始计时
  10. //以上均为软件直接生成
  11. EA=1; //打开总中断
  12. ET0=1; //打开定时器0中断
  13. }

        用户手册的查询很重要!!!

4、PWM脉宽调制

常用参数:

·pwm_count:计数(以达到占空比和总频率数量)

·pwm_duty:占空比(对应的数值)

·pwm_flag:当前PWM控制的外设的状态(通常为0灭/关 1亮/开)

  1. //假设信号频率为1KHZ
  2. //则 f=1000hz T=1ms=1000us=100*10
  3. uint pwm_count=0; //pwm占空(或占高电平)的计数值
  4. uint pwm_duty=30; //pwm规定占空比的值
  5. bit pwm_flag=0; //pwm控制的外设的当前状态位
  6. void InitTimer0() //定时100us
  7. {
  8. TMOD=0x01;
  9. TH0=(65535-100)/256;
  10. TL0=(65535-100)%256;
  11. TR0=1;
  12. ET0=1;
  13. EA=1;
  14. }
  15. void Service_Timer0() //在定时器0的中断服务函数中进行脉宽调制
  16. {
  17. TH0=(65535-100)/256;
  18. TL0=(65535-100)%256;
  19. //PWM脉宽调制
  20. pwm_count++;
  21. if(pwm_count>=pwm_duty) //占空比设定
  22. pwm_flag=1;
  23. if(pwm_count>=10) //整个周期
  24. {
  25. pwm_count=0;
  26. pwm_flag=0;
  27. }
  28. }

5、NE555频率测量

        频率即为1s中信号发生的次数。测量频率可用Timer0做计数器,初值调到最大,这样来一个脉冲产生一次定时器中断。Timer1做定时器,定时1s。

  1. uint f_count=0; //脉冲计数
  2. uint f_number=0;//频率值
  3. uint count=0; //定时器计数
  4. //1s = 1000ms = 1000000us = 50000 * 20
  5. void InitTimer() //Timer0和Timer1初始化
  6. {
  7. TMOD=0x16; //0001 0110
  8. TH0=0xff;
  9. TL0=0xff;
  10. TH1=(65535-50000)/256;
  11. TL1=(65535-50000)%256;
  12. EA=1;
  13. ET0=1;
  14. ET1=1;
  15. TR0=1;
  16. TR1=1;
  17. }
  18. void Service_Timer0() interrupt 1
  19. {
  20. f_count++;
  21. }
  22. void Service_Timer1() interrupt 2
  23. {
  24. TH1=(65535-50000)/256;
  25. TL1=(65535-50000)%256;
  26. count++;
  27. if(count>=20) //计时到一秒后
  28. {
  29. f_number=f_count; //记录下当前的频率计数值作为频率值
  30. f_count=0;
  31. count=0;
  32. }
  33. }

6、A/D&D/A转换

        通常用到的电阻为通道1的光敏电阻和通道3的滑阻(rb2),同时需要注意AD转换周期总是在发送一个有效的读模式地址到PCF8591设备后开始,即本次显示的电压是上次采集到的电压。

        以通道3的rb2(光敏电阻)为例:

(1)AD转换(读取电压)

  1. #include "iic.h"
  2. uint rb2=0; //用于存放读取的rb2的值
  3. void Ad_Read()
  4. {
  5. IIC_Start(); //iic开始信号
  6. IIC_SendByte(0x90); //写控制字
  7. IIC_WaitAck(); //等待应答
  8. IIC_SendByte(0x43);//将要读的地址写入
  9. IIC_WaitAck();
  10. IIC_Start(); //iic开始信号
  11. IIC_SendByte(0x91); //读控制字
  12. IIC_WaitAck(); //等待应答
  13. rb2=IIC_RecByte(); //读取电压值
  14. IIC_SendAck(1); //发送应答,表明可以结束了
  15. IIC_Stop(); //总线停止
  16. }

读取出的是 数字量 ,即若此时直接用数码管显示,显示出的值为0~255 

若要显示出读到的模拟量,直接用rb2/51.0即可

(2)DA转换

  1. void Da_Write(uint dat) //此处dat为数字量(0~255)
  2. {
  3. IIC_Start();
  4. IIC_SendByte(0x90); //发送写控制字
  5. IIC_WaitAck();
  6. IIC_SendByte(0x43); //发送写入的地址
  7. IIC_WaitAck();
  8. IIC_SendByte(dat); //写入DAC的值
  9. IIC_WaitAck();
  10. IIC_Stop();
  11. }

直接调用   如:Da_Write(127);  则通道三输出模拟量即为127/51

7、AT24C02(EEPROM)

        EEPROM掉电不丢失,常用于保存数据。在下次上电瞬间读出(即将读操作放在while(1)循环之前)。与PCF8591同样使用iic协议,故读写步骤基本相同。

(1)读操作

  1. uint Read_AT24C02(uchar addr)
  2. {
  3. uint temp=0;
  4. //从地址addr中读出数据,此处addr可自己定义,通常从0x00开始
  5. IIC_Start();
  6. IIC_SendByte(0xa0); //发送写控制字
  7. IIC_WaitAck();
  8. IIC_SendByte(addr); //将地址写入
  9. IIC_WaitAck();
  10. IIC_SendByte(0xa1); //发送读控制字
  11. IIC_WaitAck();
  12. temp=IIC_RecByte(); //读取数据
  13. IIC_SendAck(1); //发送结束应答
  14. IIC_Stop(); //总线停止
  15. return temp;
  16. }

(2)写操作

  1. void Write_AT2402(uchar addr,uchar dat)
  2. {
  3. IIC_Start();
  4. IIC_SendByte(0x90); //写控制字
  5. IIC_WaitAck();
  6. IIC_SendByte(addr); //写入地址
  7. IIC_WaitAck();
  8. IIC_SendByte(dat); //写入数据
  9. IIC_WaitAck();
  10. IIC_Stop();
  11. }

8、超声波测距

        Tx为发射信号一端,地址为P1^0;Rx为接收信号的一端,地址为P1^1

        Tx=1时成功发送信号,Tx=0时发送失败;

        Rx=0时成功接收信号,Rx=1时接收失败。

  1. sbit Tx=P1^0;
  2. sbit Rx=P1^1;
  3. void Wave_Init() //超声波初始化函数,实际上就是发射8个40khz的超声波信号
  4. {
  5. uchar i;
  6. for(i=0;i<8;i++)
  7. {
  8. Tx=1;
  9. //f=40khz,T=1/f=25us,方波占空比为50%,即延时12.5us
  10. Delay12us();
  11. Tx=0;
  12. Delay12us();
  13. }
  14. }
  15. uchar Wave_Data() //超声波距离读取函数
  16. {
  17. uint time=0; //时间储存变量
  18. TMOD&=0x0f //T1计数模式、十六位自动重装,T0设置不变
  19. TH1=TL1=0;
  20. Wave_Init(); //发送超声波信号
  21. TR1=1; //开始计时
  22. while((Rx==1)&&(TF1==0)); //等待接收信号,同时计数器没有溢出
  23. TR1=0; //停止计时
  24. if(TF1==0) //计数器1没有溢出
  25. {
  26. time=(TH1<<8)|TL1;
  27. // return (time*(340/2)*0.000001*100); //cm为单位
  28. return (time*0.017); //直接这样写!否则会出错!
  29. }
  30. else
  31. {
  32. TF1=0; //清除溢出标志位
  33. return 0;
  34. }
  35. }

9、串口通信

        串行通信。SCON串行控制器,一般使用01方式1,8位UART,波特率可变(波特率类似于传输速度)。

        串行口1缓冲寄存器(SBUF)的地址是99H,实际是两个缓冲器,一个是发送寄存器,一个是接收寄存器,物理结构上完全独立,字节地址均为99H,是通过读/写指令来区分的。

        串行发送时:CPU向SBUF写入数据,此时99H表示发送缓存SBUF

        串行接收时:CPU向SBUF读取数据,此时99H表示接收缓存SBUF

数据发送:数据丢进SBUF,内核自动发送,发送完毕,TI标志位置1;

数据接收:内核从串口接收到一个完整数据后,RI置1,用户用SBUF读取。

IE中有EA=1;(总中断打开)ES=1;(串口中断打开)

串口设计使用一般要写三个函数:串口初始化函数、字节发送函数、串口中断服务函数(接收数据,使用中断)。

 (1)串口初始化函数

  1. //STC软件--系统频率12--串口1--波特率(默认)9600--8位数据--定时器2--定时器时钟12T
  2. void UartInit(void) //9600bps@12.000MHz
  3. {
  4. SCON = 0x50; //8位数据,可变波特率
  5. AUXR |= 0x01; //串口1选择定时器2为波特率发生器
  6. AUXR &= 0xFB; //定时器时钟12T模式
  7. T2L = 0xE6; //设置定时初始值
  8. T2H = 0xFF; //设置定时初始值
  9. AUXR |= 0x10; //定时器2开始计时
  10. //加入:
  11. EA=1;
  12. ES=1;
  13. }

(2)字节发送函数

  1. void SendByte(unsigned char dat)
  2. {
  3. SBUF=dat; //将dat赋给SBUF,将数据发送出去
  4. while(TI==0); //等待数据发送
  5. TI=0; //发送标志位清0
  6. }

(3)字符串发送函数

  1. void Uart_Send_String(uchar *dat)
  2. {
  3. while(*dat!='\0')
  4. SendByte(*dat++);
  5. }

(4)串口接收数据(串口1中断服务函数)

  1. uchar Uart_Recv[10]; //串口接收数据存储数组
  2. uchar Uart_Send[10]; //串口发送数据存储数组
  3. uchar Uart_Recv_Index=0; //串口接收数组指针
  4. void Uart1Server() interrupt 4
  5. {
  6. if(RI==1) //串口接收到数据
  7. {
  8. Uart_Recv[Uart_Recv_Index]=SBUF;
  9. Uart_Recv_Index++;
  10. RI=0;
  11. }
  12. }

串口助手:选择文本模式--串口选择USB所在串口--波特率9600--编程完自动打开串口

 (5)比赛中发送数据

  1. //假设单片机要发送 温度=23.36 类似格式到pc:
  2. //使用字符串格式化函数 sprintf
  3. #include "stdio.h"
  4. //通常用在按键里,如按下S9发送:
  5. void ScanKeys()
  6. {
  7. if(Ket_Down==9)
  8. {
  9. sprintf(Uart_Send,"温度 = %.2f\r\n",t); //格式化字符串
  10. Uart_SendString(Uart_Send); //发送
  11. }
  12. }

(6)比赛中发送指令让单片机做对应操作

  1. //1.发送区发送数字,数码管显示该数字
  2. uchar dat;
  3. void Uart_Proc()
  4. {
  5. if(Uart_Recv_Index==1)
  6. {
  7. dat=Uart_Recv[0]-48; //ASCII码-48
  8. Uart_Recv_Index=0; //复位为0
  9. }
  10. //后面再将dat直接显示到数码管即可
  11. }
  1. //2.发LED0=0,则让LED0熄灭。。。
  2. //LED_=_ 一共六位
  3. void Uart_Proc()
  4. {
  5. if(Uart_Recv_Index==6) //直接先判断是不是六位
  6. {
  7. if(Uart_Recv[0]=='L'&&Uart_Recv[1]=='E'&&Uart_Recv[2]=='D'&&Uart_Recv[4]=='=')
  8. {
  9. SelectHC573(4);
  10. ucLED[Uart_Recv[3]-48] = Uart_Recv[5] - 48;
  11. Uart_Recv_Index = 0;
  12. }
  13. }
  14. }

10、底层驱动修改

(1)iic:

 (2)onewire:

 再加上.h文件即可

(3)ds1302:

 引脚定义均可在原理图上找到。

11、第十四届模拟二程序(主函数)(这套模拟题还蛮综合的

  1. #include "reg52.h"
  2. #include "onewire.h"
  3. #include "iic.h"
  4. #include "stdio.h"
  5. typedef unsigned int uint;
  6. typedef unsigned char uchar;
  7. sfr AUXR=0x8e;
  8. sfr T2L=0xd7;
  9. sfr T2H=0xd6;
  10. sfr P4=0xc0;
  11. sbit C1=P4^4;
  12. sbit C3=P3^5;
  13. sbit R3=P3^2;
  14. sbit R4=P3^3;
  15. sbit L1=P0^0;
  16. sbit L2=P0^1;
  17. sbit L3=P0^2;
  18. sbit buzzer=P0^6;
  19. sbit relay=P0^4;
  20. uchar SMG_NoDot[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  21. uchar SMG_Dot[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  22. uchar lock=0; //按键S4标志位 0:解锁,1:锁死
  23. uchar uart_flag=0; //串口发送标志位
  24. uint temp=0; //读取温度数值
  25. uint ad_v=0; //电压读取
  26. uint count=0; //闪烁计数
  27. uchar Data=0; //串口接收数据
  28. uchar Uart_Send[20];//串口发送数组
  29. uchar mode=0; //显示界面模式 0:温度数据 1:电压数据
  30. bit L3_flag=0; //L3闪烁标志位
  31. void Delay_Display(uint t);
  32. void LedRunning();
  33. void Relay_Buzzer();
  34. //=====================系统初始化======================
  35. void Delay(uint t)
  36. {
  37. while(t--);
  38. }
  39. void SelectHC573(uchar channel)
  40. {
  41. switch(channel)
  42. {
  43. case 4:
  44. P2=(P2&0x1f)|0x80;break;
  45. case 5:
  46. P2=(P2&0x1f)|0xa0;break;
  47. case 6:
  48. P2=(P2&0x1f)|0xc0;break;
  49. case 7:
  50. P2=(P2&0x1f)|0xe0;break;
  51. case 0:
  52. P2=(P2&0x1f)|0x00;break;
  53. }
  54. }
  55. void InitSystem()
  56. {
  57. SelectHC573(4);
  58. P0=0xff;
  59. SelectHC573(5);
  60. P0=0x00;
  61. SelectHC573(0);
  62. }
  63. //=====================================================
  64. //=======================温度读取=======================
  65. void Read_Temp()
  66. {
  67. uchar LSB,MSB;
  68. init_ds18b20();
  69. Write_DS18B20(0xcc);
  70. Write_DS18B20(0x44);
  71. Delay_Display(100);
  72. init_ds18b20();
  73. Write_DS18B20(0xcc);
  74. Write_DS18B20(0xbe);
  75. LSB=Read_DS18B20();
  76. MSB=Read_DS18B20();
  77. temp=(MSB<<8)|LSB;
  78. if((temp&0xf800)==0x0000) //若温度大于0
  79. {
  80. temp=(temp>>4)*10;
  81. temp=temp+(LSB&0x0f)*0.0625*10;
  82. }
  83. }
  84. //======================================================
  85. //==================rb2(通道三)电压读取==================
  86. void Read_v()
  87. {
  88. uchar v;
  89. IIC_Start();
  90. IIC_SendByte(0x90); //发送写命令字
  91. IIC_WaitAck();
  92. IIC_SendByte(0x43); //写入要读的电压所在地址
  93. IIC_WaitAck();
  94. IIC_Start();
  95. IIC_SendByte(0x91); //发送读命令字
  96. IIC_WaitAck();
  97. v=IIC_RecByte();
  98. IIC_SendAck(1);
  99. IIC_Stop();
  100. ad_v=v*(5.0/255)*100;
  101. }
  102. //=======================================================
  103. //=====================定时器相关函数====================
  104. void Timer0Init(void) //10000微秒@12.000MHz
  105. {
  106. AUXR &= 0x7F; //定时器时钟12T模式
  107. TMOD &= 0xF0; //设置定时器模式
  108. TMOD |= 0x01; //设置定时器模式
  109. TL0 = 0xF0; //设置定时初始值
  110. TH0 = 0xD8; //设置定时初始值
  111. TF0 = 0; //清除TF0标志
  112. //TR0 = 1; //定时器0开始计时
  113. EA=1;
  114. ET0=1;
  115. }
  116. void Timer0_Server() interrupt 1
  117. {
  118. //0.1s=100ms=100000us = 10000*10
  119. TL0 = 0xF0; //设置定时初始值
  120. TH0 = 0xD8; //设置定时初始值
  121. if(lock==1)
  122. {
  123. count++;
  124. if(count>=10)
  125. {
  126. L3_flag=~L3_flag;
  127. count=0;
  128. }
  129. }
  130. }
  131. //========================================================
  132. //==================串口相关函数==========================
  133. void UartInit(void) //9600bps@12.000MHz
  134. {
  135. SCON = 0x50; //8位数据,可变波特率
  136. AUXR |= 0x01; //串口1选择定时器2为波特率发生器
  137. AUXR &= 0xFB; //定时器时钟12T模式
  138. T2L = 0xE6; //设置定时初始值
  139. T2H = 0xFF; //设置定时初始值
  140. AUXR |= 0x10; //定时器2开始计时
  141. EA=1;
  142. ES=1;
  143. }
  144. void SendByte(uchar dat) //发送字节
  145. {
  146. SBUF=dat;
  147. while(TI==0); //等待字节发送完毕
  148. TI=0;
  149. }
  150. void SendString(uchar *dat) //发送字符串
  151. {
  152. while(*dat!='\0')
  153. SendByte(*dat++);
  154. }
  155. void UART1() interrupt 4
  156. {
  157. if(RI)
  158. {
  159. Data=SBUF;
  160. if(lock==0) //未锁定状态下执行命令
  161. {
  162. if(Data=='A')
  163. mode=0;
  164. else if(Data=='B')
  165. mode=1;
  166. }
  167. RI=0;
  168. }
  169. }
  170. void Send_uart()
  171. {
  172. if(uart_flag==1)
  173. {
  174. if(mode==0)
  175. sprintf(Uart_Send,"TEMP:%.1f℃\r\n",(float)temp/10.0);
  176. else if(mode==1)
  177. sprintf(Uart_Send,"Voltage:%.2V\r\n",(float)ad_v/100);
  178. SendString(Uart_Send);
  179. uart_flag=0;
  180. }
  181. }
  182. //========================================================
  183. //====================数码管显示函数=======================
  184. void DisplaySMG_Bit(uchar pos,uchar dat)
  185. {
  186. SelectHC573(7);
  187. P0=0xff;
  188. SelectHC573(6);
  189. P0=0x01<<pos-1;
  190. SelectHC573(7);
  191. P0=dat;
  192. SelectHC573(0);
  193. }
  194. void DisplaySMG_All(uchar dat)
  195. {
  196. SelectHC573(6);
  197. P0=0xff;
  198. SelectHC573(7);
  199. P0=dat;
  200. SelectHC573(0);
  201. }
  202. void DisplaySMG()
  203. {
  204. if(mode==0)
  205. {
  206. DisplaySMG_Bit(1,0xc1);
  207. Delay(500);
  208. DisplaySMG_Bit(2,SMG_NoDot[1]);
  209. Delay(500);
  210. DisplaySMG_Bit(6,SMG_NoDot[temp/100]);
  211. Delay(500);
  212. DisplaySMG_Bit(7,SMG_Dot[(temp/10)%10]);
  213. Delay(500);
  214. DisplaySMG_Bit(8,SMG_NoDot[temp%10]);
  215. Delay(500);
  216. DisplaySMG_All(0xff);
  217. }
  218. else if(mode==1)
  219. {
  220. DisplaySMG_Bit(1,0xc1);
  221. Delay(500);
  222. DisplaySMG_Bit(2,SMG_NoDot[2]);
  223. Delay(500);
  224. DisplaySMG_Bit(6,SMG_Dot[ad_v/100]);
  225. Delay(500);
  226. DisplaySMG_Bit(7,SMG_NoDot[(ad_v/10)%10]);
  227. Delay(500);
  228. DisplaySMG_Bit(8,SMG_NoDot[ad_v%10]);
  229. Delay(500);
  230. DisplaySMG_All(0xff);
  231. }
  232. }
  233. //=========================================================
  234. //======================按键扫描函数========================
  235. void Show_down()
  236. {
  237. LedRunning();
  238. DisplaySMG();
  239. Relay_Buzzer();
  240. }
  241. void Delay_Display(uint t)
  242. {
  243. while(t--)
  244. {
  245. LedRunning();
  246. DisplaySMG();
  247. Relay_Buzzer();
  248. }
  249. }
  250. void ScanKeys()
  251. {
  252. C1=0;
  253. C3=1;
  254. R3=R4=1;
  255. if(R4==0) //按下S4
  256. {
  257. Delay(100);
  258. if(R4==0)
  259. {
  260. while(R4==0)
  261. Show_down();
  262. lock=1;
  263. }
  264. }
  265. C1=0;
  266. C3=1;
  267. R3=R4=1;
  268. if(R3==0) //按下S5
  269. {
  270. Delay(100);
  271. if(R3==0)
  272. {
  273. while(R3==0)
  274. Show_down();
  275. if(lock==1)
  276. lock=0;
  277. }
  278. }
  279. C1=1;
  280. C3=0;
  281. R3=R4=1;
  282. if(R4==0) //按下S12
  283. {
  284. Delay(100);
  285. if(R4==0)
  286. {
  287. while(R4==0)
  288. Show_down();
  289. uart_flag=1;
  290. }
  291. }
  292. }
  293. //=========================================================
  294. //=======================LED灯显示函数======================
  295. void LedRunning()
  296. {
  297. SelectHC573(4);
  298. P0=0xff;
  299. if(mode==0)
  300. L1=0;
  301. else
  302. L1=1;
  303. if(mode==1)
  304. L2=0;
  305. else
  306. L2=1;
  307. if(lock==1)
  308. {
  309. TR0=1;
  310. L3=L3_flag;
  311. }
  312. else
  313. {
  314. TR0=0;
  315. L3=1;
  316. }
  317. SelectHC573(0);
  318. }
  319. //=========================================================
  320. //=====================继电器与蜂鸣器======================
  321. void Relay_Buzzer()
  322. {
  323. SelectHC573(5);
  324. if(temp>=280)
  325. relay=1;
  326. else
  327. relay=0;
  328. if(ad_v>360)
  329. buzzer=1;
  330. else
  331. buzzer=0;
  332. SelectHC573(0);
  333. }
  334. //=========================================================
  335. void main()
  336. {
  337. InitSystem();
  338. Timer0Init();
  339. UartInit();
  340. while(1)
  341. {
  342. Read_v();
  343. Read_Temp();
  344. DisplaySMG();
  345. ScanKeys();
  346. Send_uart();
  347. LedRunning();
  348. }
  349. }

        呜呜呜呜孩子紧张啊让孩子好好拿个奖吧呜呜呜呜呜呜呜声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】

推荐阅读
相关标签