找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3641|回复: 8
收起左侧

基于单片机的酒精浓度测试仪的设计

[复制链接]
ID:519003 发表于 2019-6-12 15:02 | 显示全部楼层 |阅读模式
设计的是一种以酒精浓度传感器、AT89C51单片机和A/D转换器为主的,检测驾驶员呼出气体的酒精浓度的,而且还带有声光报警功能的酒精浓度检测仪。这种检测仪不仅可以检测出空气环境中酒精浓度值,还可以由不同的环境来设定不同的阈值,当空气中酒精浓度超过设定的阈值时进行声光报警。系统主要为两部分:硬件设计部分和软件设计部分。硬件设计部分是利用MQ3气敏传感器先测量空气中的酒精浓度,然后转换为电压信号,再通过A/D转换器转换成数字信号后再传给单片机系统,最后由单片机系统和相应外围电路进行信号处理,并由LCD显示酒精浓度值并且对超过的阈值进行报警。软件设计部分的程序采用的是模块化设计思想,各个子程序的功能相对独立,便于调试和修改。电路可分为单片机小系统电路、A/D转换电路、声光报警电路、LCD显示电路,按键电路。
在硬件设计的时候,考虑到传感器可以把酒精浓度这种非电量转换为电量,可以输出0-5V的电压值并且电压值比较稳定,外部干扰较小等特点。所以,可以直接把传感器输出的电压值经过ADC0832采集数据送入单片机内进行处理。酒精浓度检测仪的硬件电路设计主要包括:传感器测量电路、AT89C51单片机系统、A/D转换电路、LCD显示电路、键盘电路、声光报警电路。
单片机源程序如下:
  1. #include<reg51.H>
  2. #include<intrins.h>
  3. #include<stdio.h>
  4. #define uintunsigned int
  5. #define ucharunsigned char
  6. /**********************定义全局变量***************/
  7. //unsigned chardat=0x00 ;  //AD值
  8. unsigned charcount = 0x00;  //定时器计数
  9. unsigned charchannel;   //通道变量
  10. //ADC0832的引脚
  11. sbit ADCS=P1^2;  //ADC0832 chip seclect
  12. sbit ADDI=P1^1;  //ADC0832 k in
  13. sbit ADDO=P1^1;  //ADC0832 k out
  14. sbit ADCLK=P1^0;  //ADC0832 clock signal
  15. unsigned chardispbuf[3];
  16. uint temp;
  17. uint alc;//酒精浓度
  18. uchar dat; //获取ADC转换回来的值
  19. uchar*aa="M=T.TTmg/L";
  20. uchar*cc="alarm";
  21. uchar *dd="";
  22. uint sheding=60;
  23. ucharbb[16]={'A','l','c','o','h','o','l','=',' ','.',' ',' ','m','g','/','L'};   
  24. sbit RS =P2^0;   //定义端口
  25. sbit RW = P2^1;
  26. sbit EN = P2^2;
  27. sbit beep=P3^7;
  28. sbit k1=P1^3;//+键
  29. sbit k2=P1^4;//-键
  30. #define RS_CLRRS=0
  31. #define RS_SETRS=1
  32. #define RW_CLRRW=0
  33. #define RW_SETRW=1
  34. #define EN_CLREN=0
  35. #define EN_SETEN=1
  36. voidDelayUs2x(unsigned char t);
  37. voidDelayMs(unsigned char t);
  38. voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s);
  39. voidLCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data);
  40. void init();
  41. voidwrite_com(unsigned char com);
  42. voidwrite_data(unsigned char date);
  43. voidDelayUs2x(unsigned char t)
  44. {   
  45. while(--t);
  46. }
  47. voidDelayMs(unsigned char t)
  48. {
  49. while(t--)
  50. {
  51. //大致延时1mS
  52. DelayUs2x(245);
  53.        DelayUs2x(245);
  54. }
  55. }
  56. /*********************************lcd1602各子函数**************************************/
  57. voidwrite_com(unsigned char com) //写命令
  58. {
  59.       RS_CLR;
  60.       RW_CLR;
  61.       P0=com;
  62.       DelayMs(5);
  63.       EN_SET;
  64.       DelayMs(5);
  65.       EN_CLR;
  66. }
  67. voidwrite_data(unsigned char date)     //写一个字符
  68. {
  69.       RS_SET;
  70.       RW_CLR;
  71.       P0=date;
  72.       DelayMs(5);
  73.       EN_SET;
  74.       DelayMs(5);
  75.       EN_CLR;
  76. }
  77. void initlcd()                    //初始化
  78. {
  79.       write_com(0x38);
  80.       write_com(0x0c);
  81.       write_com(0x06);
  82.       write_com(0x01);
  83. }
  84. /*------------------------------------------------
  85.   写入字符串函数
  86. ------------------------------------------------*/
  87. void LCD_Write_String(unsigned char x,unsignedchar y,unsigned char *s)
  88. {
  89. if (y == 0)
  90.      {
  91.        write_com(0x80 + x);
  92.      }
  93. else
  94.      {
  95.      write_com(0xC0+ x);
  96.      }
  97. while (*s)
  98.      {
  99. write_data( *s);
  100. s ++;
  101.      }
  102. }
  103. /*------------------------------------------------
  104.   写入字符函数
  105. ------------------------------------------------*/
  106. void LCD_Write_Char(unsigned char x,unsignedchar y,unsigned char Data)
  107. {
  108. if (y == 0)
  109.      {
  110.      write_com(0x80+ x);
  111.      }
  112. else
  113.      {
  114.      write_com(0xC0+ x);
  115.      }
  116. write_data(Data);  
  117. }
  118. /****************************************************************************
  119. 函数功能:AD转换子程序
  120. 入口参数:CH
  121. 出口参数:dat
  122. ****************************************************************************/
  123. //采集并返回
  124. unsigned charAdc0832(unsigned char channel) //AD转换,返回结果
  125. {
  126. uchar i=0;
  127. uchar j;
  128. uchar dat=0;
  129. uchar ndat=0;
  130. if(channel==0)channel=2;
  131. if(channel==1)channel=3;
  132. ADDI=1;
  133. _nop_();
  134. _nop_();
  135. ADCS=0;//拉低CS端
  136. _nop_();
  137. _nop_();
  138. ADCLK=1;//拉高CLK端
  139. _nop_();
  140. _nop_();
  141. ADCLK=0;//拉低CLK端,形成下降沿1
  142. _nop_();
  143. _nop_();
  144. ADCLK=1;//拉高CLK端
  145. ADDI=channel&0x1;
  146. _nop_();
  147. _nop_();
  148. ADCLK=0;//拉低CLK端,形成下降沿2
  149. _nop_();
  150. _nop_();
  151. ADCLK=1;//拉高CLK端
  152. ADDI=(channel>>1)&0x1;
  153. _nop_();
  154. _nop_();
  155. ADCLK=0;//拉低CLK端,形成下降沿3
  156. ADDI=1;//控制命令结束
  157. _nop_();
  158. _nop_();
  159. dat=0;
  160. for(i=0;i<8;i++)
  161. {
  162. dat|=ADDO;//收数据
  163. ADCLK=1;
  164. _nop_();
  165. _nop_();
  166. ADCLK=0;//形成一次时钟脉冲
  167. _nop_();
  168. _nop_();
  169. dat<<=1;
  170. if(i==7)dat|=ADDO;
  171. }  
  172. for(i=0;i<8;i++)
  173. {
  174. j=0;
  175. j=j|ADDO;//收数据
  176. ADCLK=1;
  177. _nop_();
  178. _nop_();
  179. ADCLK=0;//形成一次时钟脉冲
  180. _nop_();
  181. _nop_();
  182. j=j<<7;
  183. ndat=ndat|j;
  184. if(i<7)ndat>>=1;
  185. }
  186. ADCS=1;//拉低CS端
  187. ADCLK=0;//拉低CLK端
  188. ADDO=1;//拉高数据端,回到初始状态
  189. dat<<=8;
  190. dat|=ndat;
  191. return(dat);//returnad k
  192. }
  193. /****************************************************************************
  194. 函数功能:定时器中断延时程序 这一段的作用时隔一段时间抽样一次 否侧显示的最后一位会不稳定
  195. 入口参数:
  196. 出口参数:
  197. ****************************************************************************/
  198. voidtimer0(void) interrupt 1
  199. {
  200.    TMOD = 0x01;
  201.    TH0 = 0x00;
  202.    TL0 = 0x00;
  203.    IE = 0x82;
  204.    TR0 = 01;
  205.    count++;
  206.   if (count == 0x0A)
  207.   {
  208.    count = 0x00;
  209.    dat= Adc0832(channel);
  210.   }
  211. }
  212. /*voidformat_data(uint dat)
  213. {
  214.   uint change_dat=dat;
  215.   uchar ptr[3];
  216. change_dat=(change_dat<<8)+(change_dat<<7)+(change_dat<<6)+(change_dat<<5)+(change_dat<<4)+(change_dat<<2);//乘500
  217.   change_dat=change_dat>>8;//除以256
  218.   ptr[0]=change_dat/100;   //得到个位数字
  219.   ptr[1]=(change_dat-(100*ptr[0]))/10; //得到十分位数字
  220.   ptr[2]=change_dat-(100*ptr[0])-(10*ptr[1]);//得到百分位数字
  221. }*/
  222. void keyscan()
  223. {
  224.                   
  225.    if(!k1)
  226.       {
  227.   DelayMs(5);
  228.               if(!k1)
  229.               {
  230.                     while(!k1);
  231.                     sheding+=5;
  232. LCD_Write_Char(2,1,sheding/100+'0');
  233.                     LCD_Write_Char(4,1,sheding%100/10+'0');
  234.                     LCD_Write_Char(5,1,sheding%10+'0');
  235.               }
  236.        }
  237.    if(!k2)
  238.        {
  239.        DelayMs(5);
  240.               if(!k2)
  241.               {
  242.                     while(!k2);
  243.                     sheding-=5;
  244.                     LCD_Write_Char(2,1,sheding/100+'0');
  245.                     LCD_Write_Char(4,1,sheding%100/10+'0');
  246.                     LCD_Write_Char(5,1,sheding%10+'0');
  247.               }
  248.       }
  249. }
  250. /****************************************
  251. 函数功能:主程序
  252. 入口参数:
  253. 出口参数:
  254. ****************************************/
  255. void main(void)
  256. {
  257.   uchar i;
  258.   P2=0xff;  //端口初始化
  259.   P0=0xff;  
  260.   P3=0xff;
  261.   channel=0x00; //channel=0
  262.   TMOD = 0x01;
  263.   TH0 = 0x00;
  264.   TL0 = 0x00;
  265.   IE = 0x82;
  266.   TR0 = 01;
  267.   initlcd();
  268.   LCD_Write_String(0,0,bb);
  269.   LCD_Write_String(0,1,aa);
  270.   //LCD_Write_String(11,1,cc);
  271.   LCD_Write_Char(2,1,sheding/100+'0');
  272.   LCD_Write_Char(4,1,sheding%100/10+'0');
  273.   LCD_Write_Char(5,1,sheding%10+'0');
  274.   while(1)
  275.   {
  276.    temp=dat*1.0/255*500;  //电压值转换,5V做为参考电压,分成256份。
  277.    
  278.    if(temp<187)
  279.    {
  280.        alc=100*(temp-8)/895;
  281.    }
  282.    else
  283.    {
  284. alc=100*(temp-133)/272;
  285.    }
  286.        dispbuf[0]=alc%10+'0';  //个位
  287.        dispbuf[1]=alc/10%10+'0'; //十位
  288.        dispbuf[2]=alc/100%10+'0'; //百位
  289.       
  290.        //dispbuf[0]=temp%10+'0';   //个位
  291.        //dispbuf[1]=temp/10%10+'0'; //十位
  292.        //dispbuf[2]=temp/100%10+'0'; //百位
  293.       
  294.        LCD_Write_Char(8,0,dispbuf[2]);
  295.        LCD_Write_Char(10,0,dispbuf[1]);
  296.        LCD_Write_Char(11,0,dispbuf[0]);
  297.        keyscan();
  298.        if(alc>sheding)
  299.         {
  300.       //beep=0;
  301.              for(i=0;i<10;i--)
  302.              {
  303.                      beep=0;
  304.                      DelayMs(1);
  305.                      beep=1;
  306.              }
  307.             
  308.       
  309.              LCD_Write_String(11,1,cc);
  310.         }
  311.        else
  312.         {
  313.       LCD_Write_String(11,1,dd);
  314.         }
  315.   }
  316. }
复制代码


原理图

原理图

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:553887 发表于 2019-6-12 22:10 | 显示全部楼层
MAIN.C(16): error C129: missing ';' before 'temp'
回复

使用道具 举报

ID:553887 发表于 2019-6-12 22:11 | 显示全部楼层
怎么改呢
回复

使用道具 举报

ID:519003 发表于 2019-6-18 15:14 | 显示全部楼层

第15行的unsigned chardispbuf[3];改为unsigned char dispbuf[3];//char后打一个空格就行了
回复

使用道具 举报

ID:519003 发表于 2019-6-18 15:17 | 显示全部楼层

错误较多,我发源码给你
#include<reg51.h>
#include"delay.h"
#include"lcd602.h"
#include"ds18b20.h"
//**************端口定义*******************
sbit LED = P1^0;
sbit k1 = P1^4;
sbit k2 = P1^5;
sbit k3 = P1^6;
//**************数组定义*******************
uchar code tab2[]={"Temp:     "}; //5
uchar code tab3[]={" H     "}; //3
uchar code tab4[]={"L     "}; //8
//**************变量定义*******************
int temp1 = 400;   //上限
int temp3 = 100;         //下限
bit flag = 0;         //上下限选择标志
int temp4; //当上限减到负数时
uchar temp5 = 0;
/*******************按键********************/
void key()
{
     if(flag == 0) //上限
         {
                 write_zifu(2,0,'*');
                 write_zifu(2,8,' ');
             if(k1 == 0)
                 {
                    delayxms(5);
                        while(k1 == 0);
                        temp1 += 10;
                 }
       
                 if(k2 == 0)
                 {
                    delayxms(5);
                        while(k2 == 0);
                        temp1 -= 10;
                 }
         }

         if(flag == 1)        //下限
         {
                 write_zifu(2,0,' ');
                 write_zifu(2,8,'*');
             if(k1 == 0)
                 {
                    delayxms(5);
                        while(k1 == 0);
                        temp3 += 10;
                 }
       
                 if(k2 == 0)
                 {
                    delayxms(5);
                        while(k2 == 0);
                        temp3 -= 10;
                 }
         }
         

         if(k3 == 0) //上下限选择标志
         {
            delayxms(5);
                while(k3 == 0);
                flag = ~flag;
         }
}
/*******************定时器T1初始化********************/
void T1_init()
{
          TMOD = TMOD | 0x10;            //设T1为方式1
          TH1 = (65535-20000)/256;       //计数20000个
          TL1 = (65535-20000)%256;
          EA = 1;                        //开启总中断         
          ET1 = 1;                       //允许T1中断
          TR1 = 1;                       //启动
}
/*******************主函数********************/
void main()
{       
            chushihua();//lcd1602初始化
          write_string(1,0,tab2);
          write_string(2,0,tab3);
          write_string(2,9,tab4);
          T1_init();
          while(1)
          {
                          key();
                          ds1820disp();
                          /*温度上限*/
                      if(temp1 < 0)
                          {
                                   write_zifu(2,2,'-');
                                   temp4 = temp1;
                                   temp4 = ~temp4;
                                   temp4 += 1;
                                     write_num3(2,3,temp4);
                                   write_zifu(2,7,' ');
                          }
                          else
                          {
                                     write_zifu(2,2,'+');
                                   if(temp1>=1000)
                                   {
                                              write_num4(2,3,temp1);
                                   }
                                   else
                                   {
                                              write_num3(2,3,temp1);
                                   }
                          }

                          /*温度下限*/
                      if(temp3 < 0)
                          {
                                   write_zifu(2,10,'-');
                                     write_num3(2,11,-(temp3));
                                   write_zifu(2,15,' ');
                          }
                          else
                          {
                                     write_zifu(2,10,'+');
                                   if(temp3>=1000)
                                   {write_num4(2,11,temp3);}
                                   else
                                   {write_num3(2,11,temp3);}
                          }

                          /*报警*/
                          if(flag_temp == 1) //温度小于零
                          {
                              if((-t)>temp1 || (-t)<temp3) {LED = 0;}
                              else {LED = 1;}
                          }
                          else //温度大于零
                          {
                              if(t>temp1 || t<temp3) {LED = 0;}
                              else {LED = 1;}
                          }
          }           
}
/**************************定时器T1中断服务函数************************************/
void T1_time() interrupt 3   
{
      TH1 = (65535-20000)/256;       //计数20000个
          TL1 = (65535-20000)%256;
          temp5 += 1;
          if(temp5 >= 25)
          {
             temp5 = 0;
                 TR1 = 0;
                 ReadTemperature();
                 TR1 = 1;
          }
}
回复

使用道具 举报

ID:519003 发表于 2019-6-18 15:18 | 显示全部楼层

是这个,这个是正确的
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
/**********************定义全局变量***************/
//unsigned char dat=0x00 ;  //AD值
unsigned char count = 0x00;  //定时器计数
unsigned char channel;   //通道变量
//ADC0832的引脚
sbit ADCS =P1^2;  //ADC0832 chip seclect
sbit ADDI =P1^1;  //ADC0832 k in
sbit ADDO =P1^1;  //ADC0832 k out
sbit ADCLK =P1^0;  //ADC0832 clock signal
unsigned char dispbuf[3];
uint temp;
uint alc;//酒精浓度
uchar dat; //获取ADC转换回来的值
uchar *aa="M=T.TTmg/L";
uchar *cc="alarm";
uchar *dd=" ";
uint sheding=60;
uchar bb[16]={'A','l','c','o','h','o','l','=',' ','.',' ',' ','m','g','/','L'};       
sbit RS = P2^0;   //定义端口
sbit RW = P2^1;
sbit EN = P2^2;
sbit beep=P3^7;
sbit k1=P1^3;//+键
sbit k2=P1^4;//-键
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
void DelayUs2x(unsigned char t);
void DelayMs(unsigned char t);
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s);
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data);
void init();
void write_com(unsigned char com);
void write_data(unsigned char date);
void DelayUs2x(unsigned char t)
{   
while(--t);
}
void DelayMs(unsigned char t)
{

while(t--)
{
//大致延时1mS
DelayUs2x(245);
         DelayUs2x(245);
}
}
/*********************************lcd1602各子函数**************************************/
void write_com(unsigned char com) //写命令
{
        RS_CLR;
        RW_CLR;
        P0=com;
        DelayMs(5);
        EN_SET;
        DelayMs(5);
        EN_CLR;
}
void write_data(unsigned char date)         //写一个字符
{
        RS_SET;
        RW_CLR;
        P0=date;
        DelayMs(5);
        EN_SET;
        DelayMs(5);
        EN_CLR;
}
void initlcd()                        //初始化
{
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}
/*------------------------------------------------
  写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
        {
         write_com(0x80 + x);
        }
else
        {
        write_com(0xC0 + x);
        }
while (*s)
        {
write_data( *s);
s ++;
        }
}
/*------------------------------------------------
  写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
        {
        write_com(0x80 + x);
        }
else
        {
        write_com(0xC0 + x);
        }
write_data(Data);  
}
/****************************************************************************
函数功能:AD转换子程序
入口参数:CH
出口参数:dat
****************************************************************************/
//采集并返回
unsigned char Adc0832(unsigned char channel) //AD转换,返回结果
{
uchar i=0;
uchar j;
uchar dat=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}  
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat);//return ad k
}
/****************************************************************************
函数功能:定时器中断延时程序 这一段的作用时隔一段时间抽样一次 否侧显示的最后一位会不稳定
入口参数:
出口参数:
****************************************************************************/
void timer0(void) interrupt 1
{
   TMOD = 0x01;
   TH0 = 0x00;
   TL0 = 0x00;
   IE = 0x82;
   TR0 = 01;
   count++;
  if (count == 0x0A)
  {
   count = 0x00;
   dat= Adc0832(channel);
  }
}
/*void format_data(uint dat)
{
  uint change_dat=dat;
  uchar ptr[3];
  change_dat=(change_dat<<8)+(change_dat<<7)+(change_dat<<6)+(change_dat<<5)+(change_dat<<4)+(change_dat<<2);//乘500
  change_dat=change_dat>>8;//除以256
  ptr[0]=change_dat/100;   //得到个位数字
  ptr[1]=(change_dat-(100*ptr[0]))/10; //得到十分位数字
  ptr[2]=change_dat-(100*ptr[0])-(10*ptr[1]); //得到百分位数字
}*/
void keyscan()
{
                     
   if(!k1)
        {
  DelayMs(5);
                 if(!k1)
                  {
                        while(!k1);
                        sheding+=5;
LCD_Write_Char(2,1,sheding/100+'0');
                        LCD_Write_Char(4,1,sheding%100/10+'0');
                        LCD_Write_Char(5,1,sheding%10+'0');
                  }
         }
   if(!k2)
         {
          DelayMs(5);
                 if(!k2)
                  {
                        while(!k2);
                        sheding-=5;
                        LCD_Write_Char(2,1,sheding/100+'0');
                        LCD_Write_Char(4,1,sheding%100/10+'0');
                        LCD_Write_Char(5,1,sheding%10+'0');
                  }
        }

}
/****************************************
函数功能:主程序
入口参数:
出口参数:

****************************************/
void main(void)
{
  uchar i;
  P2=0xff;   //端口初始化
  P0=0xff;   
  P3=0xff;  
  channel=0x00;  //channel=0
  TMOD = 0x01;
  TH0 = 0x00;
  TL0 = 0x00;
  IE = 0x82;
  TR0 = 01;
  initlcd();
  LCD_Write_String(0,0,bb);
  LCD_Write_String(0,1,aa);
  //LCD_Write_String(11,1,cc);
  LCD_Write_Char(2,1,sheding/100+'0');
  LCD_Write_Char(4,1,sheding%100/10+'0');
  LCD_Write_Char(5,1,sheding%10+'0');
  while(1)
  {
   temp=dat*1.0/255*500;  //电压值转换,5V做为参考电压,分成256份。
   
   if(temp<187)
   {

         alc=100*(temp-8)/895;
   }
   else
   {
alc=100*(temp-133)/272;
   }
          dispbuf[0]=alc%10+'0';         //个位
          dispbuf[1]=alc/10%10+'0'; //十位
          dispbuf[2]=alc/100%10+'0'; //百位
       
          //dispbuf[0]=temp%10+'0';         //个位
          //dispbuf[1]=temp/10%10+'0'; //十位
          //dispbuf[2]=temp/100%10+'0'; //百位
       
          LCD_Write_Char(8,0,dispbuf[2]);
          LCD_Write_Char(10,0,dispbuf[1]);
          LCD_Write_Char(11,0,dispbuf[0]);
          keyscan();
          if(alc>sheding)
          {
        //beep=0;
                for(i=0;i<10;i--)
                {
                         beep=0;
                         DelayMs(1);
                         beep=1;
                }
               
       
                LCD_Write_String(11,1,cc);
          }
          else
          {
        LCD_Write_String(11,1,dd);
          }
  }
}

回复

使用道具 举报

ID:553887 发表于 2019-6-20 22:14 | 显示全部楼层
gagalonghun 发表于 2019-6-18 15:18
是这个,这个是正确的
#include  
#include

楼主负责又细心
回复

使用道具 举报

ID:659880 发表于 2020-6-15 10:22 来自手机 | 显示全部楼层
这个原理图不清晰呀,还有beep的端口是干啥用的呀
回复

使用道具 举报

ID:782510 发表于 2020-12-8 23:43 | 显示全部楼层
有仿真图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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