积分赛——获取情况温度

[复制链接]
发表于 2025-10-1 20:35:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
筹划要求

从DS18B20温度传感器上获取情况温度,并将其温度值表现到数码管上(保存两位小数)。
当“S4”界说为发送按键,按键S4按下时,串口向PC端发送当前收罗的温度值;
串口发送格式:
                         Temp:26.26C
数码管表现格式如下图所示:
         

         固定利用5位数码管表现数据,数码管最低位表现固定字符‘C’
备注:

单片机IRC振荡器频率设置为12MHz。
按键模式:BTN;扩展模式:IO模式。
温度值保存小数点后两位有用数字。
代码

sys.h
  1. #ifndef __SYS_H__
  2. #define __SYS_H__
  3. #include <STC15F2K60S2.H>
  4. extern unsigned char Seg_Buff[8];
  5. extern bit flag_send;
  6. extern float temper;
  7. //onewire.c
  8. float getT();
  9. //sys.c
  10. void init74hc138(unsigned char n);
  11. void init();
  12. void Seg_Loop();
  13. void Key_Loop();
  14. void seg_temper();
  15. #endif
复制代码
main.c
  1. #include "sys.h"
  2. bit flag_seg=0;
  3. bit flag_key=0;
  4. bit flag_temper=0;
  5. unsigned char *str="Temp:";
  6. void Timer0_Init(void)                //100微秒@12.000MHz
  7. {
  8.         AUXR |= 0x80;                        //定时器时钟1T模式
  9.         TMOD &= 0xF0;                        //设置定时器模式
  10.         TL0 = 0x50;                                //设置定时初始值
  11.         TH0 = 0xFB;                                //设置定时初始值
  12.         TF0 = 0;                                //清除TF0标志
  13.         TR0 = 1;                                //定时器0开始计时
  14.         ET0 = 1;                                //使能定时器0中断
  15.         EA = 1;
  16. }
  17. void UartInit(void)                //[email protected]
  18. {
  19.         SCON = 0x50;                //8位数据,可变波特率
  20.         AUXR |= 0x40;                //定时器时钟1T模式
  21.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  22.         TMOD &= 0x0F;                //设置定时器模式
  23.         TL1 = 0xC7;                        //设置定时初始值
  24.         TH1 = 0xFE;                        //设置定时初始值
  25.         ET1 = 0;                        //禁止定时器中断
  26.         TR1 = 1;                        //定时器1开始计时
  27.         ES = 1;
  28.         EA = 1;
  29. }
  30. void uart_send_date(unsigned char date){
  31.         SBUF=date;
  32.         while(TI==0);
  33.         TI=0;
  34. }
  35. void uart_send_str(unsigned char *str){
  36.         while(*str!='\0'){
  37.                 uart_send_date(*str);
  38.                 str++;
  39.         }
  40. }
  41. void uart_send(){
  42.         uart_send_str(str);
  43.         if(Seg_Buff[3]!=11)
  44.                 uart_send_date(Seg_Buff[3]+'0');
  45.         uart_send_date(Seg_Buff[4]+'0');
  46.         uart_send_date('.');
  47.         uart_send_date(Seg_Buff[5]+'0');
  48.         uart_send_date(Seg_Buff[6]+'0');
  49.         uart_send_date('C');
  50.         uart_send_str("\r\n");
  51. }
  52. void main(){
  53.         init();
  54.         Timer0_Init();
  55.         while((int)getT()==85);
  56.         UartInit();
  57.         while(1){
  58.                 if(flag_seg){
  59.                         flag_seg=0;
  60.                         Seg_Loop();
  61.                 }
  62.                 if(flag_key){
  63.                         flag_key=0;
  64.                         Key_Loop();
  65.                         if(flag_send){
  66.                                 flag_send=0;
  67.                                 uart_send();
  68.                         }
  69.                 }
  70.                 if(flag_temper){
  71.                         flag_temper=0;
  72.                         temper=getT();
  73.                         seg_temper();
  74.                 }
  75.         }
  76. }
  77. void uart() interrupt 4
  78. {
  79.         if(RI){
  80.                 RI=0;
  81.         }
  82. }
  83. void Timer0_Isr(void) interrupt 1
  84. {
  85.         static unsigned char count1=0,count2=0;
  86.         static unsigned int count3=0;
  87.         count1++;count2++;count3++;
  88.         if(count1==2){
  89.                 count1=0;
  90.                 flag_seg=1;
  91.         }
  92.         if(count2==50){
  93.                 count2=0;
  94.                 flag_key=1;
  95.         }
  96.         if(count3==1000){
  97.                 count3=0;
  98.                 flag_temper=1;
  99.         }
  100. }
复制代码
sys.c
  1. #include "sys.h"
  2. code unsigned char Seg_Table[] =
  3. {
  4. 0xc0, //0
  5. 0xf9, //1
  6. 0xa4, //2
  7. 0xb0, //3
  8. 0x99, //4
  9. 0x92, //5
  10. 0x82, //6
  11. 0xf8, //7
  12. 0x80, //8
  13. 0x90, //9
  14. 0xc6, //C 10
  15. 0xff  //熄灭 11
  16. };
  17. unsigned char Seg_Buff[8]={11,11,11,11,11,11,11,11};
  18. unsigned char keyval,keyold,keyup,keydown;
  19. bit flag_send=0;
  20. float temper=0;
  21. void init74hc138(unsigned char n){
  22.         P2=(P2&0x1f)|(n<<5);
  23.         P2&=0x1f;
  24. }
  25. void init(){
  26.         P0=0x00;
  27.         init74hc138(5);
  28.         P0=0xff;
  29.         init74hc138(4);
  30. }
  31. void seg(unsigned char addr,num){
  32.         P0=0xff;
  33.         init74hc138(7);
  34.         P0=0x01<<addr;
  35.         init74hc138(6);
  36.         P0=Seg_Table[num];
  37.         if(addr==4)P0&=0x7f;
  38.         init74hc138(7);
  39. }
  40. void Seg_Loop(){
  41.         static unsigned char i=0;
  42.         seg(i,Seg_Buff[i]);
  43.         i++;
  44.         if(i==8)i=0;
  45. }
  46. void Key_Loop(){
  47.         keyval=0;
  48.         if(P33==0)keyval=1;
  49.         keydown=keyval&(keyold^keyval);
  50.         keyup=~keyval&(keyold^keyval);
  51.         if(keyval&&!keyold)flag_send=1;
  52.         keyold=keyval;
  53. }
  54. void seg_temper(){
  55.         Seg_Buff[0]=11;
  56.         Seg_Buff[1]=11;
  57.         Seg_Buff[2]=11;
  58.         if((int)(temper*100)>=1000)
  59.                 Seg_Buff[3]=(int)temper/10;
  60.         else
  61.                 Seg_Buff[3]=11;
  62.         Seg_Buff[4]=(int)(temper*100+0.5)/100%10;
  63.         Seg_Buff[5]=(int)(temper*100+0.5)/10%10;
  64.         Seg_Buff[6]=(int)(temper*100+0.5)%10;
  65.         Seg_Buff[7]=10;
  66. }
复制代码
onewire.c
  1. #include "sys.h"
  2. sbit DQ=P1^4;
  3. void Delay_OneWire(unsigned int t)  
  4. {
  5.         unsigned char i;
  6.         while(t--){
  7.                 for(i=0;i<12;i++);
  8.         }
  9. }
  10. void Write_DS18B20(unsigned char dat)
  11. {
  12.         unsigned char i;
  13.         for(i=0;i<8;i++)
  14.         {
  15.                 DQ = 0;
  16.                 DQ = dat&0x01;
  17.                 Delay_OneWire(5);
  18.                 DQ = 1;
  19.                 dat >>= 1;
  20.         }
  21.         Delay_OneWire(5);
  22. }
  23. unsigned char Read_DS18B20(void)
  24. {
  25.         unsigned char i;
  26.         unsigned char dat;
  27.   
  28.         for(i=0;i<8;i++)
  29.         {
  30.                 DQ = 0;
  31.                 dat >>= 1;
  32.                 DQ = 1;
  33.                 if(DQ)
  34.                 {
  35.                         dat |= 0x80;
  36.                 }            
  37.                 Delay_OneWire(5);
  38.         }
  39.         return dat;
  40. }
  41. bit init_ds18b20(void)
  42. {
  43.           bit initflag = 0;
  44.           DQ = 1;
  45.           Delay_OneWire(12);
  46.           DQ = 0;
  47.           Delay_OneWire(80);
  48.           DQ = 1;
  49.           Delay_OneWire(10);
  50.     initflag = DQ;     
  51.           Delay_OneWire(5);
  52.           return initflag;
  53. }
  54. float getT(){
  55.         unsigned char tl,th;
  56.         float temp;
  57.         init_ds18b20();
  58.         Write_DS18B20(0xcc);
  59.         Write_DS18B20(0x44);
  60.         init_ds18b20();
  61.         Write_DS18B20(0xcc);
  62.         Write_DS18B20(0xbe);
  63.         tl=Read_DS18B20();
  64.         th=Read_DS18B20();
  65.         temp=(th<<8|tl)*0.0625;
  66.         return temp;
  67. }
复制代码
测评效果


回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表