天堂草原最受欢迎的角色,天堂动漫,天堂在线,色天堂下载,天堂中文在线资源,亚洲男人天堂

技術(shù)熱線: 4007-888-234
設(shè)計(jì)開發(fā)

專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

開發(fā)工具

提供開發(fā)工具、應(yīng)用測(cè)試 完善的開發(fā)代碼案例庫(kù)分享

技術(shù)支持

從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產(chǎn)品競(jìng)爭(zhēng)力

新聞中心

提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動(dòng)態(tài)

QLdsPIC3]CAN總線[C30+dsPIC30F6014A]

更新時(shí)間: 2019-03-23
閱讀量:3310

深圳市英銳恩科技有限公司:臺(tái)灣麥肯單片機(jī)(Micon MDT單片機(jī))亞太地區(qū)A級(jí)代理商

QLdsPIC3]CAN總線[C30+dsPIC30F6014A]
//實(shí)驗(yàn)?zāi)康模篊AN總線接收+LCD1602顯示
//軟件規(guī)劃:
//          1。通過CAN總線接收另一主機(jī)發(fā)送過來的溫度采集數(shù)據(jù)
//          2。接收到的數(shù)據(jù)轉(zhuǎn)換后送1602LCD顯示。
//          3。CAN模塊采用模塊C1,11位標(biāo)識(shí)符的標(biāo)準(zhǔn)數(shù)據(jù)偵
//硬件規(guī)劃:
//          1。撥瑪開關(guān)S7全置ON
//          2。跳線J18全部接通
//          3。LCD1602插到座子上
//          4。接通CAN總線線纜

#include             //dsPIC30F6014標(biāo)準(zhǔn)頭文件
  _FOSC(0x0ffe5);                 //4倍頻晶振,F(xiàn)ailsafe 時(shí)鐘關(guān)閉
  _FWDT(WDT_OFF);                 //關(guān)閉看門狗定時(shí)器
  _FBORPOR(PBOR_OFF & MCLR_EN);   //掉電復(fù)位禁止,MCLR復(fù)位使能。
  _FGS(CODE_PROT_OFF);            //代碼保護(hù)禁止


#define rs LATBbits.LATB4          //定義LCD控制位(注意這里只能用LATB寄存器,不能直接用PORTB寄存器)
#define rw LATBbits.LATB5
#define e  LATBbits.LATB6
                      
unsigned char __attribute__((address(0x904))) TZ;    //轉(zhuǎn)換后的溫度值整數(shù)部分
unsigned char __attribute__((address(0x906))) TX;    //轉(zhuǎn)換后的溫度值小數(shù)部分
unsigned int  __attribute__((address(0x908))) wd;    //轉(zhuǎn)換后的溫度值BCD碼形式
unsigned char __attribute__((address(0x9a0))) loop;  //LCD顯示次數(shù)計(jì)數(shù)器

unsigned int buffer1;                                 //定義CAN接收緩沖單元  
unsigned int buffer2;
unsigned int buffer3;
unsigned int buffer4;
unsigned char __attribute__((address(0x930))) result[8]={0,0,0,'.',0,0,0,0};
unsigned long int i = 0;

//********************CAN模塊初始化函數(shù)*************************
void initcan()
{
    C1CTRLbits.REQOP = 0x4; /進(jìn)入配置模式
    while (C1CTRLbits.OPMODE!=0x4){}  //確認(rèn)進(jìn)入配置模式
    C1TX0CON = 0x0003;      //發(fā)送0郵箱配置,高優(yōu)先級(jí)
    C1TX0SID = 0x0020;      //發(fā)送0標(biāo)準(zhǔn)標(biāo)識(shí)符,11位
    C1TX0DLC = 0x01c0;      //發(fā)送0數(shù)據(jù)長(zhǎng)度,8字節(jié)
    C1RX0CON = 0x0000;      //接收0郵箱配置
    C1RX0DLC = 0x0008;      //接收0數(shù)據(jù)長(zhǎng)度,8字節(jié)
    C1RXF0SID = 0x0020;     //接收濾波器0標(biāo)準(zhǔn)標(biāo)識(shí)符,11位
    C1RXM0SID = 0xffff;     //接收屏蔽0標(biāo)準(zhǔn)標(biāo)識(shí)符
    C1CFG1bits.SJW=0;     //SJW=1 x TQ
    C1CFG1bits.BRP = 9;     //125K    
    C1CFG2 = 0x03Ac;        //SEG2PH=5;SEG1PH=6;PRSEG=4

    C1CTRLbits.REQOP = 0x0; /進(jìn)入正常模式
    while (C1CTRLbits.OPMODE!=0x0){}  //確認(rèn)進(jìn)入正常模式
 return;


//****************延時(shí)函數(shù)**************************************
//延時(shí)函數(shù)(延時(shí)時(shí)間為(2+x)us)
void delay(  char x)
{
   unsigned char i;
   for(i=0;i<x;i++);
}

//*****************寫一個(gè)字節(jié)數(shù)據(jù)函數(shù)***************************
//在電平發(fā)生改變后需要插入一段延時(shí)時(shí)間,否則LCD反應(yīng)不過來。
void write(unsigned char x)
 {
  PORTD=x;                   //待顯示數(shù)據(jù)送PORTD口
  delay(98);                  
  rs=1;                      //該字節(jié)數(shù)據(jù)為數(shù)據(jù),而不是命令
  delay(98);
  rw=0;                      //此次操作為寫,而不是讀
  delay(98);
  e=0;                       //拉低使能信號(hào)
  delay(98);                   //保持使能信號(hào)為低一段時(shí)間
  e=1;                       //拉高使能信號(hào),建立LCD操作所需要的上升沿
  delay(98);
 }

//******************LCD顯示設(shè)置函數(shù)*****************************
//在電平發(fā)生改變后需要插入一段延時(shí)時(shí)間,否則LCD反應(yīng)不過來。
void lcd_enable()
 {
   delay(98);
   rs=0;                     //該字節(jié)數(shù)據(jù)為命令,而不是數(shù)據(jù)
   delay(98);
   rw=0;                     //此次操作為寫,而不是讀
   delay(98);
   e=0;                      //拉低使能信號(hào)
   delay(98);                  //保持使能信號(hào)為低一段時(shí)間
   e=1;                      //拉高使能信號(hào),建立LCD操作所需要的上升沿
   delay(98);
}

//******************系統(tǒng)初始化函數(shù)******************************
void init()
{
  TRISF=0X0000;                                 //先設(shè)置18B20口方向?yàn)檩敵?br/>  TRISB=0X0000;                                 //設(shè)置B口方向?yàn)檩敵?br/>  TRISD=0X0000;                                 //設(shè)置D口方向?yàn)檩敵?br/>  IFS0bits.T1IF=0;                              //先清除定時(shí)器中斷標(biāo)志位
  PR1=0XFFFF;                                   //周期定最大
  T1CON=0X0020;                                 //分頻比為1:64
  INTCON1=0x0000; 
  INTCON2=0x0000;    //關(guān)閉所有中斷  
}

//*******************LCD初始化函數(shù)*******************************
void lcd_init()
 {
    PORTD=0X1;                 //清除顯示
    lcd_enable();
    PORTD=0X38;                //8位2行5*7點(diǎn)陣
    lcd_enable();
    PORTD=0X0e;                //顯示開,光標(biāo)開,閃爍
    lcd_enable();
    PORTD=0X06;                //文字不動(dòng),光標(biāo)右移
    lcd_enable();
 }
 
//*********************LCD顯示函數(shù)*******************************
void display()
 { 
    PORTD=0X84;                //顯示首地址
    lcd_enable();
    for(loop=0;loop<8;loop++)  //共顯示8位
      {
        write(result[loop]);   //查表并送顯示
        delay(100);            //插入一定延時(shí)
      }
 }

//******************啟動(dòng)溫度轉(zhuǎn)換函數(shù)*****************************
void get_temp()
{
int i;
result[0]=(TZ/100)+0x30;                 //整數(shù)百位
result[1]=((TZ%100)/10)+0X30;            //整數(shù)十位 
result[2]=((TZ%100)%10)+0X30;            //整數(shù)部分個(gè)位          
wd=0; 
if (TX & 0x80) wd=wd+5000;
if (TX & 0x40) wd=wd+2500;
if (TX & 0x20) wd=wd+1250;
if (TX & 0x10) wd=wd+625;                //以上4條指令把小數(shù)部分轉(zhuǎn)換為BCD碼形式            
result[4]=(wd/1000)+0x30;                //十分位
result[5]=((wd%1000)/100)+0x30;          //百分位
result[6]=((wd%100)/10)+0x30;            //千分位
result[7]=(wd%10)+0x30;                  //萬(wàn)分位
}

//**********************主函數(shù)***********************************
int main()
{
    init();                              //調(diào)用系統(tǒng)初始化函數(shù)
    lcd_init();                          //LCD初始化函數(shù)
    initcan();                           //調(diào)用CAN初始化函數(shù)
     buffer1=buffer2=buffer3=buffer4=0;
 while(1)
 {   
      while(C1RX0CONbits.RXFUL==0);     //等待接收到數(shù)據(jù)
   buffer1 = C1RX0B1;          //讀取接收到的數(shù)據(jù)
         buffer2 = C1RX0B2;
         buffer3 = C1RX0B3;
         buffer4 = C1RX0B4;
            C1RX0CONbits.RXFUL = 0;
         TZ=buffer1;                
            TX=buffer2;
            get_temp();                 //調(diào)用溫度轉(zhuǎn)換函數(shù)
            display();                  //調(diào)用結(jié)果顯示函數(shù)
 }
}


联系我们: 梧州市| 庆元县| 措美县| 延长县| 新蔡县| 宁蒗| 兰考县| 措美县| 尚义县| 定陶县| 卫辉市| 六枝特区| 夏邑县| 沿河| 新营市| 隆化县| 曲松县| 香格里拉县| 玉门市| 玉门市| 崇明县| 胶南市| 阳信县| 聂拉木县| 德州市| 南澳县| 朝阳县| 青川县| 赞皇县| 铜川市| 孝义市| 东源县| 财经| 洞头县| 博客| 揭东县| 中阳县| 嘉定区| 贡觉县| 上杭县| 土默特右旗|