目前遇到一个问题,我的大程序不加串口是可以ad采集并液晶显示的,现在把串口部分加到大程序里,发现无法把ad采集的数据发送给串口。我的串口程序是可以的,在大程序里while(1)里,单独测试过,如单独发send(3)是收到3的,如果发送Send(date_tab[0]);就不行,串口助手没有任何数据,哪个大佬答疑解惑,非常感谢!
下面附上adc.c、uart.c和main.c程序,求大佬指导一二。
#include<reg51.h>
#include<intrins.h>
#include<string.h>
#include "delay.h"
#include "lcd.h"
#include "adc.h"
#include "key.h"
#include "display.h"
#include "uart.h"
uchar data date_tab[8];
uint flag=0;//按键标志位
uint TestDisMode=0;
uint PresValue=0;
void main()
{
uart_init();//串口初始化
TH0=(65536-1000)/256; //1ms初值
TL0=(65536-1000)%256;
ET0=1;
//TR0=1;//初始化时关闭T0,等按下开始再启动T0
TR0=0;//初始化T0停止
EA=1;//开总中断
lcd_init();
display_start();
delay_ms(10);
while(1)
{
keyscan();
if(TestDisMode==1)
{
TR0=1;//按下开始键后T0开启
Volt_pressure_display();
if(enable=1)//如果上位机按下开始采集,则发送0x01给下位机
{
Send(date_tab[4]);//发送压力千位
Send(date_tab[5]);//发送压力百位
Send(date_tab[6]);//发送压力十位
Send(date_tab[7]);//发送压力个位
}
if(enable==0)//如果没有收到01,则关闭ad采集,不发送数据
{
TR0=0;
}
}
else
{
TR0=0;
}
}
}
void timer0() interrupt 1
{
uchar t0;//t0控制pwm信号时间变量
uchar t1;//t1控制采样频率时间变量
TH0=(65536-1000)/256; //1ms初值
TL0=(65536-1000)%256;
t0++;
t1++;
if(t1==100) //采样频率是100ms
{
t1=0;
Volt_collect();
}
}
#include<reg51.h>
#include<intrins.h>
#include<string.h>
#include "uart.h"
/*************串口初始化函数*******************************/
void uart_init(void)
{
TMOD=0x21; //定计0工作方式1,定计1工作方式2
TH1=0XFD; //定计1赋初值
TL1=0XFD;
SCON=0X50; //串口控制寄存器:SM0=0,SM1=1,REN=1
TR1=1; //开定计器1
EA=1; //开总中断
ES=1; //开串口中断
}
/*************串口中断服务子程序*******************************/
void uart_Interrupt() interrupt 4
{
if(RI==1)
{
RI=0;
if(SBUF == 0x01)//下位机收到01,则开始采集
{
enable = 1;
}
if(SBUF == 0x02)//下位机收到02,则停止采集
{
enable = 0;
}
}
}
/*************************串口字符发送函数********************************/
void Send(uint dat)
{
SBUF=(dat)+ 48; // 发送 千 位
while(!TI);
TI=0;
}
#include<reg51.h>
#include<intrins.h>
#include<string.h>
#include "adc.h"
#include "display.h"
uint recieve_volt;
extern uchar data date_tab[8];
extern uint PresValue;
/*******************************************************************/
/* */
/* 启动AD转换子程序 */
/*******************************************************************/
void start_ad(void)
{ cs=0; //允许进行A/D转换
wr=0;_nop_();wr=1; //WR由低变高时,AD开始转换
//while(intr); //查询转换结束产生INTR 信号(低电平有效)
cs=1; //停止AD转换
}
/*******************************************************************/
/* */
/* 读A/D数据子程序 */
/*******************************************************************/
unsigned int read_ad()
{ uint ad_data;
ad0_7=0xff;
cs=0; //允许读
rd=0; //读取转换数据结果数据结果
_nop_();
ad_data=ad0_7; //把数据存到ad_data中
rd=1;cs=1; //停止A/D读取
return(ad_data);
}
/*******************************************************************/
/* */
/*电压采集子程序 */
/*******************************************************************/
void Volt_collect()
{
start_ad();
recieve_volt=read_ad();
recieve_volt=recieve_volt*196;
date_tab[0] =recieve_volt/10000; //整数
date_tab[1]=recieve_volt%10000/1000; // 十分位
date_tab[2]=recieve_volt%1000/100; // 百分位
date_tab[3]=recieve_volt%100/10; //千分位
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
void Send(uint dat)
{
SBUF=(dat)+ 48;
这里不太明白,或许去掉dat的括号试试。
另外按你说的单独发send(3)是收到3的,好像也不对,SBUF=(dat)+ 48; 所以发送3,应该收到3+48=51才对
恩,是的,我是按下开始键,下位机开始采集数据并显示,此时如果上位机发采集命令,则开始通过串口发数据。send函数应该是对的吧,我测试程序试过。
+48是刚好发字符3,对应ascii码是51
一周热门 更多>