不能實時顯示探測結果,求大神賜教;
- #include <reg52.h>
- #include <intrins.h>
- #include <string.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar AD_DATA[1]; //保存IN0通道轉換后的數據
- uchar addata0;
- uchar addata1;
- /********************adc0809端口定義*******************/
- #define adc0809_data P2// ADC0809模塊的D0-D7分別接P2.0-P2.7
- sbit STR=P0^0; //單片機P0.0接模塊STR引腳, 啟動轉換信號
- sbit EOC=P0^1; //單片機P0.1接模塊EOC, 轉換結束信號,高電平有效
- sbit OE=P0^2; //單片機P0.2接模塊OE,輸出允許信號,高電平有效
- sbit CLK=P0^3; //單片機P0.3接CLK ,ADC0809時鐘,輸入50-800KHZ的頻率
- sbit ADD_A=P0^4;
- sbit ADD_B=P0^5; //定義地址線
- sbit ADD_C=P0^6;
- /******************************************************/
- /*******************lcd1602端口定義********************/
- #define LCM_Data P1 //LCD1602數據接口
- #define Busy 0x80 //用于檢測LCM狀態字中的Busy標識
- sbit LCM_RW = P3^3; //讀寫控制輸入端,LCD1602的第五腳
- sbit LCM_RS = P3^4; //寄存器選擇輸入端,LCD1602的第四腳
- sbit LCM_E = P3^2; //使能信號輸入端,LCD1602的第6腳
- /******************************************************/
- /*******************存儲模塊端口定義*******************/
- sbit P1_0 = P3^5;//busy忙標志管腳
- sbit P1_5 = P3^6 ;//測試板信號指示(指示發送數據)
- /******************************************************/
- /*******************函數聲明***************************/
- void WriteDataLCM (uchar WDLCM);//LCD模塊寫數據
- void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模塊寫指令
- uchar ReadStatusLCM(void);//讀LCD模塊的忙標
- void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置顯示一個字符
- void LCMInit(void);//LCD初始
- void delayms(uint ms);//1MS基準延時程序
- void delay(uchar i); //延時函數2
- void DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData);
- void judge_xianshi(void);//顯示處理程序
- void init();//系統初始化設置
- void AD();//讀取AD數據
- void Send_UART(unsigned int num/*字節數*/,unsigned char *Date_OUT/*數據數組*/);
- void SD();
- uchar flag1;
- /******************************************************/
- /*******************系統初始化*************************/
- void init()
- {
- EA=1; //開總中斷
- TMOD=0x02; //設定定時器 T0工作方式
- TH0=216; //利用T0中斷產生CLK信號
- TL0=216;
- TR0=1; //啟動定時器T0
- ET0=1;
- STR=0;
- OE=0;
- }
- /******************************************************/
- /******************adc0809*****************************/
- void AD()
- {
- STR=1;//ADDR這樣如果不是通道0,可以在這邊加一條其他地址的程序
- delay(10);
- ADD_A=0;
- ADD_B=0;
- ADD_C=0;
- delay(10);
- STR=0;
- delay(10);
- STR=1; //啟動AD轉換
- delay(10);
- STR=0;
- while(0==EOC);//等待轉換結束
- OE=1;
- AD_DATA[0]=adc0809_data; //讀取AD數據,數據范圍為0-255
- OE=0;
- delay(10);
- }
- /******************************************************/
- /********************lcd1602***************************/
- void judge_xianshi()
- {
- addata0=255/AD_DATA[0]/1*10;//把數據擴大10,為下面求取小數位后1位做準備
- DisplayListChar(0,0,0, "R="); //在液晶的第二行第0位開始顯示"R="
- DisplayOneChar(0,2, addata0/100000+0x30); //顯示AD數據的萬位
- DisplayOneChar(0,3, addata0/10000%10+0x30);//顯示AD數據的千位
- DisplayOneChar(0,4, addata0/1000%10+0x30);//顯示AD數據的百位
- DisplayOneChar(0,5, addata0/100%10+0x30);//顯示AD數據的十位
- DisplayOneChar(0,6, addata0/10%10+0x30);//顯示AD數據的十位
- DisplayListChar(0,7,0, ".");
- DisplayOneChar(0,8, addata0%10+0x30);
- DisplayListChar(0,9,0, "v");
- DisplayListChar(0,10,0, "/");
- DisplayListChar(0,11,0, "a");
- addata1=AD_DATA[0]*5/51/1*10;//把數據擴大10,為下面求取小數位后1位做準備
- DisplayListChar(1,0,0, "P="); //在液晶的第二行第8位開始顯示"P="
- DisplayOneChar(1,2, addata1/100000+0x30); //顯示AD數據的萬位
- DisplayOneChar(1,3, addata1/10000%10+0x30);//顯示AD數據的千位
- DisplayOneChar(1,4, addata1/1000%10+0x30);//顯示AD數據的百位
- DisplayOneChar(1,5, addata1/100%10+0x30);//顯示AD數據的十位
- DisplayOneChar(1,6, addata1/10%10+0x30);//顯示AD數據的各位
- DisplayListChar(1,7,0, ".");
- DisplayOneChar(1,8, addata1%10+0x30);
- DisplayListChar(1,10,0, "w");
- }
- /***********************中斷***************************/
- void t0(void) interrupt 1 using 0
- {
- CLK=~CLK;
- }
- /******************************************************/
- void DisplayListChar(uchar X,uchar Y,uchar ms, uchar code *DData)
- {
- unsigned char ListLength;
- ListLength = 0;
- X&=0x1;
- Y&=0xF; //限制X不能大于15,Y不能大于1
- while (DData[ListLength]!='\0') //若到達字串尾則退出
- {
- if (Y <= 0xF) //X坐標應小于0xF
- {
- DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
- ListLength++;
- Y++;
- delayms(ms);//延時顯示字符串
- }
- else
- break;//跳出循環體
- }
- }
- void LCMInit(void)
- {
- LCM_Data = 0;
- WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
- delayms(5);
- WriteCommandLCM(0x38,0);
- delayms(5);
- WriteCommandLCM(0x38,0);
- delayms(5);
- WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
- WriteCommandLCM(0x08,1); //關閉顯示
- WriteCommandLCM(0x01,1); //顯示清屏
- WriteCommandLCM(0x06,1); // 顯示光標移動設置
- WriteCommandLCM(0x0C,1); // 顯示開及光標設置
- delayms(100);
- }
- void WriteDataLCM(uchar WDLCM)
- {
- ReadStatusLCM(); //檢測忙
- LCM_Data = WDLCM;
- LCM_RS = 1;
- LCM_RW = 0;
- LCM_E = 0; //若晶振速度太高可以在這后加小的延時
- LCM_E = 0; //延時
- LCM_E = 1;
- }
- void WriteCommandLCM(uchar WCLCM,BuysC) //BuysC為0時忽略忙檢測
- {
- if (BuysC) ReadStatusLCM(); //根據需要檢測忙
- LCM_Data = WCLCM;
- LCM_RS = 0;
- LCM_RW = 0;
- LCM_E = 0;
- LCM_E = 0;
- LCM_E = 1;
- }
- uchar ReadStatusLCM(void)
- {
- LCM_Data = 0xFF;
- LCM_RS = 0;
- LCM_RW = 1;
- LCM_E = 0;
- LCM_E = 0;
- LCM_E = 1;
- while (LCM_Data & Busy); //檢測忙信號
- return(LCM_Data);
- }
- void DisplayOneChar( uchar X, uchar Y, uchar ASCII)
- {
- X&=0x1;
- Y&=0xF; //限制Y不能大于15,X不能大于1
- if(X)Y|=0x40; //當要顯示第二行時地址碼+0x40;
- Y|=0x80; // 算出指令碼
- WriteCommandLCM(Y, 0); //這里不檢測忙信號,發送地址碼
- WriteDataLCM(ASCII);
- }
- /******************************************************/
- /********************延遲函數**************************/
- void delayms(uint Ms)
- {
- uint i,TempCyc;
- for(i=0;i<Ms;i++)
- {
- TempCyc =70;
- while(TempCyc--);
- }
- }
- void delay(uchar i)
- {
- uchar j;
- while(i--)
- {
- for(j=125;j>0;j--);
- }
- }
- /******************************************************/
- /*******************存儲模塊***************************/
- uchar date_temp[50]={0};//獲取系統狀態
- code uchar top[]={" 單位:西安工業大學"};//獲取系統狀態,22
- code uchar item[]={"電阻(Ω) 功率(W) 工作狀態"};//獲取系統狀態,31
- uchar D_date[]={"10000.0 10000.0 正常"};//定義數據格式,28
- void Send_UART(unsigned int num/*字節數*/,unsigned char *Date_OUT/*數據數組*/);
- unsigned char a;
- unsigned char addata0;
- unsigned char addata1;
- unsigned char r;
- unsigned char p;
- void CUNCHU (void)
- {
- SCON = 0x50; //0101,0000 串口方式1,允許接收,無奇偶校驗位
- TMOD = 0x20; //0010,0000 時器1,定時方式2 自動重裝裝計數器
- PCON = 0x80; //SMOD=1
- TL1 = 0xfd;
- TH1 = 0xfd;
- TR1 = 1;
- P1_0 = 1;
- delay(2000);
- //寫標題
- while(P1_0);
- memcpy(date_temp,top,22);
- Send_UART(22,date_temp);
- //寫條目
- while(P1_0);
- memcpy(date_temp,item,31);
- Send_UART(31,date_temp);
-
- while(1)
- {
- r=addata0;
- p=addata1;
- D_date[1] =r/100000%10+'0';
- D_date[2] =r/10000%10+'0';
- D_date[3] =r/1000%10+'0';
- D_date[4] =r/100%10+'0';
- D_date[5] =r/10%10+'0';
- D_date[6] ='.';
- D_date[7] =r%10+'0';
- D_date[12]=p/100000%10+'0';
- D_date[13]=p/10000%10+'0';
- D_date[14]=p/1000%10+'0';
- D_date[15]=p/100%10+'0';
- D_date[16]=p/10%10+'0';
- D_date[17]='.';
- D_date[18]=p%10+'0';
- delay(50);
- memcpy(date_temp,D_date,28);
- Send_UART(28,date_temp);
- delay(50);
- }
- }
- void Send_UART(unsigned int num/*字節數*/,unsigned char *Date_OUT/*數據數組*/)
- {
- unsigned int i=0;
- while(i<num)
- {
- TI = 0; //清零串口發送完成中斷請求標志
- SBUF = Date_OUT[i]; //date[i]
- while(TI ==0); //等待發送完成
- TI = 0; //清零串口發送完成中斷請求標志
- i++;
- }
- //WINDOWS里的是 13 + 10(ASCII碼值)作為換行
- //-----------------------------------------------發送換行符0x0D
- SBUF = 0x0d;
- while(TI ==0); //等待發送完成
- TI = 0; //清零串口發送完成中斷請求標志
- //-----------------------------------------------發送換行符0x0a
- SBUF = 0x0a;
- while(TI ==0); //等待發送完成
- TI = 0; //清零串口發送完成中斷請求標志
- }
- /******************************************************/
- /*********************主函數***************************/
- main()
- {
- while(1)
- {
- init();//系統初始化設置
- LCMInit();
- AD();
- judge_xianshi();
- CUNCHU();
- //if(()()) //報警
- delayms(100);
- }
- }
- /******************************************************/
復制代碼
|