找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3077|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

中微單片機(jī)CMS89F11x想整一個(gè)點(diǎn)亮燈的小程序,編譯就報(bào)錯(cuò) 附用戶手冊(cè)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:656213 發(fā)表于 2021-12-3 19:49 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
中微單片機(jī),型號(hào):CMS89F111 SOP-8,想整一個(gè)點(diǎn)亮燈的小程序,居然一直整不好,求助各位老師們能指點(diǎn)一下。 我看規(guī)格書里面講,可以進(jìn)行位操作,寫了一句,P0.2 =1; 但是編譯就報(bào)錯(cuò)。


#include "cms.h"

typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;

void main()
{        
        P0CL = 00100000;            //配置IO狀態(tài), P0.2口設(shè)置為推挽輸出
        while(1)
        {        
                P0.2 = 1;
        }               
}

SCH.png (66.45 KB, 下載次數(shù): 166)

SCH.png

1.png (63.48 KB, 下載次數(shù): 165)

1.png

CMS89F11x用戶手冊(cè)_V1.5.pdf

3.07 MB, 下載次數(shù): 14

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:624769 發(fā)表于 2021-12-3 23:36 | 只看該作者
既然,你選擇用  CMS IDE, 而不用KEIL  你就要尊重 CMS IDE 的語(yǔ)法。

P0.2 = 1   在CMS IDE 中是非法的。

在CMS IDE 中。你只能寫:    P0 |= 0x04;

而且就算你用 KEIL 也只能用 P0_2 = 1
回復(fù)

使用道具 舉報(bào)

板凳
ID:624769 發(fā)表于 2021-12-3 23:44 | 只看該作者

既然,你選擇用  CMS IDE, 而不用KEIL  你就要尊重 CMS IDE 的語(yǔ)法。

P0.2 = 1   在CMS IDE 中是非法的。

在CMS IDE 中。你只能寫:    P0 |= 0x04;

而且就算你用 KEIL 也只能用 P0_2 = 1


對(duì)了,另外,你的 P0CL 的寫法也是錯(cuò)誤的,你要配置 推挽輸出,只能寫: P0CL = 0x20;
回復(fù)

使用道具 舉報(bào)

地板
ID:656213 發(fā)表于 2021-12-4 08:32 | 只看該作者
真是太感謝你了呀,可以了,我寫了個(gè)燈閃爍的程序,OK了。

#include "cms.h"

typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;

void delayms(u16 ms)
{
        u8 i;
                while(ms--)
                {
                        for(i=0;i<120;i++);
                }
}

void main()
{       
        P0CL = 0x20;            //配置IO狀態(tài), P0.2口設(shè)置為推挽輸出
        while(1)
        {       
                 P0 |= 0x04;
                 delayms(600);
                 P0 &= 0x00;
                 delayms(600);
        }               
}
回復(fù)

使用道具 舉報(bào)

5#
ID:624769 發(fā)表于 2021-12-4 13:48 | 只看該作者
jiahz2019 發(fā)表于 2021-12-4 08:32
真是太感謝你了呀,可以了,我寫了個(gè)燈閃爍的程序,OK了。

#include "cms.h"

更正一點(diǎn),
你用P0 &= 0x00; 雖然也能關(guān)閉LED, 但是他并不是拉低 P02 而是拉低整個(gè)P0, 并且不是“位操作”,你要真正拉低P02,并且是執(zhí)行 位操作的話,(雖然不知道你為何執(zhí)著為操作,為了速度?),
只能用這個(gè)代碼:

P0 &= 0xFB;

用CMS IDE 要學(xué)會(huì)隨時(shí)編譯,多觀察右側(cè)List文件, 確認(rèn)你代碼的編譯結(jié)果, 你要你的代碼是進(jìn)行位操作,就要察看,右側(cè)編譯后,是否出現(xiàn)  SETB   CLRB   SNZB  等,這些標(biāo)志著是在進(jìn)行位操作的匯編代碼,是的話說(shuō)明你用的方法對(duì),不是的話,就常嘗試修改代碼,直到達(dá)到你的目的,個(gè)人覺(jué)得,或許直接用匯編會(huì)更方便,反正他匯編指令也沒(méi)幾條。
回復(fù)

使用道具 舉報(bào)

6#
ID:656213 發(fā)表于 2021-12-4 14:37 | 只看該作者
本帖最后由 jiahz2019 于 2021-12-4 16:38 編輯

見笑了,用這個(gè)P0 &= 0x00純粹是偷懶,這里我是理解的。另外,對(duì)匯編也不熟悉呀,新手,前面只是學(xué)習(xí)了8051的C,還沒(méi)有獨(dú)立做過(guò)項(xiàng)目。 現(xiàn)在又遇到了一個(gè)問(wèn)題,想啟用按鍵來(lái)控制LED燈的閃爍,之前學(xué)8051核的時(shí)候,可以直接位操作,取反位就可以了。這里不能直接用位操作了,不知如何下手了,下面是我整的一段,仿真不對(duì),燈一直亮。 請(qǐng)?jiān)僦附桃欢?按鍵接口如上原理圖,

#include "cms.h"

typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;

void delayms(u16 ms)
{
        u8 i;
                while(ms--)
                {
                        for(i=0;i<120;i++);
                }
}

void main()
{        
        P0CL = 0x20;            //配置IO狀態(tài), P0.2口設(shè)置為推挽輸出
        P1CH = 0x00;            //配置IO狀態(tài), P1.4口設(shè)置為上拉輸入
        u8 key,temp ;
        while(1)
        {
                 temp = P1 ;                     //這個(gè)變量類型定義的好像有誤
                 if(temp & 0x10 == 0)       // 判斷按鍵是否按下
                 {
                         key++;
                         if(key >= 2)
                          {
                                key = 0;
                          }
                         if(key==0)
                                 {
                                         P0 |= 0x04;
                                         delayms(600);
                                 }
                         if(key==1)
                                 {
                                         P0 &= 0xFB;
                                         delayms(600);
                                 }

                 }
        }        
}
回復(fù)

使用道具 舉報(bào)

7#
ID:624769 發(fā)表于 2021-12-4 19:24 來(lái)自手機(jī) | 只看該作者
在外面,手機(jī)上的51黑,不方便幫你改代碼,你現(xiàn)在的代碼是,一直按著按鍵的話,燈會(huì)閃,放手燈就會(huì)亮著或者滅著一直維持這個(gè)狀態(tài),這是你設(shè)計(jì)的初衷么?
回復(fù)

使用道具 舉報(bào)

8#
ID:624769 發(fā)表于 2021-12-4 20:39 | 只看該作者
jiahz2019 發(fā)表于 2021-12-4 14:37
見笑了,用這個(gè)P0 &= 0x00純粹是偷懶,這里我是理解的。另外,對(duì)匯編也不熟悉呀,新手,前面只是學(xué)習(xí)了8051 ...

好了,上電腦了, 可以打代碼,
你這個(gè)CMS89F11X系列,不是8051核,是RISC核,所以,有些操作是不支持的,有好處,也有壞處,這也是我建議你要么干脆嘗試匯編的原因,因?yàn)橐簿?0多條指令,比起8051是少多了,你真心想學(xué)的話,看著指令表嘗試寫寫,1天也就入門了。
好了,上面純屬建議,下面:

CMS89F11X  不支持位取反操作,但是,支持字節(jié)的與或操作,所以,如果你不是執(zhí)著需要 “位操作”的話,想要LED閃爍的話,可以用 與或。
P0 ^= 0x04;     就可以翻轉(zhuǎn) P02 的電平了。
比如你之前的閃燈代碼,完全可以這樣寫:

void main()
{        
        P0CL = 0x20;            //配置IO狀態(tài), P0.2口設(shè)置為推挽輸出
        while(1)
        {        
                 P0 ^= 0x04;
                 delayms(600);
        }               
}

然后,你要檢驗(yàn) P14是否是低電平,不需要復(fù)雜的 賦值給 temp, 可以直接檢驗(yàn) P14, 如:
if((P1 & 0x10) == 0)            // 注意看,這里面的括號(hào)很重要,你就算用Temp 也需要這個(gè)括號(hào),你之前的代碼,沒(méi)有括號(hào),編譯完了是肯定不能正常工作的,恩,其他的,應(yīng)該你自己能搞定了。
回復(fù)

使用道具 舉報(bào)

9#
ID:478073 發(fā)表于 2021-12-4 20:54 | 只看該作者
建議多同那些代理的FAE多溝同,他們解決問(wèn)題干脆直接!
回復(fù)

使用道具 舉報(bào)

10#
ID:656213 發(fā)表于 2021-12-4 21:05 | 只看該作者
188610329 發(fā)表于 2021-12-4 20:39
好了,上電腦了, 可以打代碼,
你這個(gè)CMS89F11X系列,不是8051核,是RISC核,所以,有些操作是不支持 ...

呵呵,謝謝你的講解,我也剛從外面回來(lái),我上面那段程序的本意是想用按鍵控制燈的亮滅,假如上電狀態(tài)燈是滅的,那么按一下,燈亮(常亮), 再按一下,燈滅。  你剛才講的那段程序我現(xiàn)在去試下。
回復(fù)

使用道具 舉報(bào)

11#
ID:656213 發(fā)表于 2021-12-4 21:42 | 只看該作者
春風(fēng)十里吹死你 發(fā)表于 2021-12-4 20:54
建議多同那些代理的FAE多溝同,他們解決問(wèn)題干脆直接!

基礎(chǔ)的問(wèn)題,F(xiàn)AE才懶得搭理人,現(xiàn)在人家還怕沒(méi)有人買單片機(jī)嗎,
回復(fù)

使用道具 舉報(bào)

12#
ID:624769 發(fā)表于 2021-12-4 21:52 | 只看該作者
jiahz2019 發(fā)表于 2021-12-4 21:05
呵呵,謝謝你的講解,我也剛從外面回來(lái),我上面那段程序的本意是想用按鍵控制燈的亮滅,假如上電狀態(tài)燈是 ...

按你的設(shè)想,代碼如下,不需要 DELAY 函數(shù)。

unsigned char stat;

void main()
{
    P0CL  = 0x20;
    P1CH  = 0x00;
        while(1)
        {
                if((P1 & 0x10) == 0)  
                {
                        while((P1 & 0x10) == 0);  //消抖
                        stat++; //更改標(biāo)志位
                }
        if((stat & 0x01) == 1) P0 |= 0x04;
                else        P0 &= 0xFB;
        }
}
回復(fù)

使用道具 舉報(bào)

13#
ID:624769 發(fā)表于 2021-12-4 22:30 | 只看該作者
188610329 發(fā)表于 2021-12-4 21:52
按你的設(shè)想,代碼如下,不需要 DELAY 函數(shù)。

unsigned char stat;

感覺(jué)不是很簡(jiǎn)潔,又重新寫了一個(gè)不需要變量的:


void main()
{
        P0CL = 0x20;
        P1CH = 0x00;
        while(1)
        {
                while(P1 & 0x10);  //等待按鍵按下
                while(!(P1 & 0x10));  //等待按鍵彈起               
                P0 ^= 0x04;
        }
}

回復(fù)

使用道具 舉報(bào)

14#
ID:1111466 發(fā)表于 2024-2-23 21:05 | 只看該作者
想學(xué)習(xí)CMS的編程,但是網(wǎng)上找不到相關(guān)教程。相對(duì)而言51的資料真的好豐富
回復(fù)

使用道具 舉報(bào)

15#
ID:149759 發(fā)表于 2024-2-24 11:19 | 只看該作者
P0.2不對(duì)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表