找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求电容电阻参数单片机的设计的程序,程序有很多错误不知道怎么改

[复制链接]
跳转到指定楼层
楼主
ID:102839 发表于 2016-1-11 22:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是已经打好的,但是有很多错误完全运行不了,求改正。
#include <reg52.h>
#include <intrins.h>
#define DATA P0
#define uchar unsigned char
#define uint unsigned int

sbit adcs=P2^3;//可以硬件直接接地
sbit adrd=P2^5;
sbit adwr=P2^4;
sbit RW=P2^1;//1602写数据
sbit RS=P2^0;//1602写地址
sbit EN=P2^2;//1602工作使能
sbit b_test=P3^7;//开始测试电容的按键输入
sbit c_test=P3^6;
sbit _reset=P3^5;  //555时基芯片工作控制信
uint T_flag,N,D,C,i,Dis1,Dis0;
uchar get_ad();
uint A,F,H,A1,A2;
uint r[]={'R','=','0','0','.','0','K',0Xf4};
uint b[9]={'C','=','0','0','.','0','0','u','F'};//显示C=00.00UF
uint Data1;
/***********延时

1MS*************************/
void Delay1ms(uint mm)
{uint i;
for(;mm>0;mm--)
for(i=0;i<100;i++);
}

void delay(uint z)//延时程序
{
  uint x,y;
  for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}
/******************检查忙否**********************/
void Checkstates()
{
uchar dat;
RS=0;
RW=1;
do{EN=1;//下降沿
    _nop_();//保持一定间隔
    _nop_();
    dat=DATA;
    _nop_();
    _nop_();
    EN=0;
}while((dat&0x80)==1);
}
/************LCD写命令函数**********/
void wcomd(uchar cmd)
{
Checkstates();
RS=0;
RW=0;
DATA=cmd;
EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
EN=0;
}
/***********LCD写数据函数**********/
void wdata(uchar dat)
{
Checkstates();
RS=1;
RW=0;
DATA=dat;
EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
EN=0;
}
/************初始化**************/
void LCDINIT()
{
Delay1ms(15);
wcomd(0x38);//功能设置
Delay1ms(5);
wcomd(0x38);//功能设置
Delay1ms(5);
wcomd(0x01);//清屏
Delay1ms(5);
wcomd(0x08);//关显示
Delay1ms(5);
wcomd(0x0c);//开显示;不开光标
}
/********显示函数**********/
void Display(void)//显示函数
{
   uchar i,j;
  uchar
a[12]={0X4D,0X45,0X41,0X53,0X55,0X52,0X45,0X4D,0X45,0X4E,0X54,0X53};//显示measurements
  for(i=0;i<12;i++)//写显示第一行
  { wcomd(0x80+i);
    Delay1ms(1);
    wdata(a[i]);
    Delay1ms(1);
  }
  for(j=0;j<9;j++)//写显示第二行
  {
  wcomd(0xc0+j);
  Delay1ms(1);
  wdata(b[j]);
  Delay1ms(1);
  }
Delay1ms(150);

}
void Display1()//显示函数 显示电阻
{
  uchar i,j;
  uchar
  a[12]={0X4D,0X45,0X41,0X53,0X55,0X52,0X45,0X4D,0X45,0X4E,0X54,0X53};//显示measurements
  for(i=0;i<12;i++)//写显示第一行
  { wcomd(0x80+i);
    Delay1ms(1);
    wdata(a[i]);
    Delay1ms(1);
  }
   for(j=0;j<9;j++)//写显示第二行
  {
   wcomd(0xc0+j);
   Delay1ms(1);
   wdata(r[j]);
   Delay1ms(1);
  }
  Delay1ms(1000);
  }
uchar get_ad()//adc0804操作
{
  uchar temp;
  adcs=1;
  adwr=1;
  _nop_();
  delay(1);
  adcs=0;
  adwr=0;
  _nop_();
  delay(1);
  adwr=1;
  adcs=1;
  delay(1);
  P1=0xff;
  adcs=1;
  adrd=1;
  delay(1);
  _nop_();
  _nop_();
  _nop_();
  delay(20);
  adcs=0;
  adrd=0;
  _nop_();
  temp=P1;
  delay(1);
  adrd=1;
  adcs=1;
  return temp;
  }
  void main()
  {
   IE=0x81;//打开全外部中断允许
   TMOD=0x09;//T0为161
   IT0=1;//设置外部中断的触发的方式为脉冲触发
   TH0=0x00;
   TL0=0x00;
   T_flag=0;
   _reset=0;
   LCDINIT();
   while(1)
   {
    if(!b_test==1)//如果有测量按键输入就往下执行
    {
        i=0;
        _reset=1;//启动555时基芯片
        EX0=1;//开启中断0
        while(_reset)//超出等待时间;中断还没有过来;就退出
        {
         i++;
         if(i>5000)//设置最长等待时间
        {
         _reset=0;//最长等待时间到还没有中断;停止5000
     }
   }
        if(N<100)
        {
         b[6]=0x1c;
         b[5]=0x1c;
         b[4]=0x11;
         b[3]=0X1D;
         b[2]=0X23;
        }
        if(N>5000)//如果计数值大于5000;显示LARGER;表示应换用大一点的量程
        {b[6]=0x15;
         b[5]=0x17;
         b[4]=0x22;
         b[3]=0x11;
         b[2]=0x1C;
        }
        if(N>=100&&N<=5000)
        {
         C=N/100;D=N%100;//计算电容的大小
         b[2]=C/10;//计算电容值得十位
         b[3]=C-b[2]*10;//计算电容值的各位
         b[5]=D/10;
         b[6]=D-b[5]*10;
        }
        Display();//显示电容的大小
        wcomd(0x80+0x42);
        Delay1ms(5);
        wdata(0x30+b[2]);
        Delay1ms(5);
        wcomd(0x80+0x43);
        Delay1ms(5);
        wdata(0x30+b[3]);
        Delay1ms(5);
        wcomd(0x80+0x45);
        Delay1ms(5);
        wdata(0x30+b[5]);
        Delay1ms(5);
        wcomd(0x80+0x46);
        Delay1ms(5);
        wdata(0x30+b[6]);
        Delay1ms(1000);
        }
        if(!c_test==1)
        {
         Display1();
         Data1=get_ad();
         A=100*Data1;
         H=A/(256-Data1);
         A1=H/10;
         A2=H%10;
         wcomd(0x80+0x43);
         Delay1ms(5);
         wdata(0x30+A1);
         Delay1ms(5);
         wcomd(0x80+0x45);
         Delay1ms(5);
         wdata(0x30+A2);
         Delay1ms(1000);
         }
        }
   }
   void int0(void) interrupt0 //第一次中断开始计数;第二个中断停止计数
{
    T_flag=!T_flag;
    if(T_flag==1)
{
   TR0=1;//开始计时
   }
   if(T_flag==0)
   {
    TR0=0;//停止计时
    EX0=0;//关闭中断
    _reset=0;//停止发出方波
    N=TH0*256+TL0;//计算计数器的值
    N=N*5/3;
    TH0=0x00;//恢复初值
    TL0=0x00;
    }
   }



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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