找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 616|回复: 4
收起左侧

[榨干芯片性能]STC15F104E/W 8脚单片机 MD5算法移植+软串口发送源程序

  [复制链接]
npn 发表于 2020-7-12 10:16 | 显示全部楼层 |阅读模式
本帖最后由 npn 于 2020-7-23 22:43 编辑

STC15F104E/STC15F104W 单片机芯片,字符串写入EEPROM的第1个扇区 (限511字节,最后1字节为空字符0)。
由于该型号芯片的RAM容量有限,使用EEPROM的第2个扇区扩展RAM空间。
晶振频率:11.0592Mhz 波特率:9600,如有问题请在楼下跟帖回复。
(2020-07-23) V1.1 删改部分函数变量,优化RAM占用。
EEPROM.png
计算结果V1.1.png

单片机源程序如下:

  1. #include "stc15f104e.h"
  2. #include "intrins.h"
  3. #define ReverseIntBytes(l) l<<24|l>>24|(l&0xFF0000)>>8|(l&0xFF00)<<8;
  4. #define XchgVar(A,B) A=A^B;B=A^B;A=A^B;
  5. #define U8 unsigned char
  6. #define U16 unsigned int
  7. #define U32 unsigned long
  8. U8 code  *eeprom = 0x1000;
  9. U32 code *eeprom32 = 0x1000;
  10. U32 code ti[]={
  11.         0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,
  12.         0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,
  13.         0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,
  14.         0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,
  15.         0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
  16.         0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,
  17.         0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,
  18.         0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,
  19.         0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,
  20.         0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,
  21.         0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,
  22.         0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,
  23.         0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391
  24.         };

  25. U8 code ss[4][4]={
  26.         {7,12,17,22},{5,9,14,20},{4,11,16,23},{6,10,15,21}
  27. };

  28. union md5_key {
  29.         U32 l[4];
  30.         U8 c[16];
  31. };

  32. union udata {
  33.         U32 l;
  34.         U8 c[4];
  35. };

  36. union udata2 {
  37.         U32 l[2];
  38.         U8 c[8];
  39. };

  40.         sbit txd = P3^1;
  41.         void delay_uart(){
  42.             U8 data a,b;
  43.             for(b=3;b>0;b--)
  44.                 for(a=94;a>0;a--);
  45.         }

  46.         void txd_data(U8 i) {
  47.                 U8 j = 1;
  48.                 delay_uart();
  49.                 txd = 0;
  50.                 do {
  51.                         delay_uart();
  52.                         txd = i & j;
  53.                         j <<= 1;
  54.                 } while (j);
  55.                 delay_uart();
  56.                 txd = 1;
  57.         }

  58.         void send_text(U8 *text){
  59.                 for(;*text;text++){
  60.                         txd_data(*text);
  61.             }
  62.         }

  63. void eeprom_open(){
  64.         IAP_CONTR = 0x83;
  65.         IAP_CMD = 0;
  66.         IAP_ADDRH        = 0x00;
  67.         IAP_ADDRL        = 0x00;
  68. }

  69. void eeprom_close(){
  70.         IAP_CONTR = 0;
  71.         IAP_CMD = 0;
  72.         IAP_TRIG = 0;
  73.         IAP_ADDRH = 0;
  74.         IAP_ADDRL = 0;
  75. }

  76. void eeprom_write(U16 addr,U8 dat){
  77.         IAP_CONTR = 0x83;
  78.         IAP_CMD = 2;
  79.         IAP_ADDRL = addr;
  80.         IAP_ADDRH = addr >> 8;
  81.         IAP_DATA = dat;
  82.         IAP_TRIG = 0x5a;
  83.         IAP_TRIG = 0xa5;
  84.         _nop_();_nop_();_nop_();
  85. }

  86. void eeprom_erase(U16 addr){
  87.     IAP_CONTR = 0x83;
  88.     IAP_CMD = 3;
  89.     IAP_ADDRL = addr;
  90.     IAP_ADDRH = addr >> 8;
  91.     IAP_TRIG = 0x5a;
  92.     IAP_TRIG = 0xa5;
  93.     _nop_(); _nop_();_nop_();
  94. }

  95. U8 block = 0;

  96. void witre_md5_data(U8 address,U8 byte){
  97.         eeprom_write(0x200|((block<<6)|address),byte);
  98. }

  99. U8* md5(U8 *i){
  100.         union md5_key md5_key;
  101.         union udata2 md;
  102.         U32 A,B,C,D,g;
  103.         U16 z,pc=0,len=0,gn;
  104.         U8 a,c,r,m;
  105.         bit f,s128=0;
  106.         md5_key.l[0] = 0x67452301;
  107.         md5_key.l[1] = 0xefcdab89;   
  108.         md5_key.l[2] = 0x98badcfe;
  109.         md5_key.l[3] = 0x10325476;
  110.         for(;*i;i++) len++;
  111.         gn=((len+8)>>6)+1;
  112.         i -= len;
  113.                 for(z=1;z<=gn;z++){
  114.                         for(c = 0;c < (z == gn ? 56 : 64); c++){
  115.                         f = pc >= len;
  116.                         a = pc & 63 ^ 3;
  117.                         if(f && !s128){
  118.                                  s128=1;
  119.                                 witre_md5_data(a,128);
  120.                         } else {
  121.                                 witre_md5_data(a,f ? 0 : *i++);
  122.                         }
  123.                         pc++;
  124.                 }
  125.         if(z == gn) {
  126.                 md.l[0]=len;md.l[1]=0;
  127.                 for(a=0;a<3;a++){
  128.                         f = 0;
  129.                         for(c=0;c<8;c++){
  130.                                 m=md.c[c^3];
  131.                                 r= m<<1|f;
  132.                                 f= m>>7;
  133.                                 md.c[c^3]=r;
  134.                         }
  135.                 }
  136.                 for(c=0;c<8;c++){
  137.                         witre_md5_data(56|c,md.c[c]);
  138.                 }
  139.         }

  140.         A=md5_key.l[0];B=md5_key.l[1];
  141.         C=md5_key.l[2];D=md5_key.l[3];
  142.         for(a=0;a<64;a++){
  143.                 switch(a>>4){
  144.                         case 0:{g=(B&C)|((~B)&D);c=a;break;}
  145.                         case 1:{g=(D&B)|((~D)&C);c=5*a+1;break;}
  146.                         case 2:{g=B^C^D;c=3*a+5;break;}
  147.                         case 3:{g=C^(B|(~D));c=7*a;break;}
  148.                 }

  149.         A=B+_lrol_(A+g + eeprom32[0x80 | (block << 4) | (c & 15)] + ti[a],ss[a>>4][a&3]);
  150.         XchgVar(A, D); XchgVar(B, D); XchgVar(C, D);
  151.         }
  152.                 if(++block > 7){
  153.                         eeprom_erase(0x200);
  154.                         block = 0;
  155.                 }

  156.         md5_key.l[0]+=A;md5_key.l[1]+=B;
  157.         md5_key.l[2]+=C;md5_key.l[3]+=D;
  158.                 }

  159.                 for(c=0;c<4;c++){
  160.                         md5_key.l[c]=ReverseIntBytes(md5_key.l[c]);
  161.                 }
  162.         return md5_key.c;
  163. }

  164. void main(){
  165. U8 z;
  166. U8* md5_answer;
  167. eeprom_open();
  168. eeprom_erase(0x200);
  169. send_text("STC15F104E MD5 V1.1\r\n");
  170. send_text("md5(\"");
  171. send_text(eeprom);
  172. send_text("\")=");
  173. md5_answer = md5(eeprom);
  174. for (z = 0; z < 16; z++) {
  175.         txd_data(((md5_answer[z] >> 4) < 10 ? 48 : 87) + (md5_answer[z] >> 4));
  176.         txd_data(((md5_answer[z] & 15) < 10 ? 48 : 87) + (md5_answer[z] & 0xF));
  177. }

  178. send_text("\r\n");
  179. eeprom_close();
  180. while (1) {
  181.         WDT_CONTR = 0x37;
  182. }


  183. }

复制代码

51hei.png
所有资料51hei提供下载:

MD5-STC15F104E V1.1.zip (13.15 KB, 下载次数: 9)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

51hei团团 发表于 2020-7-12 16:43 | 显示全部楼层
这个牛逼啊,单片机居然能干这么高端的事情
回复

使用道具 举报

BG6BXN 发表于 2020-7-13 15:45 | 显示全部楼层
正在找STC15F104E/W 软串口发送源程序,谢谢了!
回复

使用道具 举报

szb314 发表于 2020-7-24 15:32 | 显示全部楼层
EEPROM 当RAM用会不会很慢
回复

使用道具 举报

 楼主| npn 发表于 2020-7-24 22:47 | 显示全部楼层
szb314 发表于 2020-7-24 15:32
EEPROM 当RAM用会不会很慢

添加IO口赋值语句,然后用逻辑分析仪测量即可。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表