打印

(转)PSOC3 的UART模组使用实例

[复制链接]
2869|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangjinlili|  楼主 | 2014-8-31 15:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天的博客内容是在上一讲的基础上利用PSOC3的UART模组将LM92采集回来的温度上传给上位机,并在上位机上显示,上位机是本人好久以前用VB6.0写的4路温度采集系统,今天主要讲PSOC3的UART模组使用,上位机只是一个工具,所以今天只用它作为一个测试工具而已,工作界面如图1:
        本来系统可以采集4路温度,但今天只有一个温度点我们将其地址与一号点的地址对应,上位机每隔0.5秒发送一个地址码,4个地址轮询,每发出一个地址码,等待0.5秒接收数据,然后发送下一个地址码。对每一个工作点而言,轮询一次需要2秒。
     打开上一讲的程序,在上一讲的程序上修改得到今天的程序,先在原理图界面放置一个UART模组,放置方法与IIC模组一样,如图2:
双击打开UART模组,配置如图3:
配置时要注意采用何种通讯模式,波特率、数据位等通信协议必须与目标设备一直,否则通讯无法建立,这里设置波特率为:9600,数据位为8位,无校验,1个停止位,选择全双工通讯模式。
打开程序窗口,在程序中添加有关UART的程序,时间有限,不在单独列出,全部上传。
沙发
wangjinlili|  楼主 | 2014-8-31 15:10 | 只看该作者
/* ========================================
*
* 程序名称: PSOC3与LM92之间的数据通讯
* 功能描述: 用PSOC3通过I2C总线实现温度采集并显示在1602液晶显示器上
* 使用模块;  I2C主机模块
* 作    者: 万选明
* 完成时间: 2011年3月28日
* 备    注:    无
* ========================================
*/
#include
/*以下是用到的函数声明*/
float Tempture(uint8 slaveAddr);                           //函数声明
void UpdateDisplay (float voltageRawCount,uint16 Channel); //显示函数
void Delay(uint16 Time);                                   //延时函数
void UART_TX_float(float data1);

#define  LM92_Addr  (0x48u)                                //定义LM82从机地址
float Temp = 0.0;                                          //存温度变量
void main()
{
uint8 Data = 0;
    CYGlobalIntEnable;
  I2C_1_Start();                                        //I2C总线启动开始
  LCD_Char_1_Start();                                   //1602启动开始
UART_1_Start();
    LCD_Char_1_Position(0,0);
/*移动光标到(0,0)处 */
    LCD_Char_1_PrintString("Tempture: ");                 /*显示Tempture: */
UART_1_ClearRxBuffer();
//  UART_1_EnableRxInt();
// UART_1_EnableRxInt();
// UART_1_SetRxInterruptMode(UART_RX_STS_FIFO_NOTEMPTY) ;

    for(;;)
    {

  

//{
     Temp = Tempture(LM92_Addr);                           /* 读取温度值 */
  UpdateDisplay (Temp,1);                               /*显示温度数据 */
     Delay(500);                                           /*延时 */
if ( UART_1_ReadRxData()== 0x48)    //是本机地址,发送温度数据
{
     UART_TX_float(Temp);                 //发送温度数据
}

// }
    }
}
/* ========================================
*
* 函数名称:float Tempture(uint8 slaveAddr)
* 功能描述:从从机中读取数字温度值并转换成实际温度
* 参    数; slaveAddr--从机地址
* 返    回:TEMP -- 实际温度值
* 完成时间:2011年3月28日
* 备    注:    无
* ========================================*/
float Tempture(uint8 slaveAddr)
{
uint8 Status;
int Data[4];
float TEMP;
I2C_1_MasterClearStatus();                                            //清除I2C状态数据
Status =I2C_1_MasterSendStart(slaveAddr, I2C_1_READ_XFER_MODE);      //发送读数据命令
if(Status == I2C_1_MSTR_NO_ERROR)                                    /* 判断状态 */
{
/* 读回温度数据 */
Data[0] = I2C_1_MasterReadByte(I2C_1_ACK_DATA);                   //读取温度数据高8位
Data[1] = I2C_1_MasterReadByte(I2C_1_ACK_DATA);                   //读取温度数据低8位
Data[2] = I2C_1_MasterReadByte(I2C_1_NAK_DATA);                   //温度读完读NCK信号
}
I2C_1_MasterSendStop();                                          /* 发送停止 */
Data[3] = (Data[0] <<8)| (Data[1] & 0x00ff)  ;                   //温度数据合并
Data[3] >>= 3 ;                                                  //温度从中高12位,为转换方便移到第十二位
if (Data[3] & 0x1000)        // 是负数
{
  Data[3] &= 0x0fff;               
  Data[3] = ~Data[3] + 1;    // 补码运算
  TEMP = -0.0625 * Data[3];   // 求出温度值
}
else
{
  TEMP = 0.0625 * Data[3];           
}

return (TEMP);

}
/* ========================================
*
* 函数名称:void UpdateDisplay (float voltageRawCount,uint16 Channel)
* 功能描述:显示数据
* 参    数; Data--显示的数据
* 返    回:无
* 完成时间:2011年3月28日
* 备    注:    无
* ========================================*/
void UpdateDisplay (float Data,uint16 Channel)
{
    int Integer,Decimal;        /*定义两个变量分别存整数部分和小数部分*/
Integer = (int) Data;
Decimal = (int) ((Data - Integer)*1000)+1;   /*分别取出小数部分和小数部分,保留3位小数*1000,两位*100*/
    LCD_Char_1_Position(0,9); /* 移动光标到(0,9) */
    LCD_Char_1_PrintNumber(Integer); /* 输出整数部分 */
    LCD_Char_1_PrintString(".");        /* 输出小数点*/
LCD_Char_1_PrintNumber(Decimal);   /*输出小数部分*/
LCD_Char_1_Position(1,0);
LCD_Char_1_PrintString("Channel: ");
LCD_Char_1_PrintNumber(Channel);

}
/* [] END OF FILE */
/* ========================================
*
* 函数名称:void Delay(int8 Time)
* 功能描述:延时
* 参    数; time--yan时时间
* 返    回:无
* 完成时间:2011年3月27日
* 备    注:    无
* ========================================*/
void Delay(uint16 Time)
{
     int i=0,j=0 ;
  for(j=0;j
  {
  for (i=0;i<1000;i++);
  }

}


//****************************************************************************
//函数名:UART_TX_float(float data)
//功能:通过串口发送浮点数
//参数: data;要发送的浮点数
//返回: 无
//****************************************************************************
void UART_TX_float(float data1)
{
int High_data,Low_data,Mid_data;
Mid_data =(int)(data1*100);           //取小数点后两位数字上传
Low_data = Mid_data & 0x00ff;
High_data = (Mid_data & 0xff00)>>8;
UART_1_WriteTxData(0x48);         //回送本机地址
UART_1_WriteTxData(High_data);  //发送温度数据的高8位数据 UART_1_WriteTxData(Low_data);  //发送温度数据的低8位数据

}
当然,这个程序最好用中断的方式来实现,但由于时间关系,我没有测试,感兴趣的朋友可以测试后,把你的代码与我共享,在此声明,本程序仅是用来学习,与实际工程还有很大差异,有很多BUG,下位机的现象与上讲一样,在此不在重述。

使用特权

评论回复
板凳
justbybing| | 2014-8-31 23:00 | 只看该作者
不错不错

使用特权

评论回复
地板
someonewho| | 2014-8-31 23:01 | 只看该作者
写的很详细

使用特权

评论回复
5
waitingf| | 2014-8-31 23:06 | 只看该作者
上位机做的很专业

使用特权

评论回复
6
u880| | 2014-9-3 08:14 | 只看该作者
楼主的分享很不错的说

使用特权

评论回复
7
huigoushang| | 2014-9-3 08:20 | 只看该作者
代码收藏了啊

使用特权

评论回复
8
G21372| | 2014-9-3 08:23 | 只看该作者
上位机是自己做的吗

使用特权

评论回复
9
yangguangaisha| | 2014-9-3 08:28 | 只看该作者
程序要了啊 多谢楼主了

使用特权

评论回复
10
gexingyouxian| | 2014-9-3 08:31 | 只看该作者
LZ自己做的吗

使用特权

评论回复
11
acer4736| | 2014-9-3 08:35 | 只看该作者
程序写的不错呢

使用特权

评论回复
12
lyl_420819| | 2015-8-1 09:59 | 只看该作者
程序要了啊 多谢楼主

使用特权

评论回复
13
ZLIT1| | 2015-11-26 19:48 | 只看该作者

使用特权

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

本版积分规则

78

主题

1374

帖子

0

粉丝