[51单片机]

毕业季回眸——不老的传奇_C8051快速单片机

[复制链接]
3192|28
手机看帖
扫描二维码
随时随地手机跟帖
zhanzr21|  楼主 | 2017-7-8 00:44 | 显示全部楼层 |阅读模式
毕业很多年了, 今天看到这贴子本不想提旧事, 不过本人特点就是爱怀旧, 所以经不住手贱了还是来水一贴!

我上大学那会, 用的单片机最多就是C8051了, 注意不是80C51, 而是C8051, 就是SiLabs的产品, 虽然那时该公司已经改名为SiLabs了(好像是收购,记不清了,很早事情了), 但是我们还是跟随老习惯叫了好一阵子的Cygnal单片机. Cygnal这标志现在网上都找不到了, 成为了历史. 不过翻开SiLabs公司的库文件还是看得到历史的遗迹:
;-----------------------------------------------------------------------------
;        Copyright (C) 2000 <b><font color="Red">CYGNAL </font></b>INTEGRATED PRODUCTS, INC.
;         All rights reserved.
;
;
;         FILE NAME          : C8051F000.INC
;         TARGET MCU        : C8051F0xx (C8051 System Controller)
;         DESCRIPTION        : Register/bit definitions for the C8051F000 product family.  
;
;         REVISION 1.8        
;
;-----------------------------------------------------------------------------
;REGISTER DEFINITIONS
C8051是一种快速单片机, 当年搞课外制作, 参加什么竞赛都用这单片机.

它的最大特点就是基于8051的内核, 也就是指令集与8051兼容, 但是做成了单周期执行, 要知道经典51单片机都是12个时钟周期一个指令周期阿, 这样一下子就在同等速度下提速了12倍! 记得那时候还用过100MHz的8051, 内部PLL倍频的! 但型号已经忘记了,多年不关注这块, 现在也不知道进化到什么地步了.
cip51_ore.png
当然这单片机不只在速度上有提升, 外设什么的都很暴强, 即使当时的配置拿到今天来说, 也是比较厉害的单片机了.

相关帖子

zhanzr21|  楼主 | 2017-7-8 00:49 | 显示全部楼层
因为这单片机一个指令周期就是一个时钟周期, 还有几条老8051的三周期的指令被优化成2周期了, 导致一个问题:

就是用Keil C51仿真时, 周期计算不准确, 虽然不是什么大事情, 软件仿真单片机根本不可能准确的嘛

但是我当时比较书呆子, 觉得不爽, 跟Keil公司发了一封邮件询问此事,

Keil公司的人跟我也回了邮件, 说是Sorry, 我们现在确实有不能精确仿真C8051单片机的情况, 但是我们不提倡用软件仿真单片机内核, 还是用板子做实验吧

呵呵, 所以这事时隔多年还**犹新, 我还既得是几条跳转指令, 包括cjnz还是djnz还是sjnz来着, 因为多年不用8051,也**不精确了, 不想去查询, 保持**原貌!

使用特权

评论回复
评论
巧克力娃娃 2017-7-10 16:47 回复TA
lz较真的精神原来由来已久,,,哈哈哈 
评分
参与人数 1威望 +15 收起 理由
巧克力娃娃 + 15
zhanzr21|  楼主 | 2017-7-8 00:55 | 显示全部楼层
刚开始搞这个, 不喜欢C语言, 怎么呢, 总觉得汇编语言好阿, 能精确控制处理器的状态, 当时周围的同学都是禧欢搞C语言编程, 就我一个非主流, 天天搞汇编语言编程.

当时记得搞了很多汇编语言的库函数, 想着以后要用的, 其实都是重新走CLib的老路, 费心费力写的那么多汇编语言的函数库也没派上用场.

记得写了一个32位除16位的除法函数, 就是一个个的移位成8位进行计算, 当时觉得这8051的ALU真烦人, 要是有32bit的ALU和寄存器多好

可惜到了32位的时代, 我早就不用一个个的这么写程序了, 虽然说老实话觉得汇编语言还是好, 但是呢项目进度不饶人, 等不得我一个个的去慢慢磨了

当时我的电脑太破, 不能用GUI的IDE来, 只能自己搞命令行, 还记得大致是这样的界面陪伴了我很多个夜晚:
sample3.gif

使用特权

评论回复
zhanzr21|  楼主 | 2017-7-8 01:01 | 显示全部楼层
慢慢的接近毕业时, 我当然最终慢慢接受了C语言与GUI来开发程序, 当然我电脑也换新的了.
用的开发环境当然是Keil C51的IDE.

C8051的单片机除了速度快之外, 加了很多的外设, 比如USB, SPI, 内置ADC, 内置DAC等等, 中断的优先级别也增加了好多. 其实满方便的
c8051f32x.png

使用特权

评论回复
zhanzr21|  楼主 | 2017-7-8 01:09 | 显示全部楼层
现在还在做8051内核单片机的大概还有这几家

1.当然还是Silabs的C8051系列
2.国内的STC等等
3.某些特殊单片机, 比如TI的有BLE接口的CC2541, 有Sub-G无线接口的CC1111
4.照顾老同志的行业, 比如汽车行业的XC800
5.台湾的几家,如MegaWin

对了,记得Atmel也出过不少的51, 但是后来Atmel专注自己的AVR了. 也不知道现在还有没有Atmel的8051了.

除此之外, 就不清楚了, 毕竟我也不用51多年了

当初开发8051程序, 写的多的当然属流水灯, 数码管, LCD显示, 按键扫描, 无线红外控制, 电机PWM驱动

还记得Keil专为8051做了个操作系统: RTX-Tiny, 后来这操作系统过渡到Cortex M上了, 我用过, 不错

当时流行uCOS的时候,我也试着在C8051上移植过,但是内存不够,基本上免强移了, 就没法跑应用了.


使用特权

评论回复
评分
参与人数 1威望 +15 收起 理由
巧克力娃娃 + 15
zhanzr21|  楼主 | 2017-7-8 01:17 | 显示全部楼层
总结一下子, 我认为8051的缺陷有如下几点:

1. CISC结构, 对编译器优化是个挑战
2. 只能64KB的程序空间与XDATA空间, 如果超过要搞Banking, 是个麻烦
3. SFR, data, idata, xdata, code几大访问空间, 写起复杂的程序为变量的位置伤神
4. 老架构性能不行, 创新的架构如C8051这样的, 因为开发成本的问题, 价格比其他架构如Cortex M没有性价比

但是为啥还有这么多厂商在做8051以及8051的改进版本呢, 我认为原因如下:
1. 还是有很多老同志需要照顾
2. 8051这内核用过很多年, 研究的比较透, 可能有些人认为它稳定吧
3. 教材更新不及时, 单片机的教材可能是以8051最多
4. 原来开发了很多软件,用8051写的, 用个改进版本的8051来升级, 总比重新写一套开发成本低

使用特权

评论回复
评论
hp34401a 2017-11-18 20:18 回复TA
欢迎探讨~~~~ 
zhanzr21|  楼主 | 2017-7-8 01:22 | 显示全部楼层
青山遮不住, 毕竟东流去!
8051这个系列, 就算有改进版本续命, 其下坡路是不可避免的.
但是它也是单片机的历史上最重要的一环, 最早得到普及,广泛使用的单片机应该就是它了.

写着写着, 有一种做一块8051的开发板子或者买一块这样的板子重温旧事的冲动,
但我最怀念的还是那些跟我一起做8051实验的伙伴们, 有些人因为各种原因早已不在这行业了,
但是他们还记得当年一起熬夜搞电机驱动, 搞红外遥控, 以及跟我争论C语言合适还是汇编合适的青葱岁月吗?

我想还是记得的吧!

使用特权

评论回复
zhanzr21|  楼主 | 2017-7-8 01:35 | 显示全部楼层
修改一个Keil的例子程序来收尾,
HelloWorld是不是你们编写的第一个程序?

第一个汇编语言, 主程序, 输出HelloWorld
NAME         SAMPLE

EXTRN         CODE         (PUT_CRLF, PUTSTRING)
PUBLIC  TXTBIT

PROG        SEGMENT        CODE
CONST        SEGMENT        CODE
VAR1        SEGMENT        DATA
BITVAR        SEGMENT        BIT
STACK        SEGMENT        IDATA

        RSEG  STACK
        DS    10H  ; 16 Bytes Stack

        CSEG  AT   0
        USING        0  ; Register-Bank 0
; Execution starts at address 0 on power-up.
        JMP   START

        RSEG  PROG
; first set Stack Pointer
START:        MOV   SP,#STACK-1

; Initialize serial interface
; Using TIMER 1 to Generate Baud Rates
; Oscillator frequency = 11.059 MHz
        MOV   TMOD,#00100000B                ;C/T = 0, Mode = 2
        MOV   TH1,#0FDH
        SETB  TR1
        MOV   SCON,#01010010B

; clear TXTBIT to read form CODE-Memory
        CLR   TXTBIT

; This is the main program. It is a loop,
; which displays the a text on the console.
REPEAT:       
; type message
        MOV   DPTR,#TXT
        CALL  PUTSTRING
        CALL  PUT_CRLF
; repeat
        SJMP  REPEAT
;
        RSEG  CONST
TXT:         DB    'Hello World!',00H

; only for demonstration
        RSEG  VAR1
DUMMY:        DS    21H

; TXTBIT = 0 read text from CODE  Memory
; TXTBIT = 1 read text from XDATA Memory
        RSEG  BITVAR
TXTBIT:        DBIT  1

        END


第二个文件,串口IO
NAME         CHAR_IO
;
PUBLIC        PUTCHAR

CHAR_ROUTINES  SEGMENT  CODE
VAR2           SEGMENT  DATA

        RSEG  CHAR_ROUTINES

; This routine outputs a single character to console.
; The character is given in A.
PUTCHAR:
           JNB  TI,$
           CLR  TI
           MOV  SBUF,A
           RET


; only for demonstration
        RSEG  VAR2
DUMMY:        DS    40H


        END


第三个文件, String IO
NAME         STRING_IO
;
EXTRN        BIT    (TXTBIT)
EXTRN        CODE   (PUTCHAR)
PUBLIC        PUT_CRLF, PUTSTRING

STRING_ROUTINES  SEGMENT  CODE

        RSEG  STRING_ROUTINES
; This routine outputs a CR and a LF
CR equ  0DH                ; carriage return
LF equ  0AH                ; line feed

PUT_CRLF:
        MOV   A,#CR
        CALL  PUTCHAR
        MOV   A,#LF
        CALL  PUTCHAR
        RET

; Routine outputs a null-terminated string whose
; address is given in DPTR. The string can be
; located in CODE or XDATA memory depending on
; the value of TXTBIT.

PUTSTRING:
; check TXTBIT
           JB    TXTBIT,PS1
        CLR   A
        MOVC  A,@A+DPTR
        SJMP  PS2
PS1:    MOVX  A,@DPTR
PS2:    JZ    EXIT
        CALL  PUTCHAR
        INC   DPTR
        SJMP  PUTSTRING
EXIT:   RET

        END

使用特权

评论回复
zhanzr21|  楼主 | 2017-7-8 01:38 | 显示全部楼层
编译命令行批处理文件, 注意要设置环境变量再运行
ax51  asample1.a51 debug xref
ax51  asample2.a51 debug xref
ax51  asample3.a51 debug xref
lx51  asample1.obj,asample2.obj,asample3.obj to helloworld segments (var1) ixref
ohx51 helloworld

生成helloworld.hex烧写进入我想象中的C8051开发板子, 接上串口, 要那种老的232的插头, 插在主板后面, 不要USB的!
Hello World!

怀旧结束, 回到现在的生活, 还要搞Cortex M4的DSP算法呢.

使用特权

评论回复
infofans| | 2017-7-8 09:04 | 显示全部楼层
要不是看你的帖子,估计我还是分不清楚80c51和c8051 ^_^

使用特权

评论回复
autopccopy| | 2017-7-8 19:09 | 显示全部楼层
顶一下LZ。我大学时是92年学习单片机的,学校的教学板是INTEL 的8031,学的是51汇编! 毕业是与同学搭档混过去的,我对它一点都不懂。
2007年重新学单片机,用的是当时流行的ATMEL AT89C51, 但很快被TOP2007编程器的反向“引导”下,使用可以串口ISP下载的STC单片机,一直到现在。。。

使用特权

评论回复
zhangxiyi5277| | 2017-7-9 00:02 | 显示全部楼层
前阵子测试一个软件解码程序,在stm8上跑的非常稳定了,不想动其他的只想提速,提到15k我那代码就不行了,想起stc15xxx的,角落里找到个破板,算好。烧录为33M跑,,哇40k完美稳定。

使用特权

评论回复
大秦正声| | 2017-7-9 07:34 | 显示全部楼层
不错,cypress cy7c68013也是51核

使用特权

评论回复
大秦正声| | 2017-7-9 07:37 | 显示全部楼层
x86,51,dsp,arm,安卓 java app

使用特权

评论回复
大秦正声| | 2017-7-9 11:12 | 显示全部楼层
51可以修理所有多核cpu,dsp,arm芯片

使用特权

评论回复
大秦正声| | 2017-7-9 11:13 | 显示全部楼层
包括fpga

使用特权

评论回复
huarana| | 2017-7-10 09:28 | 显示全部楼层
ADI也有很多51核的mcu ,而且非常贵

使用特权

评论回复
linqing171| | 2017-7-10 10:15 | 显示全部楼层
8051的内核占的面积还是比ARM的要小不少(同样工艺情况下)。 不过如果RAM和flash大,内核在MCU内的比例太小,意义也不大了。
随着ARM只剩3美分的单只提成,没有了初始授权费,后面小公司做的基于8051的SOC慢慢也会少了。

使用特权

评论回复
dingxuandi| | 2017-11-18 17:22 | 显示全部楼层
找你买东西可以吗?

使用特权

评论回复
hp34401a| | 2017-11-18 20:20 | 显示全部楼层
用过C8051F020, 330,强大外设多,但价格也贵,而且稳定性不足。。。

使用特权

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

本版积分规则

个人签名:每天都進步

91

主题

1005

帖子

34

粉丝