欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3699|回復: 4
收起左側

用51單片機制作萬用表,不能用,請大家幫忙看看

[復制鏈接]
ID:747209 發表于 2020-5-19 14:47 | 顯示全部樓層 |閱讀模式
下面的是程序,和仿真,是之前一位壇友分享的,我畫了一個PCB,PCB的原理圖如下:

仿真圖

仿真圖

原理圖

原理圖

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/***************引腳聲明*********************/
#define lcd P0
sbit rs=P2^7;     //LCD液晶控制端
sbit en=P2^6;
sbit SPK=P1^7;  //蜂鳴器引腳
sbit CS=P1^2;   //CS位定義為P1.2引腳
sbit CLK=P1^0;  //CLK位定義為P1.0引腳
sbit DIO=P1^1;  //DIO位定義為P1.1引腳
sbit key=P2^5;  //定義按鍵引腳
sbit a=P2^0;             //模擬量通道選擇端
sbit b=P2^1;             //模擬量通道選擇端
sbit c=P2^2;             //模擬量通道選擇端

/***********LCD顯示數組**************************/
uchar code table0[]="  DCV(0-5V)  ";
uchar table1[]="  V=0000.00 v";
uchar code table2[]="  DCI(0-100mA)";
uchar table3[]="  I=0000.00mA";
uchar code table4[]="  R(0-1k)    ";
uchar table5[]="  R=000.0   ";

/***************全局變量************************/
uchar flag=0;      //換擋標志位


void delay(uint count)              //延時
{
uint i,j;
for(i=0;i<count;i++)
  for(j=0;j<120;j++);
}

/*************LCD1602驅動程序************************/
void w_cmd(uchar com)                    //lcd1602寫命令
{
rs=0;
lcd=com;
en=1;
delay(5);
en=0;
}

void w_data(uchar dat)           //lcd1602讀數據
{
rs=1;
lcd=dat;
en=1;
delay(5);
en=0;
}

void w_str(uchar *s)       //lcd1602寫字符串
{
   while(*s)  w_data(*s++);
}

void init()              //lcd1602初始化
{
en=0;
w_cmd(0x38);
w_cmd(0x0c);
w_cmd(0x06);
w_cmd(0x01);
}

/*****************************************************
函數功能:將模擬信號轉換成數字信號
***************************************************/
unsigned char  A_D()
{
unsigned char i,dat;
  CS=1;   //一個轉換周期開始
  CLK=0;  //為第一個脈沖作準備
  CS=0;  //CS0,片選有效
  DIO=1;    //DIO1,規定的起始信號  
  CLK=1;   //第一個脈沖
  CLK=0;   //第一個脈沖的下降沿,此前DIO必須是高電平
  DIO=1;   //DIO1 通道選擇信號  
  CLK=1;   //第二個脈沖,第23個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選通道CH0
  CLK=0;   //第二個脈沖下降沿

  DIO=0;   //DI0,選擇通道0
  CLK=1;    //第三個脈沖
  CLK=0;    //第三個脈沖下降沿
  DIO=1;    //第三個脈沖下沉之后,輸入端DIO失去作用,應置1
  CLK=1;    //第四個脈沖
  for(i=0;i<8;i++)  //高位在前
    {
     CLK=1;         //第四個脈沖
     CLK=0;
     dat<<=1;       //將下面儲存的低位數據向右移
  dat|=(unsigned char)DIO;   //將輸出數據DIO通過或運算儲存在dat最低位
   }            
   CS=1;          //片選無效
return dat;  //將讀書的數據返回     
}
/**********************報警程序************************/
void BaoJing(void)
{  
         uinti, j;
         for(i = 0; i < 200; i++)    //產生脈沖使蜂鳴器發出聲音
         {
        SPK = 0; for (j = 0; j < 100; j++);
        SPK = 1; for (j = 0; j < 100; j++);
  }   
}
/*********************按鍵判定************************************/
void keyscan()
{
         if(key==0)                    //判斷是否按下
         {
                  delay(10);
                  if(key==0)
                  {
                          while(!key);
                          flag++;
                          if(flag>3)flag=0;

                  }
         }
}
/*******************定時器1初始化程序******************/
void Timer1_Init(void) //
{
         TMOD=0x11;  
         TH1= ( 65535 - 50000 ) / 256;   //0.2ms
         TL1= ( 65535 - 50000 ) % 256;
         ET1=1;              
         TR1=1;      
         EA=1;
}
/*******************定時器1中斷程序********************/
void Timer1 ( void ) interrupt 3  //定時器1中斷函數 0.2ms
{
         TH1= ( 65535 - 50000) / 256;  
         TL1= ( 65535 - 50000 ) % 256;
         keyscan();   //按鍵判定
}

/*主函數*/                                                                  
void main()
{
uint adval;
unsigned long int temp;
init();     //液晶初始化      
Timer1_Init();  //定時器1初始化  
while(1)
  {

          if(flag==0)              //直流電壓測量
          {     
                          c=0;b=0;a=0;    //通道選擇
                          w_cmd(0x80);
                          w_str(table0);
                          adval=A_D();    //進行A/D轉換
                          temp=adval*5.0/255* 2*100;  //轉換成實際電壓并放大100
                          if(temp>500)
                          {
                                   BaoJing();   //超量程報警
                                   w_cmd(0xc0+0x00);      
                                   w_str("  V= .OL v  ");
                                   delay(500);
                          }
                          else
                          {
                                   table1[4]=temp/100000+0x30;
                                   table1[5]=temp%100000/10000+0x30;
                                   table1[6]=temp%10000/1000+0x30;
                                   table1[7]=temp%1000/100+0x30;
                                   table1[9]=temp%100/10+0x30;
                                   table1[10]=temp%10+0x30;                  
                                   w_cmd(0xc0+0x00);      
                                   w_str(table1);         
                                   delay(10);
                          }
          }

          if(flag==1)        //         直流電流測量
          {
                          c=0;b=0;a=1;    //通道選擇
                          w_cmd(0x80);
                          w_str(table2);         
                          adval=A_D();    //進行A/D轉換
                          temp=adval*0.1/255*5000000/10;
                          if(temp>10000)
                          {
                                   BaoJing();   //超量程報警
                                   w_cmd(0xc0+0x00);      
                                   w_str("  I= .OL mA ");
                                   delay(500);
                          }
                          else
                          {
                                   table3[4]=temp/100000+0x30;
                                   table3[5]=temp%100000/10000+0x30;
                                   table3[6]=temp%10000/1000+0x30;
                                   table3[7]=temp%1000/100+0x30;
                                   table3[9]=temp%100/10+0x30;
                                   table3[10]=temp%10+0x30;  
                                   w_cmd(0xc0+0);     
                                   w_str(table3);

                                   delay(10);
                          }
    }
           if(flag==2)      //         電阻測量
           {   
                          c=0;b=1;a=0;    //通道選擇
                          adval=A_D();    //進行A/D轉換
                          temp=adval*1.0/(255-adval)*1000;
                          if(temp>50000)
                          {
                                   BaoJing();   //超量程報警
                                   w_cmd(0xc0+0x00);      
                                   w_str("  R= .OL k  ");
                                   delay(500);
                          }
                          else
                          {
                                   w_cmd(0x80);
                                   w_str(table4);

                                   table5[4]=temp/1000+0x30;
                                   table5[5]=temp%1000/100+0x30;                 
                                   table5[6]=temp%100/10+0x30;            
                                   table5[8]=temp%10+0x30;   
                                   w_cmd(0xc0+0);     
                                   w_str(table5);
                                   delay(10);
                          }                                          
           }     
  }
}  



回復

使用道具 舉報

ID:584814 發表于 2020-5-20 10:58 | 顯示全部樓層
如果改了人家的圖紙,是有可能也要改動程序的相關部分才可以正常工作的。
回復

使用道具 舉報

ID:747209 發表于 2020-5-21 10:44 | 顯示全部樓層
man1234567 發表于 2020-5-20 10:58
如果改了人家的圖紙,是有可能也要改動程序的相關部分才可以正常工作的。

沒有改,只是從仿真圖畫了原理圖,生成了PCB
回復

使用道具 舉報

ID:187802 發表于 2020-5-21 12:20 | 顯示全部樓層
AD的時序要弄正確
回復

使用道具 舉報

ID:755472 發表于 2020-5-21 12:24 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表