打印

51串口。求教各位大神--------

[复制链接]
644|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DT天若有情|  楼主 | 2017-7-11 22:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
辛苦大家帮我看下小程序,51串口。
程序实际效果:上位机发送1,单片机接收返回给上位机Turn on ad,并且把变化的二进制模拟量转化为十进制发到上位机。
                       上位机发送2,单片机接收返回给上位机Turn off ad,并且保留当前值
                         发送其他数值,返回给上位机error.
我的问题:1------ad转换部分没有用void,用的是uchar get-ad(),请问这是函数还是就是一个函数体调用,麻烦解释通俗一点,鄙人比较笨拙。。。。
                2------函数显示部分,我是独立的num,和后面的函数好像没有关联,怎么能把后面随时变化的数分离到数码管。
               3----------麻烦各位大神看到程序,给点建议,随便啥都行。
谢谢在我前进的道路上帮过忙的大侠们~~~~。路很远,不会放弃。




#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit adwr=P3^6;
sbit adrd=P3^7;
uchar num1,flag_uart,a,flag_time,a,ad_num,flag_on,get_ad();
float ad_vo;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint );
void init();
void display(uchar );
void main()
{
init();
wela=1;
P0=0x7f;
wela=0;
while(1)
{
  if(flag_uart==1)
  {
   flag_uart=0;
   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;
  }
   if(flag_time==1)
  {
   flag_time=0;
   ad_num=get_ad();
   ad_vo=(float)ad_num*5.0/256.0;
   ES=0;
   TI=1;
   printf("The voltage is %fV\n",ad_vo);
   while(!TI);
   TI=0;
   ES=1;
  }
  display(ad_num);
}

}
void delayms(uint z)
{
uchar i,j;
for(i=z;i>0;i--)
  for(j=110;j>0;j--);
}
void display(uchar num)
{
uchar bai,shi,ge;
bai=num/100;
shi=num%100/10;
ge=num/10;

wela=1;
P0=0x7e;
wela=0;
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
delayms(5);

wela=1;
P0=0x7d;
wela=0;
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
delayms(5);
wela=1;
P0=0x7b;
wela=0;
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
delayms(5);
}
void init()
{
TMOD=0x21;//(0010,0001)
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=0XFD;
TL1=0XFD;
ET0=1;
TR1=1;
SM0=0;
SM1=1;
REN=1;
//SCON=0x50;
EA=1;
ES=1;
}
uchar get_ad()
{
uchar adnum;
adwr=1;
_nop_();
adwr=0;
_nop_();


P1=0xff;//
adrd=1;
_nop_();
adrd=0;
_nop_();
adnum=P1;//°Ñֵȫ²¿¸³¸øP1£¬
adrd=1;
return(adnum);
}
void T0time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==20)
{
  num1=0;
  flag_time=1;
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag_uart=1;
if(a==1)
   flag_on=0;
  else if(a==2)
   flag_on=1;
  else
   flag_on=2;
}

相关帖子

沙发
NE5532| | 2017-7-12 09:40 | 只看该作者
uchar get-ad()是返回uchar类型的函数,用来GetAD很正常啊,另外这个不是你的程序,是人家的,你看不懂,对不对?最好自己调试一下看,别偷懒。

使用特权

评论回复
板凳
fengfeng的恒| | 2017-7-12 11:45 | 只看该作者
1.是函数定义,函数体定义时,参数没写表示void,即uchar get_ad()    相当uchar get_ad(void)  
2.目前这个程序是定时采集AD的值,显示到数码管上,因为主程序里采集完数据ad_num直接传到显示里去了,所以算是实时显示了。
3.建议:把数码管刷新放到定时器中断里去,比如每2ms显示一个字,然后动态扫描,这样主程序就灵活很多,方便拓展。
有不到之处,请大神们指出。

使用特权

评论回复
地板
DT天若有情|  楼主 | 2017-7-12 22:16 | 只看该作者
fengfeng的恒 发表于 2017-7-12 11:45
1.是函数定义,函数体定义时,参数没写表示void,即uchar get_ad()    相当uchar get_ad(void)  
2.目前这 ...

听懂了一点。但是还是有疑惑,我的主程序里面的ad_num和ad数模转换那边的adnum,以及显示函数的num 有啥联系吗?我的理解是我拧动电位器开始数模转换,然后变化的数字量实时显示到数码管,就是后面的ad_num=get_ad();这句我转不过来弯

使用特权

评论回复
5
DT天若有情|  楼主 | 2017-7-12 23:08 | 只看该作者
fengfeng的恒 发表于 2017-7-12 11:45
1.是函数定义,函数体定义时,参数没写表示void,即uchar get_ad()    相当uchar get_ad(void)  
2.目前这 ...

还有数模转换中的最后一句return num.是跳出此处的num,为后面的变化的数字量做准备吗。因为是自学,c语言不太懂,但是理解后,一般不会忘记

使用特权

评论回复
6
fengfeng的恒| | 2017-7-13 13:34 | 只看该作者
DT天若有情 发表于 2017-7-12 23:08
还有数模转换中的最后一句return num.是跳出此处的num,为后面的变化的数字量做准备吗。因为是自学,c语 ...

return num;就是函数结束了,返回num这个值;ad_num=get_ad();执行完这个函数然后把这个值赋值给ad_num;到下面的显示函数,把这个值传进去。
建议你先好好复习一下C语言中的函数这一章,看懂这章你就不会有疑问了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

23

帖子

0

粉丝