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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

完全不會單片機 東拼西湊的程序,無法顯示數據,求指導

[復制鏈接]
跳轉到指定樓層
樓主
ID:769585 發表于 2020-6-10 19:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<math.h>
#include<absacc.h>
#include<intrins.h>
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned  int
#define ulong unsigned long

#define BUSY  0x80                  //常量定義            
#define DATAPORT P0
#define ADCDELAY 5


sbit LCM_RS=P2^0;
sbit LCM_RW=P2^1;
sbit LCM_EN=P2^2;


sbit CS =P1^2;  //ADC0832 chip seclect
sbit CLK =P1^3;  //ADC0832 clock signal
sbit SDI =P1^1;  //ADC0832 k in
sbit SDO =P1^0;  //ADC0832 k out





uchar ad_data;                    //采樣值存儲
unsigned char press_bai=0;        //顯示值百位
unsigned char press_shi=0;        //顯示值十位
unsigned char press_ge=0;         //顯示值個位
unsigned char press_dot=0;        //顯示值十分位
uchar code str0[]={"Weight:   .   kg. "};
uchar HighRH = 0;
uchar HighRL = 0;
uchar LowRH = 0;
uchar LowRL = 0;
unsigned int a;
uchar rate;  
sbit PWMOUT = P1^0;
uchar step, rec_data,flag;
void ADCInit(void);        //初始化TLC2543
uint StartConversion(uchar channl);        //開始轉換,同時選擇通道,同時返回上一次采樣值  
void delay(uint);                        
void lcd_wait(void);                      //檢測忙子程序
void delay_LCM(uint);                     //延時子程序
void initLCM(void);                       //初始化子程序
void WriteCommandLCM(uchar WCLCM,uchar BusyC);           //寫指令到LCM子程序      
void WriteDataLCM(uchar WDLCM);                          //寫數據到LCM子程序
void DisplayOneChar(uchar X,uchar Y,uchar DData);        //顯示指定坐標的一個字符子函數
void DisplayListChar(uchar X,uchar Y,uchar code *DData); //顯示指定坐標的一串字符子函數
void display(void);                                       //系統顯示子函數
void ConfigPWM(uchar rate);
void alarm(void);
void data_pro(void);
void ConfigPWM(uchar dc);
void key_setPWM(void);
uchar duty_cycle(uchar ad_data);


void chuankou_init();

/**********main funcation************/
void main(void)
{
         
        
    delay(50);              
    initLCM( );      
                chuankou_init();
    WriteCommandLCM(0x01,1);           //清屏顯示
    DisplayListChar(0,0,str0);
               
                delay(10);
                EA = 1;
                ConfigPWM(rate);
                while(1)
    {
                        ad_data =StartConversion(0);                 //采樣值存儲單元初始化為0
                        alarm();
                        data_pro();
                        
                        display();
                        
                        a=duty_cycle(ad_data);
                        ConfigPWM(a);
                        key_setPWM();
                        if(a!=rate)
                        {
                        ConfigPWM(rate);
                        }
                        
                                if(RI==1)//串口
                {
                        RI=0;
                        rec_data=SBUF;
                        step=rec_data*2;
                        SBUF=rec_data;
                }
               
                }
}

void TIME_INIT()
{
TMOD|=0X02;
IT0=1;
IT1=1;
TR1=1;
EX1=1;
EX0=1;
ET0=1;
TR0=1;
EA=1;
}
void chuankou_init()
{
SCON|=0X50;
TMOD|=0X20;
PCON|=0X80;
TH1=0XFA;
TL1=0XFA;
TR1=1;

SM0=0;
SM1=1;
REN=1;

EA=1;
ES=1;
}

/********延時K*1ms,12.000mhz**********/
void delay(uint x)
{
    uchar i;
         while(x--)
         {
                 for(i = 0;i < 120;i++)
                 {;}
         }
}   
/**********寫數據到ICM子函數************/
void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
    if(BusyC)
                        lcd_wait();          //檢測忙信號
                DATAPORT=WCLCM;
    LCM_RS=0;               
    LCM_RW=0;  
    LCM_EN=1;   
         _nop_();   
         _nop_();
         _nop_();
    LCM_EN=0;

}
/**********????LCM???************/
void WriteDataLCM(uchar WDLCM)
{
    lcd_wait( );  
                DATAPORT=WDLCM;
    LCM_RS=1;        //選中數據寄存器
    LCM_RW=0;        //寫模式
    LCM_EN=1;
    _nop_();
                 _nop_();
                 _nop_();
    LCM_EN=0;
}
/***********lcm內部等待程序*************/
void lcd_wait(void)
{
    DATAPORT=0xff;       //讀LCD前若單片機輸出低電平,而讀出LCD為高電平,則沖突,Proteus仿真會有顯示邏輯黃色
                LCM_EN=1;
    LCM_RS=0;   
    LCM_RW=1;   
    _nop_();
    _nop_();
                _nop_();
    while(DATAPORT&BUSY)  
                {  
                        LCM_EN=0;
                        _nop_();
                        _nop_();
                        LCM_EN=1;
                        _nop_();
                        _nop_();
    }  
    LCM_EN=0;

}
/**********LCM??????***********/
void initLCM( )
{   
         DATAPORT=0;
         delay(15);
         WriteCommandLCM(0x38,0);            //三次顯示模式,不檢測忙信號
                delay(5);
    WriteCommandLCM(0x38,0);
    delay(5);
    WriteCommandLCM(0x38,0);
    delay(5);
    WriteCommandLCM(0x38,1);            //8bit數據傳送,兩行顯示,5*7字型,檢測忙信號
    WriteCommandLCM(0x08,1);            //關閉顯示,檢測忙信號
    WriteCommandLCM(0x01,1);            //清屏,檢測忙信號
    WriteCommandLCM(0x06,1);            //顯示光標右移設置
    WriteCommandLCM(0x0c,1);            //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
}
/****??????????????****/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
    Y&=1;
    X&=15;
    if(Y)X|=0x40;                    //若Y為1(顯示第二行)地址譯碼+0x40
    X|=0x80;                          //指令碼為地址碼+0x80
    WriteCommandLCM(X,0);
    WriteDataLCM(DData);
}
/*******??????????????*****/

void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
    uchar ListLength=0;
    Y&=0x01;
    X&=0x0f;
    while(X<16)
    {
        DisplayOneChar(X,Y,DData[ListLength]);
        ListLength++;
        X++;
    }
}
/*****************???????*****************/
void display(void)
{
                WriteCommandLCM(0x0c,1);               //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
                DisplayListChar(0,0,str0);

                DisplayOneChar(7,0,press_bai+0x30);
                DisplayOneChar(8,0,press_shi+0x30);
                DisplayOneChar(9,0,press_ge +0x30);
                DisplayOneChar(10,0,056);
    DisplayOneChar(11,0,press_dot+0x30);  
}

void Delay_ADC(uchar ms)
{
        uchar i;
        for(; ms > 0; ms--)
                for(i = 5; i > 0; i--);
}
void ADCInit(void)        //初始化TLC2543
{
        CS = 1;
        CLK = 0;
        SDI = 0;
        SDO = 1;
}
uint StartConversion(uchar channl)        //開始轉換,同時選擇通道,同時返回上一次采樣值
{
        uint dat = 0;
        uchar i;
        CS = 0;
        SDI = 0;
        for(i = 0; i < 12; i++)        //通道選擇
        {
                dat <<= 1;        //左移一位
                if(channl & 0x80)
                        SDI = 1;
                else
                        SDI = 0;
                channl <<= 1;        //左移一位
                CLK = 1;
                if(SDO)
                        dat += 1;
                Delay_ADC(ADCDELAY);
                CLK = 0;
        }
        CS = 1;
        return dat;
}
void data_pro(void)
{
      unsigned int temp;
      float  press;      
                 
                                int vary=ad_data;      //y=(115-15)/(243-13)*X+15kpa   
                         //press=24+ad_data/2.67;
                         press=((10.0/28.1)*vary)+9.3;        //測試時補償值為9.3
                         temp=(int)(press*10);                 //放大10倍,便于后面計算            
                         press_bai=temp/1000;        
                         press_shi=(temp%1000)/100;   
                         press_ge=((temp%1000)%100)/10;  
                         press_dot=((temp%1000)%100)%10;
                           

}
uchar duty_cycle(uchar ad_data)
{
        uchar rate;
        
        rate= 100*ad_data/256;
  return(rate);
}

/*??????dc,??20Hz????*/
void ConfigPWM(uchar dc)
{
        unsigned long tmp;          //臨時變量
        uint high, low;
        tmp = 11059200/12/20;        //計算一個周期所需的計數值
        high = (tmp*dc)/100;         //計算高電平所需計數值
        low = tmp - high;             //計算低電平所需計數值
        high = 65536 - high + 12;    //計算高電平的定時器重載值并補償中斷延時
        low = 65536 - low + 12;          //計算低電平的定時器重載值并補償中斷延時
        HighRH = (uchar)(high >>8);      //高電平重載值拆分為高低字節
        HighRL = (uchar)high;
        LowRH = (uchar)(low >> 8);         //低電平重載值拆分為高低字節
        LowRL = (uchar)low;
        TMOD &= 0xF0;                //清0 T0的控制位
        TMOD |= 0x01;                 //配置T0的模式為 1
        TH0 = HighRH;                   //加載T0重載值
        TL0 = HighRL;                           
        ET0 = 1;                    //使能T0中斷
        TR0 = 1;                  //啟動T0         
}
void init0() interrupt 0
{
        
        step++;
        if(step==200)
        {
                step=0;
        }
}
/*???0????*/



void init1() interrupt 2
{
        
        step--;
        if(step==0)
        {
                step=0;
        }
}

void chuankou() interrupt 4
{
        RI=0;
        rec_data=SBUF;
        step=rec_data*2;
        flag=1;
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:584814 發表于 2020-6-11 16:30 | 只看該作者
完全不會單片機可以學,東拼西湊的程序可以調,無法顯示數據可以改,但如果為論文最好上淘寶
回復

使用道具 舉報

板凳
ID:420836 發表于 2020-6-11 20:53 | 只看該作者
已經很好地將所有內容組合在一起。 如果仍然有問題,可以學習一些示例。
回復

使用道具 舉報

地板
ID:436885 發表于 2020-6-12 01:21 | 只看該作者
都不知道你們想要實現什么目的?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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