防酒驾控制系统服务器,防酒驾控制器的设计完美版

该博客介绍了如何使用单片机进行ADC0832模数转换器的驱动,以实现酒精检测仪的酒精浓度读取和显示。通过按键操作设置酒精等级,并将数据保存在内部EEPROM中。同时,文中还涉及了定时器初始化、按键处理、报警功能及开机自检等关键功能的实现。
摘要由CSDN通过智能技术生成

#include           //调用单片机头文件

#define uchar unsigned char   //无符号字符型宏定义 变量范围0~255

#define uint  unsigned int    //无符号整型宏定义 变量范围0~65535

sbit CS=P2^4;   //CS定义为P2口的第4位脚 连接ADC0832CS脚

sbit SCL=P2^3;  //SCL定义为P2口的第3位脚连接ADC0832SCL脚

sbit DO=P2^2;   //DO定义为P2口的第4位脚 连接ADC0832DO脚

sbit beep = P3^2;   //蜂鸣器IO口定义

long dengji,s_dengji = 50;     //酒精等级

bit flag_300ms ;

uchar key_can;        //按键值的变量

uchar menu_1;        //菜单设计的变量

uchar key_can;  //按键值

uchar flag_clock;

#include

#include "eeprom52.h"

#include "lcd1602.h"

/***********************1ms延时函数*****************************/

void delay_1ms(uint q)

{

uint i,j;

for(i=0;i

for(j=0;j<120;j++);

}

/******************把数据保存到单片机内部eeprom中******************/

void write_eeprom()

{

SectorErase(0x2000);

// byte_write(0x2000, s_dengji);

byte_write(0x2001, s_dengji);

byte_write(0x2060, a_a);

}

/******************把数据从单片机内部eeprom中读出来*****************/

void read_eeprom()

{

// s_dengji   = byte_read(0x2000);

s_dengji = byte_read(0x2001);

a_a      = byte_read(0x2060);

}

/**************开机自检eeprom初始化*****************/

void init_eeprom()

{

read_eeprom();  //先读

if(a_a != 2)  //新的单片机初始单片机内问eeprom

{

s_dengji = 80;

a_a = 2;

write_eeprom();

}

}

/***********读数模转换数据*************************/

//请先了解ADC0832模数转换的串行协议

//  1  0  0 通道

//  1  1  1 通道

unsigned char ad0832read(bit SGL,bit ODD)

{

unsigned char i=0,value=0,value1=0;

SCL=0;

DO=1;

CS=0;  //开始

SCL=1;  //第一个上升沿

SCL=0;

DO=SGL;

SCL=1;   //第二个上升沿

SCL=0;

DO=ODD;

SCL=1;     //第三个上升沿

SCL=0;     //第三个下降沿

DO=1;

for(i=0;i<8;i++)

{

SCL=1;

SCL=0; //开始从第四个下降沿接收数据

value<<=1;

if(DO)

value++;

}

for(i=0;i<8;i++)

{   //接收校验数据

value1>>=1;

if(DO)

value1+=0x80;

SCL=1;

SCL=0;

}

CS=1;

SCL=1;

if(value==value1)    //与校验数据比较正确就返回数据否则返回0

return value;

return 0;

}

/*************定时器0初始化程序***************/

void time_init()

{

EA   = 1;    //开总中断

TMOD = 0X01;   //定时器0、定时器1工作方式1

ET0  = 1;    //开定时器0中断

TR0  = 1;    //允许定时器0定时

}

/****************按键处理显示函数***************/

void key_with()

{

if(key_can == 1)

{

s_dengji ++ ;      //酒精浓度设置数加1

if(s_dengji > 999)

s_dengji = 999;

}

if(key_can == 2)

{

s_dengji -= 1; //酒精浓度设置数减1

if(s_dengji <= 1)

s_dengji = 1 ;

}

write_sfm2(2,9,s_dengji);     //显示酒精等级

write_eeprom();       //保存数据

}

/********************独立按键程序*****************/

void key()  //独立按键程序

{

static uchar key_new;

key_can = 20;                   //按键值还原

P1 |= 0x0f;

if((P1 & 0x0f) != 0x0f)  //按键按下

{

delay_1ms(1);  //按键消抖动

if(((P1 & 0x0f) != 0x0f) && (key_new == 1))

{      //确认是按键按下

key_new = 0;

switch(P1 & 0x0f)

{

case 0x0b: key_can = 2; break;    //得到k3键值

case 0x07: key_can = 1; break;    //得到k4键值

}

}

}

else

key_new = 1;

}

/****************报警函数***************/

void clock_h_l()

{

static uchar value;

if(dengji >= s_dengji )  //报警

{

value ++;

if(value >= 2)

{

value = 10;

beep = ~beep;   //蜂鸣器报警

}

}else

{

if(dengji < s_dengji)   //取消报警

{

value = 0;

beep = 1;

}

}

}

/***************主函数*****************/

void main()

{

beep = 0;                  //开机叫一声

delay_1ms(150);

P0 = P1 = P2 = P3 = 0xff;  //单片机IO口初始化为1

init_eeprom();             //读eeprom数据

time_init();               //初始化定时器

init_1602();

while(1)

{

key();     //独立按键程序

if(key_can < 10)

{

key_with();   //按键按下要执行的程序

}

if(flag_300ms == 1)

{

flag_300ms = 0;

clock_h_l();    //报警函数

dengji = ad0832read(1,0);

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值