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

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

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

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

一些实用的单片机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程序
eezhp(游客)发表评论于2008-9-23 15:09:00  个人主页 | 引用 | 返回 | 删除 | 回复

eezhp(游客)我太崇拜你了,!
有空要多和你交流阿,大哥!

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

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号位 [投放]


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

广告3号位 [投放]

站内搜索


站外搜索


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

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

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

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

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

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

    大学生电子网 

     

     

     

     

     

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