10 黑幣
要求是做到
當收到上位機發送來的1后,向上位機發送字符串Turn on ad同時間隔1s讀取一次AD的值,換算成實際電壓浮點數,并且從串口發送到上位機。
當收到上位機發送來的2后,向上位機發送字符串Turn off ad,然后停止發送電壓
當收到上位機發送來的任何數后,向上位機發送字符串error
現在是按下面的單片機代碼無論發送什么都為error
51hei圖片20200213150431.png (243.47 KB, 下載次數: 63)
下載附件
修改輸出turn on ad
2020-2-13 15:05 上傳
//////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
曾對串行口函數 if 處進行過修改,
if(date==1)
{
flag_on=0;
}
if(date==2)
{
flag_on=1;
}
if(date==3)
{
flag_on=2;
}
現象是無論上位機收到任何數,都會輸出Turn on ad,并且讀取AD值,
#include "reg52.h"
#include"XPT2046.h"
#include"stdio.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 date,flag,flag_on;
u16 time_num,flag_time,ad_val;
u8 disp[4];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
float ad_vo;
void delay(u16 i) //延時函數
{
while(i--);
}
void init() //串行口定時器0初始化
{
TMOD=0X21;
TH1=0XF3;
TL1=0XF3;
TH0=0XFC;
TL0=0X18;
PCON=0X80;
TR1=1;
SCON=0X50;
EA=1;
ES=1;
ET0=1;
}
void datapros() //數據處理函數
{
disp[0]=smgduan[ad_val/1000];//?λ
disp[1]=smgduan[ad_val%1000/100];//??λ
disp[2]=smgduan[ad_val%1000%100/10];//??λ
disp[3]=smgduan[ad_val%1000%100%10];
}
void DigDisplay() //數碼管顯示函數
{
u8 i;
for(i=0;i<4;i++)
{
switch(i)
{
case(0):
LSA=0;LSB=0;LSC=0; break;
case(1):
LSA=1;LSB=0;LSC=0; break;
case(2):
LSA=0;LSB=1;LSC=0; break;
case(3):
LSA=1;LSB=1;LSC=0; break;
}
P0=disp[3-i];
delay(100);
P0=0x00;
}
}
void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0;
TI=1;
switch(flag_on)
{
case(0):puts("Turn on ad\n");TR0=1;break;
case(1):printf("Turn off ad\n");TR0=0;break;
case(2):puts("Error\n");break;
}
while(!TI);
TI=0;
ES=1;
flag=0;
}
if(flag_time==1)
{
flag_time=0;
ad_val= Read_AD_Data(0x94); //Read_AD_Data(0x94)讀取函數 無問題
ad_vo=(float)ad_val*5.0/4095.0;
ES=0;
TI=1;
printf("The voltage is %fV\n",ad_vo);
while(!TI);
TI=0;
ES=1;
}
datapros();
DigDisplay();
}
}
void Timer0()interrupt 1
{
TH0=0XFC;
TL0=0X18;
time_num++;
if(time_num==1000)//1s
{
time_num=0;
flag_time=1;
}
}
void ser()interrupt 4 //串行口中斷
{
RI=0;
date=SBUF;
flag=1;
if(date==1)
{
flag_on=0;
}
else if(date==2)
{
flag_on=1;
}
else
{
flag_on=2;
}
}
我來回答