痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 11268|回復: 30

[問題求助] 89S51與89C1051 程式問題

  [複製鏈接]
發表於 2013-4-8 12:20:28 | 顯示全部樓層 |閱讀模式
小弟我想請問一下,89S51和89C1051 程式與法相同嗎?
查datasheet後發現.89S51有4組I/O (P0~P3)  89C1051只有2組(P1和P3)
如果我程式只用到P1和P3,那89S51的C檔案是否可以直接編譯89C1051的hex,並燒錄?
還是說語法語宣告方式都不一樣?
發表於 2013-4-8 13:29:20 | 顯示全部樓層
參考DATASHEET:

AT89S51:
Features
• Compatible with MCS®
-51 Products
• 4K Bytes of In-System Programmable (ISP) Flash Memory
– Endurance: 10,000 Write/Erase Cycles
• 4.0V to 5.5V Operating Range
• Fully Static Operation: 0 Hz to 33 MHz
• Three-level Program Memory Lock
• 128 x 8-bit Internal RAM
• 32 Programmable I/O Lines
• Two 16-bit Timer/Counters
• Six Interrupt Sources
• Full Duplex UART Serial Channel
• Low-power Idle and Power-down Modes
• Interrupt Recovery from Power-down Mode
• Watchdog Timer
• Dual Data Pointer
• Power-off Flag
• Fast Programming Time
• Flexible ISP Programming (Byte and Page Mode)
• Green (Pb/Halide-free) Packaging Option

AT89C1051:
Features
• Compatible with MCS-51 Products
• 1 Kbyte of Reprogrammable Flash Memory
Endurance: 1,000 Write/Erase Cycles
• 2.7 V to 6 V Operating Range
• Fully Static Operation: 0 Hz to 24 MHz
• Two-Level Program Memory Lock
• 64 bytes SRAM
• 15 Programmable I/O Lines
• One 16-Bit Timer/Counter
• Three Interrupt Sources
• Direct LED Drive Outputs
• On-Chip Analog Comparator
• Low Power Idle and Power Down Modes

一顆有4K_ROM,
一顆有1K_ROM,
RAM的大小也不同,

可能的話,還是要重看一下程序,並改寫後再試試吧!
如果只是控制一個LED燈的話,
可能可以直接代用!
 樓主| 發表於 2013-4-8 13:56:38 | 顯示全部樓層
fatzeros 發表於 2013-4-8 01:29 PM static/image/common/back.gif
參考DATASHEET:

AT89S51:


我的程式非常小,不到1K.
程式內部也沒用到中斷或是其他特殊功能
我適用C語言寫
類似控制LED這樣,應該可以正常執行,
但很奇怪,在89S51上成功,重新編程成89C1051後,卻不能.

PS:我有單獨寫過控制89C1051 的單支pin腳HI 或 LOW,亦不行.
不曉得是不是宣告錯誤.

論壇上有人有範例程式可藉參考嗎?

謝謝.
發表於 2013-4-8 14:06:23 | 顯示全部樓層
cools0607 發表於 2013-4-8 01:56 PM static/image/common/back.gif
我的程式非常小,不到1K.
程式內部也沒用到中斷或是其他特殊功能
我適用C語言寫

P1.0及P1.1當一般I/O時,需外接提升電阻(內為OPA比較器,不可浮接).
 樓主| 發表於 2013-4-8 14:13:44 | 顯示全部樓層
ciko.ciko 發表於 2013-4-8 02:06 PM static/image/common/back.gif
P1.0及P1.1當一般I/O時,需外接提升電阻(內為OPA比較器,不可浮接).

我知道,所以我沒用到P1.0和1.1
我是用pin3.7去做測試,一樣不行
發表於 2013-4-8 14:16:41 | 顯示全部樓層
cools0607 發表於 2013-4-8 02:13 PM static/image/common/back.gif
我知道,所以我沒用到P1.0和1.1
我是用pin3.7去做測試,一樣不行

只是單純控制P3.7的功能也不行嗎?
 樓主| 發表於 2013-4-8 14:20:57 | 顯示全部樓層
ciko.ciko 發表於 2013-4-8 02:16 PM static/image/common/back.gif
只是單純控制P3.7的功能也不行嗎?

不行...
所以我才好奇難道89C1051和89S51語法不同

PS:我人現在在外面,晚點回家把程式碼補上來請大家debug.

發表於 2013-4-8 14:34:02 | 顯示全部樓層
cools0607 發表於 2013-4-8 02:20 PM static/image/common/back.gif
不行...
所以我才好奇難道89C1051和89S51語法不同

要不先試試2051?
發表於 2013-4-8 14:47:19 | 顯示全部樓層
4,5腳clock及第1腳reset,電源腳等配線再檢查一下.
 樓主| 發表於 2013-4-8 15:47:45 | 顯示全部樓層
ciko.ciko 發表於 2013-4-8 02:47 PM static/image/common/back.gif
4,5腳clock及第1腳reset,電源腳等配線再檢查一下.

都有檢查過了
發表於 2013-4-8 16:36:15 | 顯示全部樓層
cools0607 發表於 2013-4-8 03:47 PM static/image/common/back.gif
都有檢查過了

我個人想法:
會不會是差在這個地方:

AT89S51:• 128 x 8-bit Internal RAM
AT89C1051:• 64 bytes SRAM

我記得沒錯的話,C語言好像對於記憶體的使用,沒有組語那樣精細,
再要不然,就是要找到AT89C1051的HEAD檔試試!
 樓主| 發表於 2013-4-8 23:56:00 | 顯示全部樓層
下面是我的程式碼 (燒錄後,實際量測89C1051的P3.7確量不到跳變)
-------------------------------------------------------------------------------------
#include <REGX51.h>
void DelayX1ms(unsigned int);
main()                                                                             
{
       
        while(1)
        {
    P3_7=1;
    DelayX1ms(500);       
    P3_7=0;
    DelayX1ms(500);               
}
}       
void DelayX1ms(unsigned int count)        
{
        unsigned int i,j;
        for(i=0;i<count;i++)
                for(j=0;j<114;j++);
}

-------------------------------------------------------------------------------------
 樓主| 發表於 2013-4-8 23:58:33 | 顯示全部樓層
fatzeros 發表於 2013-4-8 04:36 PM static/image/common/back.gif
我個人想法:
會不會是差在這個地方:

我就是不知道AT89C1051的標頭檔該怎麼定義,才想上來問問看有沒有人寫過,或是可以提供範例程式

至於語言部分,本來想用組語寫,但因為程式內容和邏輯,用C比較好呈現,才會用C語言去撰寫.

謝謝您
發表於 2013-4-9 01:01:12 | 顯示全部樓層
cools0607 發表於 2013-4-8 11:56 PM static/image/common/back.gif
下面是我的程式碼 (燒錄後,實際量測89C1051的P3.7確量不到跳變)
-------------------------------------- ...

要不要試試用這個 Header?

AT89c1051.rar (1.5 KB, 下載次數: 17)
 樓主| 發表於 2013-4-9 01:22:20 | 顯示全部樓層
robotai 發表於 2013-4-9 01:01 AM static/image/common/back.gif
要不要試試用這個 Header?

小弟可冒昧問一下.
你的這個.H檔,動作內容為?
發表於 2013-4-9 09:58:29 | 顯示全部樓層
只是從網路上找到有人定義的Header而已。

不過看了下AT89C1051規格書上,P3好像有一個"Alternate Output Function"控制,不知道是不是需要另外設定?P1好像就沒有,要不要試一下用P1會不會輸出?
發表於 2013-4-9 11:31:17 | 顯示全部樓層
cools0607 發表於 2013-4-8 03:47 PM static/image/common/back.gif
都有檢查過了

是接線沒錯.....還是有確定起振???  示波器確認...

該不會完全沒起振吧...
 樓主| 發表於 2013-4-9 11:38:04 | 顯示全部樓層
imcrazy 發表於 2013-4-9 11:31 AM static/image/common/back.gif
是接線沒錯.....還是有確定起振???  示波器確認...

該不會完全沒起振吧...

確定有起振....因為89S51可以動作,代表起振是沒壞的
 樓主| 發表於 2013-4-9 11:39:15 | 顯示全部樓層
robotai 發表於 2013-4-9 09:58 AM static/image/common/back.gif
只是從網路上找到有人定義的Header而已。

不過看了下AT89C1051規格書上,P3好像有一個"Alternate Output F ...

我試過,若是把P1整個(P1.2~P1.7)一起動作是可以(有跳變)
但若要單獨控制P1.2或P1.7這種 就不行...
發表於 2013-4-9 12:00:59 | 顯示全部樓層
基本上在KEIL里是有分8051和1051的
試著把REGX51.H換成REG1051.H,或者到
C:\Keil816A\C51\INC\Atmel\REG1051.H
就能看到8051和1051差在那里了,主要還是P3.6的遮罩不用
剩下的應是沒差太多,若對C有疑慮時,即然能寫組語,就一小段而已
也是能看出是程式還是硬體的問題
發表於 2013-4-9 15:37:51 | 顯示全部樓層
很有可能是stack的問題,
S51 RAM 128 Byte,1051 RAM 64 Byte,
stack指標應該設不一樣.....
發表於 2013-4-9 18:42:16 | 顯示全部樓層
我都使用這個頭文字!! 我沒用過 89C1051 但是我使用過 89C2051 沒有問題!!
還有 89S51可以起震,不見得 89C1051就會起震!! 因為有可能 這個MCU掛了!!
以前有一個經驗就是 89S52不會動作,但是 STC89C52RC 卻會動作!!很奇怪吧!!後來發現 晶振有一端電容沒接,STC 的MCU會動作 ATMEL 就不會動作...


/*--------------------------------------------------------------------------
REG52.H

Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __REG52_H__
#define __REG52_H__

/*  BYTE Registers  */
sfr P0    = 0x80;
sfr P1    = 0x90;
sfr P2    = 0xA0;
sfr P3    = 0xB0;
sfr P4    = 0xE8;//stc89le51rc only
sfr PSW   = 0xD0;
sfr ACC   = 0xE0;
sfr B     = 0xF0;
sfr SP    = 0x81;
sfr DPL   = 0x82;
sfr DPH   = 0x83;
sfr PCON  = 0x87;
sfr TCON  = 0x88;
sfr TMOD  = 0x89;
sfr TL0   = 0x8A;
sfr TL1   = 0x8B;
sfr TH0   = 0x8C;
sfr TH1   = 0x8D;
sfr IE    = 0xA8;
sfr IP    = 0xB8;
sfr SCON  = 0x98;
sfr SBUF  = 0x99;
sfr WDT_CONTR = 0xe1;//看門狗設定 stc89c52 only

/*  8052 Extensions  */
sfr T2CON  = 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2    = 0xCC;
sfr TH2    = 0xCD;
sfr XICON  = 0xC0;  //stc89le51rc only

/*  BIT Registers  */
/*  PSW  */
sbit CY    = PSW^7;
sbit AC    = PSW^6;
sbit F0    = PSW^5;
sbit RS1   = PSW^4;
sbit RS0   = PSW^3;
sbit OV    = PSW^2;
sbit P     = PSW^0; //8052 only

/*  TCON  */
sbit TF1   = TCON^7;
sbit TR1   = TCON^6;
sbit TF0   = TCON^5;
sbit TR0   = TCON^4;
sbit IE1   = TCON^3;
sbit IT1   = TCON^2;
sbit IE0   = TCON^1;
sbit IT0   = TCON^0;

/*  IE  */
sbit EA    = IE^7;
sbit ET2   = IE^5; //8052 only
sbit ES    = IE^4;
sbit ET1   = IE^3;
sbit EX1   = IE^2;
sbit ET0   = IE^1;
sbit EX0   = IE^0;
//sbit EX2   = IE^6;
sbit EX2   = XICON^2;//stc89le51rc only
sbit IT2   = XICON^0;//stc89le51rc only

/*  IP  */
sbit PT2   = IP^5;
sbit PS    = IP^4;
sbit PT1   = IP^3;
sbit PX1   = IP^2;
sbit PT0   = IP^1;
sbit PX0   = IP^0;

/*  P3  */
sbit RD    = P3^7;
sbit WR    = P3^6;
sbit T1    = P3^5;
sbit T0    = P3^4;
sbit INT1  = P3^3;
sbit INT0  = P3^2;
sbit TXD   = P3^1;
sbit RXD   = P3^0;

sbit INT2  = P4^3;

/*  SCON  */
sbit SM0   = SCON^7;
sbit SM1   = SCON^6;
sbit SM2   = SCON^5;
sbit REN   = SCON^4;
sbit TB8   = SCON^3;
sbit RB8   = SCON^2;
sbit TI    = SCON^1;
sbit RI    = SCON^0;

/*  P1  */
sbit T2EX  = P1^1; // 8052 only
sbit T2    = P1^0; // 8052 only
//sbit
            
/*  T2CON  */
sbit TF2    = T2CON^7;
sbit EXF2   = T2CON^6;
sbit RCLK   = T2CON^5;
sbit TCLK   = T2CON^4;
sbit EXEN2  = T2CON^3;
sbit TR2    = T2CON^2;
sbit C_T2   = T2CON^1;
sbit CP_RL2 = T2CON^0;

#endif
發表於 2013-4-9 21:09:39 | 顯示全部樓層
cools0607 發表於 2013-4-9 11:39 AM static/image/common/back.gif
我試過,若是把P1整個(P1.2~P1.7)一起動作是可以(有跳變)
但若要單獨控制P1.2或P1.7這種 就不行... ...

是指每一bit分開設定(P1_2, _1_3, ...)但全部設定就可以,還是用P1=0xFF才可以?
會不會是外圍電路有問題?
 樓主| 發表於 2013-4-10 00:50:11 | 顯示全部樓層
本帖最後由 cools0607 於 2013-4-10 12:54 AM 編輯
legion 發表於 2013-4-9 12:00 PM static/image/common/back.gif
基本上在KEIL里是有分8051和1051的
試著把REGX51.H換成REG1051.H,或者到
C:\Keil816A\C51\INC\Atmel\REG105 ...


我試過三種宣告都不行
1.#include <REGX51.h>
2.#include <AT89X051.H>
3.#include <REG1051.h>

至於組語部分,能單獨控制P1的每一bit,問題是P3卻不能控制.
 樓主| 發表於 2013-4-10 00:51:52 | 顯示全部樓層
ysc 發表於 2013-4-9 03:37 PM static/image/common/back.gif
很有可能是stack的問題,
S51 RAM 128 Byte,1051 RAM 64 Byte,
stack指標應該設不一樣..... ...

我是用KEIL C 寫的, 並且compiler
所以這堆疊指標應該不是問題...
 樓主| 發表於 2013-4-10 00:53:02 | 顯示全部樓層
本帖最後由 cools0607 於 2013-4-10 12:55 AM 編輯
antlu 發表於 2013-4-9 06:42 PM static/image/common/back.gif
我都使用這個頭文字!! 我沒用過 89C1051 但是我使用過 89C2051 沒有問題!!
還有 89S51可以起震,不見得 89C1 ...


硬體沒問題,也確定一定有起震
至於MCU也沒掛(交叉測試過),應該是宣告或程式問題
 樓主| 發表於 2013-4-10 00:54:15 | 顯示全部樓層
robotai 發表於 2013-4-9 09:09 PM static/image/common/back.gif
是指每一bit分開設定(P1_2, _1_3, ...)但全部設定就可以,還是用P1=0xFF才可以?
會不會是外圍電路有問題 ...

對於P1可以全部控制
但卻不能每一bit分開設定

對於P3"不"可全部控制
也不可對每一bit分開設定
 樓主| 發表於 2013-4-14 13:46:25 | 顯示全部樓層
問題解決了,是我自己搞烏龍,用keil C 選到89C1051U,但我詳細看晶片後,發現是AT89C1051.
至於宣告部分  1.#include <REGX51.h>   2.#include <AT891051.H>  這兩種經過我測試後,均可使用.
謝謝大家的回覆.   
發表於 2013-4-14 15:57:24 | 顯示全部樓層
cools0607 發表於 2013-4-14 01:46 PM static/image/common/back.gif
問題解決了,是我自己搞烏龍,用keil C 選到89C1051U,但我詳細看晶片後,發現是AT89C1051.
至於宣告部分  1.#i ...

C大好,選用錯誤的型號燒錄時,燒錄器未提示錯誤訊息?(signature byte內容不同,燒錄器應會先偵錯.)
 樓主| 發表於 2013-4-14 17:59:13 | 顯示全部樓層
ciko.ciko 發表於 2013-4-14 03:57 PM static/image/common/back.gif
C大好,選用錯誤的型號燒錄時,燒錄器未提示錯誤訊息?(signature byte內容不同,燒錄器應會先偵錯.) ...

我也很納悶,我燒錄機既然不會自動除錯和偵測晶片  我是用G540.  不過我倒是覺得他不錯用
順道提醒大家,如果要用AT89C1051 要用註冊版(快樂版)的keil c 因為免費版從2K開始寫,而89C1051只有1K程式記憶體.

也謝謝C大您撥空了解與回覆
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-11-21 09:29 PM , Processed in 0.438378 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.