📄 serialtest.c
字号:
}
ep = 1;
delay();
ep = 0;
}
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //
delayms(1);
lcd_wcmd(0x0c); //
delayms(1);
lcd_wcmd(0x06); //
delayms(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delayms(1);
}
void dacout(unsigned int output)
{
unsigned int i;
i=output>>8;
DAC0L = (char) output; // DAC0 Low Byte Register
DAC0H = (char) i; // DAC0 High Byte Register
}
unsigned int get_c1(void)
{
unsigned int c1=0;
AMX0SL = 0x00; // AMUX Channel Select Register
ADBUSY=1;
while (!flag_ad);
c1=kk;
flag_ad=0;
return (c1);
}
unsigned int get_c2(void)
{
unsigned int c2=0;
AMX0SL = 0x01; // AMUX Channel Select Register
ADBUSY=1;
while (!flag_ad);
c2=kk;
flag_ad=0;
return (c2);
}
unsigned int get_c3(void)
{
unsigned int c3=0;
AMX0SL = 0x04; // AMUX Channel Select Register
ADBUSY=1;
while (!flag_ad);
c3=kk;
flag_ad=0;
return (c3);
}
unsigned int get_c4(void)
{
unsigned int c4=0;
AMX0SL = 0x03; // AMUX Channel Select Register
ADBUSY=1;
while (!flag_ad);
c4=kk;
flag_ad=0;
return (c4);
}
unsigned int filter_c1(void)
{
unsigned int sum = 0;
unsigned char count;
for ( count=0;count<N;count++)
{
sum=sum+get_c1();
}
return (unsigned int)(sum/N);
}
unsigned int filter_c2(void)
{
unsigned int sum = 0;
unsigned char count;
for ( count=0;count<N;count++)
{
sum=sum+get_c2();
}
return (unsigned int)(sum/N);
}
unsigned int filter_c3(void)
{
unsigned int sum = 0;
unsigned char count;
for ( count=0;count<N;count++)
{
sum=sum+get_c3();
}
return (unsigned int)(sum/N);
}
unsigned int filter_c4(void)
{
unsigned int sum = 0;
unsigned char count;
for ( count=0;count<N;count++)
{
sum=sum+get_c4();
}
return (unsigned int)(sum/N);
}
void display_c3(unsigned int m)
{
unsigned char a,b,c,d;
a=m/1000;
b=(m-1000*a)/100;
c=(m-1000*a-100*b)/10;
d=m-1000*a-100*b-10*c;
lcd_wdat(number[a]);
lcd_wdat(0x2e);
lcd_wdat(number[b]);
lcd_wdat(number[c]);
lcd_wdat(number[d]);
lcd_wdat(0x56);
}
void display_c4(unsigned int m)
{
unsigned char a,b,c,d;
a=m/1000;
b=(m-1000*a)/100;
c=(m-1000*a-100*b)/10;
d=m-1000*a-100*b-10*c;
lcd_wdat(number[a]);
lcd_wdat(0x2e);
lcd_wdat(number[b]);
lcd_wdat(number[c]);
lcd_wdat(number[d]);
lcd_wdat(0x56);
}
void display_c1(unsigned int m)
{
unsigned char a,b,c,d;
a=m/1000;
b=(m-1000*a)/100;
c=(m-1000*a-100*b)/10;
d=m-1000*a-100*b-10*c;
lcd_wdat(number[a]);
lcd_wdat(0x2e);
lcd_wdat(number[b]);
lcd_wdat(number[c]);
lcd_wdat(number[d]);
lcd_wdat(0x56);
}
void display_c2(unsigned int m)
{
unsigned char a,b,c,d;
a=m/1000;
b=(m-1000*a)/100;
c=(m-1000*a-100*b)/10;
d=m-1000*a-100*b-10*c;
lcd_wdat(number[a]);
lcd_wdat(0x2e);
lcd_wdat(number[b]);
lcd_wdat(number[c]);
lcd_wdat(number[d]);
lcd_wdat(0x56);
}
void interrupt0(void) interrupt 0 //key_enter scan
{
if (k<2)
k++;
else
k=0;
}
void timer0(void) interrupt 1
{
if (!key_up)
{
display_set=display_set+10;
}
if (!key_down)
{
display_set=display_set-10;
}
TH0=0x20;
TL0=0x00;
}
void interrupt1(void) interrupt 2 //key_enter scan
{
flag_set=!flag_set;
if (flag_set)
{
lcd_wcmd(0x0f);
EX0=1;
TR0=1;
}
else
{
lcd_wcmd(0x0c);
EX0=0;
TR0=0;
switch (k)
{
case 0 : current_da = (long)current_set<<8;
current_da = current_da/180;
voltage_out= (unsigned int)current_da;
current_dac=current_set;
break;
case 1 : voltage_out=0;
break;
case 2 : voltage_out=0;
break;
default: voltage_out=0;
break;
}
}
}
void serial () interrupt 4 using 3
{
if (RI)
{
unsigned char ch;
RI = 0;
ch=SBUF;
if (!flag_handshake)
{
handshaking=ch;
flag_handshake=1;
}
else
{
if (!flag_len)
{
data_len=ch;
flag_len=1;
}
else
{
inbuf[count]=ch;
count++;
if ((count>=data_len))
{
count=0;
flag_handshake=0;
flag_len=0;
flag_end=1;
}
}
}
}
}
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
void send_string_com(unsigned char *str,unsigned int strlen)
{
unsigned int k=0;
do
{
send_char_com(*(str + k));
k++;
} while(k < strlen);
}
void ADC0_ISR() interrupt 15{
ADCINT=0;
flag_ad=1;
kk=ADC0VAL;
/*
ADC0转化值乘以单端电平系数,其结果为电平真实值乘以100000
例如ADC0VAL=1024时,realvol=1024*118=120832,即表示真实电压为1.20832v
*/
/*
ADC0转化值乘以物理量转化系数,来表示物理量值
例如某速度传感器输出为0-2.43V,其量程为0-1m/s,
则target_val为物理量值乘以1000000
例如ADC0VAL=1024时,target_val=1024*488=499712,即表示真实物理量为0.499712m/s
这里存在计算误差是因为没有采用浮点运算,对于精度要求低于0.2%,则采用上述长整型计算即可满足要求
若系统要求更高精度,则可考虑浮点运算。
*/
}
main()
{
BYTE i,j;
unsigned char c4_l,c4_h,c3_l,c3_h,c2_l,c2_h,c1_l,c1_h;
long c3_ad=0,c4_ad=0,c2_ad=0,c1_ad=0;
unsigned char n;
config();
OSCXCN = 0x67; // EXTERNAL Oscillator Control Register
for (n = 0; n < 255; n++) ; // wait for osc to start while ( (OSCXCN & 0x80) == 0 ); // wait for xtal to stabilize
OSCICN = 0x0C; // Internal Oscillator Control Register
lcd_init();
delayms(1);
led_cc=0;
led_cv=0;
led_cp=0;
led_cr=0;
EA = 1;
TR1=1;
while (1)
{
dacout(voltage_out);
c1_adc = filter_c1();
c2_adc = filter_c2();
c3_adc = filter_c3();
c4_adc = filter_c4();
c3_ad = (long) c3_adc*2438;
c3_ad = c3_ad>>12;
c3_dis = (unsigned int) c3_ad;
c4_ad = (long) c4_adc*2438;
c4_ad = c4_ad>>12;
c4_dis = (unsigned int) c4_ad;
c2_ad = (long) c2_adc*2438;
c2_ad = c2_ad>>12;
c2_dis = (unsigned int) c2_ad;
c1_ad = (long) c1_adc*2438;
c1_ad = c1_ad>>12;
c1_dis = (unsigned int) c1_ad;
c4_h=(unsigned char)(c4_adc>>8);
c4_l=(unsigned char)c4_adc;
c3_h=(unsigned char)(c3_adc>>8);
c3_l=(unsigned char)c3_adc;
c2_h=(unsigned char)(c2_adc>>8);
c2_l=(unsigned char)c2_adc;
c1_h=(unsigned char)(c1_adc>>8);
c1_l=(unsigned char)c1_adc;
lcd_pos(0x14); // 设置显示位置为第一行的第1个字符
i = 0;
while(dis1[i] != '\0')
{ // 显示字符"voltage="
lcd_wdat(dis1[i]);
i++;
}
display_c3(c3_dis); //显示电压值
lcd_pos(0x54); // 设置显示位置为第二行的第1个字符
i = 0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]); // 显示字符"current="
i++;
}
display_c4(c4_dis);//显示电流值
lcd_pos(0x40); // 设置显示位置为第二行的第1个字符
i = 0;
while(dis7[i] != '\0')
{
lcd_wdat(dis7[i]); // 显示字符"c2="
i++;
}
display_c2(c2_dis);//显示功率值
lcd_pos(0x00);
i = 0;
while(dis3[i] != '\0')
{ // 显示字符"c1="
lcd_wdat(dis3[i]);
i++;
}
display_c1(c1_dis);//显示功率值
sendbuf[0]=c1_h;
sendbuf[1]=c1_l;
sendbuf[2]=c2_h;
sendbuf[3]=c2_l;
sendbuf[4]=c3_h;
sendbuf[5]=c3_l;
sendbuf[6]=c4_h;
sendbuf[7]=c4_l;
sendbuf[8]=sendbuf[2]+sendbuf[3]+sendbuf[4]+sendbuf[5]+sendbuf[6]+sendbuf[7];
if (flag_end)
{
}
delayms(50);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -