《匠人手记》推荐网上购书渠道:
EDN网(ednchina)购书入口   >>>
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历

百宝专栏

  • 首页 相册 标签
  • 电脑应用(65)
  • 供需信息(22)
  • 写书近况(82)
  • 匠人文集(115)
  • 硬件技术(171)
  • 匠人公告(86)
  • 与非门专栏(545)
  • 匠人笔记(115)
  • 团队撰写(96)
  • 汽车电子(52)
  • 编程技巧(465)
  • 程序宝典(476)
  • 网络酷文(472)
  • 开发工具(19)
  • 资料宝藏(274)
  • 项目管理(11)
  • 藏经宝阁(42)
  • 趣味设计(5)
  • 社区热贴(2)
  • 比尔熊专栏(10) 
  • 百宝信息

    载入中...

    百宝流量

    (2006-07-01开始)


    匠人手记

    一些实用的单片机c程序
    程序匠人 发表于 2007-7-3 21:10:00  阅读全文 | 回复(7) | 引用通告 | 编辑

    一些实用的单片机c程序

     //16进制<->10进制互换程序


     unsigned char d[10];    //用于显示的10位显示缓存

     //========================================================
         //16进制to10进制输出子程序:显示数据,起始位,结束位,有无小数点
     //========================================================
     void output(unsigned long dd,unsigned char s,unsigned char
     e,unsigned char dip) {
         unsigned long div;
         unsigned char tm[8],i,j;
         div=10000000;
         for (i=0;i<8;i++) {
             tm[i]=dd/div;
             dd%=div;
             div/=10;
         }
         for (i=0;i<6;i++) {
             if (tm[i]!=0) break;
             tm[i]=nul;
         }
         tm[5]|=dip;            //小数点控制,请看“串行LED数码管显示驱动程序”
         j=7;
         for (i=s;i<e;i++) {
             d[i]=tm[j];
             j--;
         }
     }

     //把显示位5-9位的10进制数转换成为16进制数
     unsigned int input(void) {
         unsigned int dd,dat;
         dd=10000;dat=0;
         for (i=5;i<10;i++) {
             dat+=dd*temp;
             dd/=10;
         }
         return(dat);
     }
     /*    89C51系列CPU编程器接收CPU程序*/

     #i nclude <reg51.h>
     #i nclude <intrins.h>
     #i nclude <absacc.h>

     #define e 8
     #define p 9
     #define l 10

     sbit led=P3^2;
     sbit p27=P2^7;
     sbit p26=P2^6;
     sbit p36=P3^6;
     sbit p37=P3^7;
     sbit rst=P3^3;
     sbit ale=P3^5;
     sbit vpp=P3^4;

     bit b_break;
     unsigned int adds;


     //    13.8mS
     void int_t0(void) interrupt 1 {
         TH0=-100;
         b_break=1;
     }

     void wait(unsigned char w) {
         unsigned int t=w*184;
         b_break=0;
         TL0=-t%256-1;TH0=-t/256;
         while (b_break==0) {}
     }

     void nop(void) {
         _nop_();_nop_();_nop_();_nop_();
         _nop_();_nop_();_nop_();_nop_();
         _nop_();_nop_();_nop_();_nop_();
         _nop_();_nop_();_nop_();_nop_();
         _nop_();_nop_();_nop_();_nop_();
     }

     unsigned char command(void) {
         TH0=-100;b_break=0;
         while (RI==0) {if (b_break==1) return(0);}
         RI=0;
         return(SBUF);
     }

     void earsure(unsigned char cpu) {
         switch (cpu) {
         case 1:        //89C51
         case 2:rst=p26=1;p27=p36=p37=0;nop();vpp=1;nop();
             ale=0;wait(110);ale=1;nop();
             break;
         case 3:
         case 4:break;
         case 5:
         case 6:break;
         }
     }

     void program(unsigned char cpu) {
         unsigned int bdata adds=0;
         unsigned char d;
         switch (cpu) {
         case 1:    //89C51
         case 2:
             p36=p37=1;rst=1;
             while (1) {
                 TH0=-100;b_break=0;
                 while (RI==0) {if (b_break==1) return;}
                 RI=0;
                 d=SBUF;
                 //address
                 P0=adds%256;
                 P2=adds/256;
                 p27=1;
                 //data
                 P1=d;
                 nop();    //48clcl
                 //vpp
                 vpp=1;
                 nop();    //48clcl
                 //ale
                 ale=0;
                 wait(1);//100uS
                 ale=1;
                 nop();    //10uS
                 vpp=0;
                 nop();    //48clcl
                 p27=0;
                 nop();    //48clcl
                 P1=0xff;
                 TH0=-100;b_break=0;
                 while (d!=P1) {if (b_break==1) return;}    //data
    polling
                 SBUF=d;
                 adds++;
             }
             break;
         case 3:
         case 4:
         case 5:
         case 6:break;
         }
     }

     void lock(unsigned char cpu) {
         unsigned char i;
         switch (cpu) {
         case 1:    //89c51
         case 2:
             //lock 1
             rst=p26=p36=p27=p37=1;nop();
             vpp=1;
             nop();
             ale=0;
         //    for (i=0;i<6;i++) wait(100);
             wait(1);
             ale=1;
             nop();
             vpp=0;
             nop();
        
             //lock 2
             rst=p26=p27=1;p36=p37=0;nop();
             vpp=1;
             nop();
             ale=0;
         //    for (i=0;i<6;i++) wait(100);
             wait(1);
             ale=1;
             nop();
             vpp=0;
             nop();
            
             //lock 3
             rst=p26=p36=1;p27=p37=0;nop();
             vpp=1;
             nop();
             ale=0;
         //    for (i=0;i<6;i++) wait(100);
             wait(1);
             ale=1;
             nop();
             vpp=0;
             nop();
             break;
         case 3:
         case 4:
         case 5:
         case 6:break;
         }
     }

     void main(void) {
         unsigned char disp,flash,temp,cpu;
         EA=1;
         SCON=0xd8;PCON=0x80;
         TMOD=0x21;
         TL1=TH1=0xff;TR1=1;
         TH0=-100;ET0=TR0=1;

         flash=0x80;

     


         while (1) {
             temp=command();
             switch (temp) {
             case 0:
             case 1:        //89c51
             case 2:        //89C52
             case 3:        //80f51
             case 4:        //80F52
             case 5:        //87F51
             case 6:cpu=temp;SBUF=temp;break;//87f52
             case e:SBUF=temp;earsure(cpu);break;    //erasure
             case p:SBUF=temp;program(cpu);break;    //program
             case l:lock(cpu);SBUF=temp;break;    //lock
             default:SBUF=temp;break;
             }
             b_break=0;
             if ((++disp)>flash) {disp=0;led=!led;}
         }
     }
     //HT1380实时时钟驱动程序

     sbit clock_dat=P0^1;
     sbit clock_clk=P0^2;
     sbit clock_rst=P0^3;

     sbit a0=ACC^0;
     sbit a1=ACC^1;
     sbit a2=ACC^2;
     sbit a3=ACC^3;
     sbit a4=ACC^4;
     sbit a5=ACC^5;
     sbit a6=ACC^6;
     sbit a7=ACC^7;

     void clock_out(unsigned char dd) {
         ACC=dd;
         clock_dat=a0;clock_clk=1;clock_clk=0;
         clock_dat=a1;clock_clk=1;clock_clk=0;
         clock_dat=a2;clock_clk=1;clock_clk=0;
         clock_dat=a3;clock_clk=1;clock_clk=0;
         clock_dat=a4;clock_clk=1;clock_clk=0;
         clock_dat=a5;clock_clk=1;clock_clk=0;
         clock_dat=a6;clock_clk=1;clock_clk=0;
         clock_dat=a7;clock_clk=1;clock_clk=0;
     }
     unsigned char clock_in(void) {
         clock_dat=1;
         a0=clock_dat;
         clock_clk=1;clock_clk=0;a1=clock_dat;
         clock_clk=1;clock_clk=0;a2=clock_dat;
         clock_clk=1;clock_clk=0;a3=clock_dat;
         clock_clk=1;clock_clk=0;a4=clock_dat;
         clock_clk=1;clock_clk=0;a5=clock_dat;
         clock_clk=1;clock_clk=0;a6=clock_dat;
         clock_clk=1;clock_clk=0;a7=clock_dat;
         return(ACC);
     }
     unsigned char read_clock(unsigned char ord) {
         unsigned char dd=0;
         clock_clk=0;
         clock_rst=0;
         clock_rst=1;
         clock_out(ord);
         dd=clock_in();
         clock_rst=0;
         clock_clk=1;
         return(dd);
     }
     void write_clock(unsigned char ord,unsigned char dd) {
         clock_clk=0;
         clock_rst=0;
         clock_rst=1;
         clock_out(ord);
         clock_out(dd);
         clock_rst=0;
         clock_clk=1;
     }
     /*单个汉字库字摸提取程序,tc2.0编译*/
     #i nclude "stdio.h"
     #i nclude "dos.h"
     #i nclude "process.h"
     #i nclude "string.h"


     void main(void) {
         long int num_bytes,qm,wm;
         unsigned char d,i,j,k,a[132],b[132];
         unsigned char * data;
         unsigned char * hz;
         static unsigned  char dd[103];
         FILE *fp;

         if ((fp=fopen("hzk16f","rb"))==NULL) {
             printf("can't open hzk16\n");
             exit(1);
         }
         clrscr();
         while (1) {

             data=(unsigned char *) malloc(33);
             printf("please input:\n");
             scanf("%s",dd);    /*输入一个汉字*/

             qm=* dd;        /*通过区位码计算其在hzk16f文件中的偏移地址*/
             qm=qm-161;
             if (qm>87) exit(0);
             wm=* (dd+1);
             wm=wm-161;
             if (wm>94) exit(0);
             num_bytes=((long)qm*94+wm)*32;
             fseek(fp,num_bytes,SEEK_SET);
             fgets(data,33,fp);
             for (i=0;i<32;i++) b[i]=* data++;
             for (i=0;i<32;i+=2) a[i/2]=b[i];
             for (i=0;i<32;i+=2) a[i/2+16]=b[i+1];
             for (i=8;i<16;i++) b[i]=a[i];
             for (i=8;i<16;i++) a[i]=a[i+8];
             for (i=8;i<16;i++) a[i+8]=b[i];

             /*转换,hzf16f在电脑的储存格式是以行为字节计算的,一般的lcd都采用以列为字节计算*/
             for (k=0;k<32;k+=8) {
                 for (j=0;j<8;j++) {
                     d=0;
                     for (i=0;i<8;i++) {
                         if (a[i+k]>=0x80) {
                             switch (i) {
                             case 0:d+=1;break;
                             case 1:d+=2;break;
                             case 2:d+=4;break;
                             case 3:d+=8;break;
                             case 4:d+=0x10;break;
                             case 5:d+=0x20;break;
                             case 6:d+=0x40;break;
                             case 7:d+=0x80;break;
                             }
                         }
                     }
                     for (i=0;i<8;i++) a[i+k]<<=1;
                     b[j+k]=d;
                 }
             }
             clrscr();
             printf("/*%s:*/\n",dd);        /*输出0x00格式的16进制数*/
             for (k=0;k<32;k+=8) {
                 for (j=0;j<8;j++) printf("0x%x,",b[j+k]);
                 printf("\n");
             }
             getch();
         }
     }
     //按键扫描驱动程序

     unsigned char key,key_h,kpush;
     unsigned int key_l;

     //按键连接到p1.0、p1.1、p1.2

     void int_t0(void) interrupt 1 {
         unsigned char dd,i;
         TL0=TL0+30;TH0=0xfb;    //800
         /*    按键判别    */
         if ((P1&0x7)==0x7) {
             if ((key_l>30)&&(key_l<800)&&(key_h>30)) {       
     //释放按键,如果之前按键时间少于1秒,读入键值
                 key=kpush;
             }
             if ((++key_h)>200) key_h=200;
             key_l=0;
             if (key>=0x80) key=0;                           
     //如果之前的按键为长按1秒,清除键值
         } else {
             kpush=P1&0x7;
             key_l++;
             if ((key_l>800)&&(key_h>30)) {                   
     //如果按键超过1秒,键值加0x80标志长按键
                 key=kpush|0x80;
                 key_h=0;
                 key_l=0;
             }
         }
     }
     void main(void) {
         TMOD=0x1;TR0=1;ET0=1;EA=1;
         while (1) {
             while (!key) {}
             switch (key) {
             case 1:break;
             case 2:break;
             }
         }
     //串行驱动led显示,
     //一个74hc595位移寄存器驱动三极管驱动led位,
     //两个74hc595驱动led段,方式位5位x8段x2=10个数码管
     //5分频,每次扫描时间位1.25ms


     //定义特殊符号

     #define nul 0xf
     #define qc 0xc
     #define qb 0xb
     #define q_ 0xa
     #define q__ 0xd
     #define q___ 0xe
     #define qp 0x10
     #define qe 0x11
     #define qj 0x12
     #define qn 0x13
     #define qf 0x14
     #define qa 0x15
     #define qr 0x16
     #define qd 0x17
     #define qu 0x18
     #define ql 0x19
     #define qh 0x1a
     #define qwen 0x1b
     #define qt 0x1c
     #define qla 0x1d
     #define qlb 0x1e
     #define qlc 0x1f
     #define qld 0x20
     #define qle 0x21
     #define qlf 0x22
     #define qlg 0x23
     #define qldp 0x24


     //显示段信息,不同led排列组合的段信息只需更改8个数值即可。
     //因此,该定义具有通用性。

     //    显示   
     //        -d 20
     //    |c 40    |e 10
     //        - g        80       
     //    |b 2    |f 4
     //        _a1    .dp 8
     #define pa 1
     #define pb 2
     #define pc 0x40
     #define pd 0x20
     #define pe 0x10
     #define pf 4
     #define pg 0x80
     #define pdp 8

     //--------------
     #define l0 pdp+pg
     #define l1 255-pf-pe
     #define l2 pdp+pc+pf
     #define l3 pdp+pc+pb
     #define l4 pdp+pa+pb+pd
     #define l5 pdp+pb+pe
     #define l6 pdp+pe
     #define l7 pdp+pc+pg+pb+pa
     #define l8 pdp
     #define l9 pdp+pb
     #define la pdp+pa
     #define lb pdp+pd+pe
     #define lc pdp+pg+pe+pf
     #define ld pdp+pc+pd
     #define le pdp+pe+pf
     #define lf pdp+pe+pf+pa
     #define l_ 255-pg
     #define lnul 255
     #define ll pdp+pg+pd+pf+pe
     #define lp pdp+pa+pf
     #define lt pdp+pd+pe+pf
     #define lr pdp+pe+pf+pg+pa
     #define ln pdp+pg+pa
     #define lh pdp+pd+pe+pa
     #define ly pdp+pb+pd
     #define lu pdp+pg+pd
     #define l__ pdp+pg+pb+pc+pe+pf
     #define l___ l__-pg
     #define l_1 255-pa
     #define l_2 255-pa-pg
     #define lj 255-(pe+pf+pa)
     #define lwen 255-(pd+pe+pg+pb)
     #define lall 0


     #define lla 255-pa
     #define llb 255-pb
     #define llc 255-pc
     #define lld 255-pd
     #define lle 255-pe
     #define llf 255-pf
     #define llg 255-pg
     #define lldp 255-pdp


     //串行送出的位信息,目前是10位led显示。
     unsigned char code un_dig[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb};
     //串行送出的短信息。
     unsigned char code
     un_disp[]={l0,l1,l2,l3,l4,l5,l6,l7,l8,l9,l_,lb,lc,l__,l___,lnul,lp,le,lj,ln,lf,la,lr,ld,lu,
     ll,lh,lwen,lt,lla,llb,llc,lld,lle,llf,llg,lldp,lnul};

     


     sbit d_clk=P0^0;        //移位时钟
     sbit d_dat=P0^1;        //移位数据
     sbit d_st=P0^2;            //移位锁定


     unsigned char dig;            //位扫描计数器
     unsigned char d[10];                            //显示缓冲

     //送出8位串行数据
     void out_disp(unsigned char dd) {
         unsigned char i;
         for (i=0;i<8;i++) {
             if (dd&1) d_dat=1; else d_dat=0;
             d_clk=0;
             dd>>=1;
             d_clk=1;
         }
     }
     //控制小数点和闪烁,显示数据|0x040表示有小数点;显示数据|0x80表示闪烁。
     void out_displ(unsigned char dd) {
         if (dd>=0x80) {
             if (s001>flash_time) {out_disp(0xff);return;}
         }
         dd&=0x7f;
         if (dd>=0x40) {
             dd=un_disp[dd&0x3f]^pdp;
         } else dd=un_disp[dd];
         out_disp(dd);
     }

     

     

     unsigned int s001;    //闪烁时间参考
     void int_t0(void) interrupt 1 {
         unsigned char dd;
         TL0=TL0+30;TH0=0xfb;    //800
         time++;
         if ((++s001)>=800) s001=0;
         //    显示   
         if ((++dig)>4) dig=0;
         d_st=0;
         dd=d[dig+5];
         out_displ(dd);
         dd=d[dig];
         out_displ(dd);
         out_disp(un_dig[dig]);
         d_st=1;
     }
     void main(void) {
         unsigned char i;
         TMOD=0x1;
         TR0=ET0=1;
         EA=1;
         for (i=0;i<10;i++) d[i]=i;    //display test
         while (1) {}
     }


     

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    Re:一些实用的单片机c程序
    YU(游客)发表评论于2008-7-7 17:41:00  个人主页 | 引用 | 返回 | 删除 | 回复

    YU(游客)FEICHANGGANXIE

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    Re:一些实用的单片机c程序
    访客12Yk05(游客)发表评论于2008-5-21 13:43:00  个人主页 | 引用 | 返回 | 删除 | 回复

    访客12Yk05(游客)谢谢

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    Re:一些实用的单片机c程序
    伊凡(游客)发表评论于2008-4-6 13:09:00  个人主页 | 引用 | 返回 | 删除 | 回复

    伊凡(游客)谢谢……

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    Re:一些实用的单片机c程序
    精灵(游客)发表评论于2008-3-24 21:31:00  个人主页 | 引用 | 返回 | 删除 | 回复

    精灵(游客)确实不错啊,

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    Re:一些实用的单片机c程序
    suizhouxh发表评论于2007-12-30 0:07:00  个人主页 | 引用 | 返回 | 删除 | 回复

    suizhouxh谢谢。。。虽然有的还看不懂

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    Re:一些实用的单片机c程序
    gpx(游客)发表评论于2007-7-19 15:00:00  个人主页 | 引用 | 返回 | 删除 | 回复

    gpx(游客)不错 ,这些程序确实很经典

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    Re:一些实用的单片机c程序
    china.T发表评论于2007-7-7 12:59:00  个人主页 | 引用 | 返回 | 删除 | 回复

    china.T不错啊

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    发表评论:
    载入中...

    芯片专题

    器件专题

    软件专题

    硬件专题

    综合专题

    项目专题

    原创专题

    器件检测
    LCD LED
    按键 触摸键
    E2PROM
    电池 电机
    电阻 电容 电感

    指令系统
    软件算法
    编程规范
    滤波算法
    串行通讯

    PCB设计
    I2C PWM
    红外遥控
    充电技术
    中断 ADC 

    匠人手记
    匠人夜话
    网络心路
    一周热点串烧
    从零开始玩PIC
    DIY旋转时钟

    广告5号位 [投放]


    学习板、开发板、编程器、下载器、仿真器(查看详情……)

    站内搜索


    站外搜索


    百度  google
    mp3  歌词 
    图片  FLASH 
    知道  文档
    新闻  词典 
    地图  mp3 
    软件  天网 
    雅虎  爱问 
    搜狗  讯雷 
    网讯  华军 
    天空 

    21IC器件搜索
    百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     
     

    新鲜货色

    匠人手记

    近期动态

    载入中...

      《匠人手记》购书全攻略 
     书友近况:淘书手记答疑与讨论:什么是散转程序 
     《匠人手记》新书艳照
     EDN《匠人手记》签名售书优惠活动开始报名啦!
     欢迎加入《匠人手记》EDN书友会
     欢迎加入《匠人手记》书友会Q群
     《匠人手记》终稿目录
     《匠人手记》封面,请大家先睹为快
     上周六收到了北航寄来的《匠人手记》清样,让大家先睹为快

    匠人原创

    粉丝评论

    往日酷贴

    载入中...

    载入中...



     网络酷文:博客,改变的不仅仅是图书 
     网络酷文:C语言宏定义技巧C语言 条件编译详解

      21IC上海2008-04聚会报名进行中。。。 
     两分钟让你明白什么是ERP![转]
      神奇的Duff's Device 算法
      实用一线通讯电路及软件设计方法
      程序员的“七年之痒”
      史上最短但最精彩的武侠小说
      网络无厘头文学《缺钙水浒》(爆笑)

     你的博客还能持续多久(转贴)
     电动车无刷电机控制器软件设计要点(作者:谢渊斌)

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!