找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 975|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机的智能压力检测系统的设计

[复制链接]
跳转到指定楼层
楼主
ID:721673 发表于 2020-4-3 14:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#include<stdio.h>
#include<math.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define ADC0832CH0 channel;
//*********定义变量区*******************
sbit clk_adc0832=P3^6;                                          //定义各个控制引脚
sbit cs_adc0832=P2^0;
sbit di_adc0832=P3^7;
sbit do_adc0832=P3^7;
sbit LED0_CS=P1^0;
sbit LED1_CS=P1^1;
sbit LED2_CS=P1^2;
sbit LED3_CS=P1^3;
sbit  adarm=P2^2;
uchar code table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};//0,1,2,3,4,5,6,7,8,9,off  //共阳极笔端码
uchar ch;   //采样返回数据
//*********函数声明区********************
void tkey(void);            //键盘函数
unsigned runADC0832(bit);    //A/D转换
void Delayms(uint x);    //延时显示函数
void Update_LED();           //LED显示函数
void LED_analyze();
//**********主函数开始**********
void main()
{
P0=0XFF;
P1=0XFF;
P2=0XFF;
P3=0XFF;
Uart_Init();
TH0=0x3C;
TL0=0xAF;
ET0=1;   //开外部中断0
EA=1;    //全局中断打开
TR0=1;
nCounter=0;
Change_Flag=0;
while(1)
{
void tkey(void);
runADC0832();
if(Change_Flag==1)
  { Update_LED();
  if(ch>9999)
  ch=0;
  printf("counter refreshed %d \n",ch);
  }
delay();
/********矩键查寻键值4*4程序******/按键为P1.0---P1.7
void Tkey(void)
{
  uchar readkey;//rereadkey;
  uchar x_temp,y_temp;
  P1=0x0f;
  x_temp=P1&0x0f;
  if(x_temp==0x0f) goto keyout;
  P1=0xf0;
  y_temp=P1&0xf0;
  readkey=x_temp|y_temp;
  readkey=~readkey;
switch(readkey)
{
case 0x11:key=0; break;
case 0x21:key=1; break;
  case 0x41:key=2; break;
  case 0x81:key=3; break;
  case 0x12:key=4; break;
  case 0x22:key=5; break;
  case 0x42:key=6; break;
  case 0x82:key=7; break;
  case 0x14:key=8; break;
  case 0x24:key=9; break;
  case 0x44:key=10;break;
  case 0x84:key=11;break;
  case 0x18:key=12;break;
  case 0x28:key=13;break;
  case 0x48:key=14;break;
  case 0x88:key=15;break;
  default:  key=16;break;
    }
keyout:_nop_();
}//**********A/D转换子程序开始***************
unsigned runADC0832(void)  //读ADC0832函数
{            
uchar i=0;
    uchar j;
    uint 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 control(uchar d)  //数据个、十、百、千取数函数
ch=ch%10000;
AD_bcd[0] =ch/1000;
  AD_bcd[1]=(ch/100)%10;
AD_bcd[2] =(ch%100)/10;
  AD_bcd[3]=(ch%100)%10;
  update_disbuf();
}
void update_disbuf(void)    //对应显示的数据函数
{ P0=dis_code[AD_bcd[0]];
  LED_0=0;
  Delayms(10);
  LED_0=1;
  P0=dis_code[AD_bcd[1]];
  LED_1=0;
  Delayms(10);
  LED_1=1;
  P0=dis_code[AD_bcd[2]];
  LED_2=0;
  Delayms(10);
  LED_2=1;
  P0=dis_code[AD_bcd[3]];
  LED_3=0;
  Delayms(10);
  LED_3=1;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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