找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1609|回复: 1
收起左侧

AD转换器得到的数据随着变阻器阻值的变化,在某个范围内报警

[复制链接]
ID:761269 发表于 2020-6-6 15:58 | 显示全部楼层 |阅读模式
求助,怎么写这个的主函数代码,让这里的AD转换器得到的数据随着变阻器阻值的变化,在某个范围内报警(亮灯并且发出警报)
ad转换器的转换代码已经成功
#include <reg52.h>             //头文件
#define uchar unsigned char           //宏定义无符号字符型
#define uint  unsigned  int           //宏定义无符号整型


sbit CS_0832 = P1^0;
sbit CLK_0832 = P1^1;
sbit DO_0832 = P1^2;        // DI、DO不同时有效,可共用一个接口
sbit DI_0832 = P1^2;

/******************************************************************
延时函数
******************************************************************/
void delayms(unsigned int xms)
{
        unsigned int x;
        unsigned char y;
        for(x = xms; x > 0; x--)
                for(y = 114; y>0; y--);//11.0592MHz: 114  //12MHz: 124
}


extern void _nop_ ( void );
#define pulse0832() _nop_();_nop_();CLK_0832=1;_nop_();_nop_();CLK_0832=0

//把模拟电压值转换成8位二进制数并返回
unsigned char read0832()
{
        unsigned char i, ch = 0, ch1 = 0;
        CS_0832=0;                // 片选,DO为高阻态
       
        DI_0832=1;
        // 此处暂停T-SetUp: 250ns (由pulse0832完成)
        pulse0832();        // 第一个脉冲,起始位,DI置高
       
        DI_0832=1;
        pulse0832();        // 第二个脉冲,DI=1表示双通道单极性输入
       
        DI_0832=1;
        pulse0832();        // 第三个脉冲,DI=1表示选择通道1(CH2)
       
        // 51单片机为准双向IO口:应先写入1再读取
        DI_0832=1;
       
        // MSB FIRST DATA
        for(i = 0; i < 8; ++i) {
                pulse0832();
                ch <<= 1;
                if(DO_0832==1)
                        ch |= 0x01;
        }
       
        // MSB FIRST输出的最后一位与LSB FIRST输出的第一位是在
        // 同一个时钟下降沿之后,故此处先执行读取,后执行pulse
        // LSB FIRST DATA
        for(i = 0; i < 8; ++i) {
                ch1 >>= 1;
                if(DO_0832==1)
                        ch1 |= 0x80;
                pulse0832();
        }
       
        CS_0832=1;                // 取消片选,一个转换周期结束
        return (ch==ch1) ? ch : 0;                // 返回转换结果
}


/*************************************************************************
                                CLK振荡信号       
**************************************************************************/
void timer0( ) interrupt 1 //定时器0工作方式1
{

TH0=(65536-2)/256;          //重装计数初值
TL0=(65536-2)%256;          //重装计数初值
}


/*************************************************************************
                                主函数       
**************************************************************************/
void main()
{
TMOD=0X01;                          //定时器中断0

TH0=(65536-2)/256;          //定时时间高八位初值
TL0=(65536-2)%256;          //定时时间低八位初值
EA=1;                                  //开CPU中断
ET0=1;                                  //开T/C0中断
TR0=1;

51hei图片20200606155229.png
回复

使用道具 举报

ID:767423 发表于 2020-6-6 22:05 | 显示全部楼层
变量read_data,xx,nn
while(1)
{
   read_data=read0832();
   if(read_data>xx&read_data<nn)
   {
       灯亮
       报警;
     }
    else
   {
       关灯;
       关报警;
    }
}
这是简单的,实际读出的数据要滤波,比如N点求平均。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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