⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 430单片机的部分源代码
💻 C
字号:
#include "myinclude.h"#define DATA_ACK 0x01#define DATA_noACK 0x00char s_softreset(void);char s_read_statusreg(unsigned int *p_value);void start_cale(void);	//开始加热void stop_cale(void);	//停止加热void init_wdt(void);	//初始化定时器float com_dp(float t0,float r0);void main(void){  unsigned int tem = 0x0000;  unsigned int rh  = 0x0000;  float rh_linear = 0.0;  float rh_true = 0.0;  float tem_true = 0.0;  float dp = 0.0;    init();  while(1)  {    tem = read_t();    rh  = read_rh();    rh_linear = (0.0405 * (float)rh) + ((-2.8 * 0.000001) * rh * rh) - 4;    tem_true  = (0.01 * (float)tem) - 39.64;    rh_true   = ((float)tem_true - 25.0) * (0.01 + (0.00008 * (float)rh)) + rh_linear;    dp = com_dp(tem_true,rh_true);//    tem = (int)(dp * 100);//    rh = (int)(rh_linear * 100);//    tem = (int)(tem_true * 100);    _BIS_SR(CPUOFF);                    // Enter LPM0  }}/*名称:读取温度                     *//*输入:无                           *//*返回:温度值,数据是int型,温度是  *//*      从传感器读回来的值,未做处理 */int read_t(void){  unsigned int ret_t = 0x0000;  unsigned char temp0 = 0x00;  unsigned char temp1 = 0x00;  unsigned int i;  sck_start();  send_data(MEA_T);  P2DIR &= ~DATA;  temp0 = P2IN & DATA;  for(i=0;i<0xFFF0;i++)  {    if(temp0!=DATA)    {      i = 0xFFFF;      break;    }  }  temp0 = read_su(DATA_ACK);  temp1 = read_su(DATA_ACK);  ret_t = (((unsigned int)(temp0 & 0x3F)) << 0x08) | ((unsigned int)temp1);      return ret_t;}/*名称:读取湿度                    *//*输入:无                          *//*返回:湿度值,数据是int型,湿度是 *//*      从传感器读回来的值,未做处理*/int read_rh(void){  unsigned int ret_rh = 0x0000;  unsigned char temp0 = 0x00;  unsigned char temp1 = 0x00;  unsigned int i;    sck_start();  send_data(MEA_RH);  P2DIR &= ~DATA;  temp0 = P2IN & DATA;  for(i=0;i<0xFFF0;i++)  {    if(temp0!=DATA)    {      i = 0xFFFF;      break;    }  }  temp0 = read_su(DATA_ACK);  temp1 = read_su(DATA_ACK);  ret_rh = (((unsigned int)(temp0 & 0x0F)) << 0x08) | ((unsigned int)temp1);      return ret_rh;}/*名称:sck信号线启动             *//*输入:无                        *//*返回:无                        *//*功能:在传感器信号复位后再此通讯*//*      前要发送的信号            */void sck_start(void){  P2OUT |= DATA_H;  P2OUT &= SCK_L;  P2DIR |= SCK | DATA;  P2OUT |= SCK_H;  P2OUT &= DATA_L;  P2OUT &= SCK_L;  P2OUT |= SCK_H;  P2OUT |= DATA_H;  P2OUT &= SCK_L;}/*名称:发送数据                   *//*输入:要发送的数据,数据是uchar型*//*返回:是否成功,成功为1,不成功为*//*      0 ,char型返回             *//*功能:向传感器发送数据,包括对传 *//*      感器操作的命令             */char send_data(unsigned char com){  unsigned char i;  unsigned char error = 0x00;  P2OUT &= SCK_L;  P2DIR |= SCK | DATA;  for(i=0;i<8;i++)  {    if((com & BIT7)==BIT7)    {      P2OUT |= DATA_H;    }    else    {      P2OUT &= DATA_L;    }    com = com << 0x01;    P2OUT |= SCK_H;    P2OUT &= SCK_L;  }  P2OUT |= DATA_H;  P2OUT |= SCK_H;    P2DIR &= ~DATA;  error = P2IN & DATA;  P2OUT &= SCK_L;    return error;}/*名称:读取传感器数据       *//*输入:输入ACK信号,是否启  *//*      用crc校验,ACK是bit  *//*      信号,但输入是char型 *//*返回:从传感器中读取的数据 *//*      数据类型是uchar      *//*功能:从传感器读取回来的值 */unsigned char read_su(unsigned char ack){  unsigned char temp = 0x00;  unsigned char i;  P2OUT &= SCK_L;  P2OUT |= DATA_H;  P2DIR |= SCK | DATA;  P2DIR &= ~DATA;  for(i=0;i<8;i++)  {    P2OUT |= SCK_H;    temp = temp << 0x01;    temp |= P2IN & DATA;    P2OUT &= SCK_L;  }  P2OUT &= ~DATA_ACK;  P2OUT |= SCK_H;  P2DIR |= DATA | SCK;  P2OUT &= SCK_L;  P2OUT |= DATA_H;    return temp;}/*名称:传感器信号线复位 *//*输入:无               *//*返回:无               *//*功能:对传感器信号进行 *//*      复位             */void reset_su(void){  unsigned char j;    P2OUT |= DATA_H;  P2OUT &= SCK_L;  P2DIR |= DATA | SCK;  for(j=0;j<10;j++)  {    P2OUT |= SCK_H;    P2OUT &= SCK_L;  }  sck_start();}/*名称:开始加热函数           *//*输入:无                     *//*返回:无                     *//*功能:使用传感器内部加热功能 *//*      开始加热               */void start_cale(void){  unsigned char temp = 0x00;    send_data(RD_RAM);  temp = read_su(DATA_ACK);  temp |= CALE_BIT;  send_data(WR_RAM);  send_data(temp);}/*名称:停止加热函数           *//*输入:无                     *//*返回:无                     *//*功能:使用传感器内部加热功能 *//*      停止加热               */void stop_cale(void){  unsigned char temp = 0x00;    send_data(RD_RAM);  temp = read_su(DATA_ACK);  temp &= ~CALE_BIT;  send_data(WR_RAM);  send_data(temp);}/*名称:露点计算函数           *//*输入:温度,湿度,都是浮点型 *//*返回:露点值,浮点型         */float com_dp(float t0,float r0){  double logew = 0.0;  double dp0 = 0.0;    logew = 0.66077 + (7.5 * (double)t0 /(237.3 + (double)t0)) + log10((double)r0) - 2;  dp0   = (0.66077 - logew) * 237.3 / (logew - 8.16077);    return (float)dp0;}/*名称:传感器初始化 *//*输入:无           *//*返回:无           *//*功能:对传感器进行 *//*      初始化       */void init_su(void){  reset_su();  send_data(WR_RAM);  send_data(0x00);}/*名称:初始化定时器       *//*输入:无                 *//*返回:无                 *//*功能:对定时器进行初始化 */void init_wdt(void){//  WDTCTL = 0X00;  WDTCTL = WDT_ADLY_250 | WDTTMSEL;               // Set Watchdog Timer to exactly 250ms  IE1 |= WDTIE;                         // Enable WDT interrupt  _EINT();                              // Enable interrupts}/*名称:初始化       *//*输入:无           *//*返回:无           *//*功能:cpu上电初始化*/void init(void){  init_wdt();  init_su();}/*名称:软件复位传感器  *//*输入:无              *//*返回:是否复位成功,  *//*      成功是1,不成功 *//*      是0,是char型   *//* 2007年03月22日新增加 */char s_softreset(void){  unsigned char error = 0x00;    reset_su();  error += send_data(RESET);    return error;}/*名称:读传感器内部寄存器函数 *//*输入:存储读回来的传感器内部 *//*      的寄存器的值           *//*返回:是否读取成功,成功是1,*//*      不成功是0,是char型    */char s_read_statusreg(unsigned int *p_value){  unsigned char error = 0x00;    sck_start();  error = send_data(RD_RAM);  *p_value = (unsigned int)(read_su(DATA_ACK));  *p_value = ((*p_value) << 0x08) & 0xF0;  *p_value |= (unsigned int)(read_su(DATA_ACK));     return error;}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){  _NOP();  _BIC_SR_IRQ(CPUOFF);                // Clear CPUOFF bit from 0(SR)}/*名称:延时函数     *//*输入:延时的周期数 *//*返回:无           */void dele(unsigned int dddd){  unsigned int dele_n;  for(dele_n=0x0000;dele_n>=dddd;dele_n++)  {    reset_su();    _NOP();  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -