久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4677|回復: 1
打印 上一主題 下一主題
收起左側

1602電壓電流表程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:258563 發表于 2017-12-7 11:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <stc.h>
#include <intrins.h>
#define RELOAD_COUNT  0xD7                 //12.6 MHz,1T9600bps         

/*----------------------------LCD1602接口定義----------------------------------*/
sbit    LCD_RS= P2^5;        //數據指令
sbit    LCD_RW= P2^7;        //讀寫控制端
sbit    LCD_EN= P2^4;        //使能端
/********************************顯示數據表*********************************/

typedef unsigned char uchar;
uchar tmp;
uchar dis1[] = {"4 -.--V  5 -.--V"};
uchar dis2[] = {"I ----mA P -.--V"};
uchar channel;
uchar result[5];
long  Data=500;   //電壓源電壓值 v*100                           
void serial_port_initial(void);                //定義串口
void delayms(uchar);                        //延時
void delayus(uchar us);                //延時
void UART_Interrupt_Receive(void);            //接收字符
void send_char(uchar);                         //發送字符
void send_str(uchar stLCD_RS[]);            //發送字符串
uchar get_AD_result(uchar);                    //AD轉換
void lcd_en(void);         //輸入使能
void lcd_wcmd (uchar cmd) ;
void lcd_wdat (uchar dat) ;
void lcd_printc (uchar x, uchar y, uchar c)    ;
void lcd_prints (uchar x, uchar y, uchar *s)  ;
bit lcd_bz();

/**********************LCD延時子程序********************************/
void delayms(uchar ms)                //LCD延時子程序
{    uchar a,b;                        
    while(ms--)
    {
    for(b=233;b>0;b--)
        for(a=12;a>0;a--);
    }
}

void delayus(uchar us)                //1us相當于
{                           
    uchar a;
    while(us--)
    {
    a++;
    a--;
    }
}

/*****************************************************************************
函數功能:顯示相關程序
*****************************************************************************/
void lcd_init()                    //函數功能:LCD初始化子程序
{                           
    lcd_wcmd(0x28);                  //四線顯示
    delayms(1);
    lcd_wcmd(0x0c);                //顯示打開
    delayms(1);
    lcd_wcmd(0x06);        
    delayms(1);
    lcd_wcmd(0x01);                //顯示清屏
    delayms(1);
}
void lcd_en(void)         //輸入使能
{
    LCD_EN = 1;
    delayus(10);            //10us
    LCD_EN = 0;
}

bit lcd_bz()
{                           
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayus(50);   
    result = (bit)(P2 & 0x08);
    LCD_EN = 0;
    return result;   
}
/*****************************************************************************
函數功能:寫指令數據到LCD子程序
入口參數:cmd
出口參數:
*****************************************************************************/
void lcd_wcmd(uchar cmd)
{                        
    while(lcd_bz());            //判斷LCD是否忙碌


    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    P2 &= 0xf0;        //清低四位
    P2 |= (cmd&0xf0)>>4;    //寫低四位
    lcd_en();
    P2 &= 0xf0;        //清低四位
    P2 |= cmd&0x0f;    //寫低四位
    lcd_en();
}

/*****************************************************************************
函數功能:寫入顯示數據到LCD子程序
入口參數:dat
出口參數:
*****************************************************************************/


void lcd_wdat(uchar dat)   
{                           
    while(lcd_bz());                    //判斷LCD是否忙碌


    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P2 &= 0xf0;        //清低四位
    P2 |= (dat&0xf0)>>4;    //寫低四位
    lcd_en();
    P2 &= 0xf0;        //清低四位
    P2 |= dat&0x0f;    //寫低四位
    lcd_en();
}

void lcd_printc (uchar x, uchar y, uchar c)        //字符定位輸出
{
    if(y)    lcd_wcmd(x | 0xc0);                //液晶定位
    else    lcd_wcmd(x | 0x80);
    lcd_wdat(c);
}

void lcd_prints (uchar x, uchar y, uchar *s)    //字符串定位輸出
{
    if(y)    lcd_wcmd(x | 0xc0);                  //液晶定位
    else    lcd_wcmd(x | 0x80);


    while(*s)
    {
        lcd_wdat(*s);
        s++;
    }
}

/************************主程序************************************/
void main(void)
{                                            // 初始化串口
    serial_port_initial();  
      lcd_init();                                // 初始化LCD            


    P1ASF=0xff ; // 0110,0011,要設置為 A/D 轉換的P1.x 口,先設為高
      channel=4;

while(1){
    get_AD_result(channel);
      dis1[0]=channel+48 ;
     dis1[2]=result[0];
     dis1[4]=result[1];
      dis1[5]=result[2];
    get_AD_result(5);
     dis1[11]= result[0];
     dis1[13]= result[1];
      dis1[14]= result[2];

    get_AD_result(6);

    if(result[3]>=0x7e){result[3]-=0x7e; dis2[1]='+';} else {result[3]=0x7e-result[3]; dis2[1]='-';}                     //127==0x7f
     Data= result[3]*5;
    dis2[2]=Data/1000+48 ;               // 返回 A/D 轉換結果
    dis2[3]=(Data%1000)/100+48 ;
     dis2[4]=((Data%100)/10)+48 ;
      dis2[5]=(Data%10)+48 ;

    Data=63750/(get_AD_result(7));                     //Data=255*250/result

     dis2[11]= Data/100+48;
     dis2[13]= (Data%100)/10+48;
      dis2[14]= Data%10+48;

     lcd_prints (0,0,dis1);
    lcd_prints (0,1,dis2);

   if(result[3]=='k')
        {
        while(1)
        {
     send_char(get_AD_result(channel));
       delayms(100);
        }
        }
}
}

/*********************串口相關程序********************************/
void serial_port_initial()                    //定義串口初始值
{
     PCON = 0x00;        //波特率不倍速
    SCON = 0x50;        //8位數據,可變波特率
    AUXR |= 0x40;        //定時器1時鐘為Fosc,即1T
    AUXR &= 0xfe;        //串口1選擇定時器1為波特率發生器
    TMOD = 0x20;
    TL1 = RELOAD_COUNT;    //設定定時初值
    TH1 = RELOAD_COUNT;        //設定定時器重裝值
    ET1 = 0;        //禁止定時器1中斷
    TR1 = 1;        //啟動定時器1
    EA  = 1;
    ES  = 1;
}   

void send_char(uchar i)                        //發送單字符
{
    SBUF   =   i;
    while(TI ==0); //等待發送完成
    TI     =   0;  //清零串口發送完成中斷請求標志
}



void send_str(uchar stLCD_RS[])                    // 發送字符串
{   
    uchar i=0;
    ES     =   0;  //關串口中斷
    TI     =   0;  //清零串口發送完成中斷請求標志
    while(stLCD_RS != '\0')
    {
        SBUF = stLCD_RS;
        while(!TI);                // 等特數據傳送
        TI = 0;                    //清零串口發送完成中斷請求標志
        i++;                    // 下一個字符
    }
    ES     =   1;  //允許串口中斷
}

void UARTInterrupt(void) interrupt 4        //串口中斷接收
{
    if(RI)                             // 是否有數據到來
        {
            RI=0;
            result[3] = SBUF;                // 暫存接收到的數據
     if(result[3]<8)
        {

         channel    =result[3];
         result[3]=get_AD_result(channel);
           send_str("第");
         send_char(channel+48);
          send_str("通道電壓是: ");
         send_char(result[0]);
         send_char('.');
          send_char(result[1]);
          send_char(result[2]);
         send_char('V');
         send_char(' ');
         }
    if(result[3]=='p')
        {
        result[3]=get_AD_result(7);
        Data=63750/(result[3]);
          send_str("芯片供電電壓是: ");
         send_char(Data/100+48);
         send_char('.');
          send_char((Data%100)/10+48);
          send_char(Data%10+48);
         send_char('V');
         send_char(' ');
        }
        }
}

/**********************AD轉換程序********************************/
uchar get_AD_result(uchar channell)            //
{
    uchar AD_finished = 0; // 存儲 A/D 轉換標志
    ADC_CONTR=0xE0;           //設置速度  0xx00000 打開電源 x0000000
    ADC_RES = 0;
    ADC_CONTR |= channell; // 選擇 A/D 當前通道
   delayms(1);              //使輸入電壓達到穩定
    ADC_CONTR |= 0x08; //0000,1000 令 ADC_START = 1, 啟動A/D 轉換
    AD_finished = 0;
    while ( AD_finished == 0 ) // 等待A/D 轉換結束
    {   
    AD_finished = (ADC_CONTR & 0x10); //0001,0000, ADC_FLAG ==1測試A/D轉換結束否

    }
ADC_CONTR &= 0xE0; //1110,0000 令 ADC_START = 0, 關閉A/D 轉換,
       result[3]=ADC_RES;
    result[0]=result[3]*Data/25500+48 ;               // 返回 A/D 轉換結果
    result[1]=((result[3]*Data/255)%100)/10+48 ;
     result[2]=(result[3]*Data/255)%10+48 ;
return (result[3]);
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:183728 發表于 2018-1-12 13:39 | 只看該作者
原理圖有嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产一区二区在线 | 日韩二三区| 成年人免费看 | 国产视频福利一区 | 国产综合精品一区二区三区 | 国产精品99久久久久久久久久久久 | 中文字幕在线一区二区三区 | 精品久久一区二区三区 | 久久久久久久久91 | 伊人狠狠干 | 欧美一级精品片在线看 | 久久国产精品视频免费看 | 91国在线高清视频 | 亚洲精品久久久久久久久久吃药 | 男女啪啪高潮无遮挡免费动态 | 欧美成人二区 | 成人精品久久久 | 欧美一区二区黄 | 天天干狠狠干 | 免费在线一区二区 | 人人看人人草 | 欧美成人a | 亚洲视频不卡 | 亚洲3级 | 欧美国产免费 | 91在线精品秘密一区二区 | 在线观看涩涩视频 | 日韩区 | 国产不卡在线观看 | 亚洲精品视频在线 | 一区精品在线观看 | yeyeav| 操操日 | 国产精品色 | av一二三四 | 91传媒在线观看 | 亚洲欧美在线观看 | 中文字幕一区在线观看视频 | 精品亚洲视频在线 | 91精品国产色综合久久 | 99国产精品久久久 |