找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1756|回复: 0
打印 上一主题 下一主题
收起左侧

1602 18b20 1302单片机驱动程序

[复制链接]
跳转到指定楼层
楼主
ID:240358 发表于 2017-10-17 20:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分享一个1602 18b20 1302驱动
单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. sbit TSCIK=P1^0;
  6. sbit TI0=P1^1;
  7. sbit TRST=P1^2;
  8. sbit RS=P3^5;
  9. sbit RW=P3^6;
  10. sbit EN=P3^4;
  11. sbit DS=P2^2;
  12. void delay_us(uchar us)
  13. {
  14.         while(us--);
  15. }
  16. void read_1602busy()//判断液晶忙不忙
  17. {
  18.         uchar busy;
  19.         P0=0xff;
  20.         RS=0;
  21.         RW=1;
  22.         do
  23.         {
  24.                  EN=1;
  25.                 busy=P0;
  26.                 EN=0;
  27.     }while(busy&0x80);

  28. }
  29. void write_1602cmd(uchar cmd)//对1602写命令
  30. {
  31.         read_1602busy();
  32.         RS=0;
  33.         RW=0;
  34.         P0=cmd;
  35.         EN=1;
  36.         EN=0;
  37. }
  38. void write_1602dat(uchar dat)//对1602写数据
  39. {
  40.          read_1602busy();
  41.          RS=1;
  42.          RW=0;
  43.          P0=dat;
  44.          EN=1;
  45.          EN=0;
  46. }
  47. /********************************************/
  48. /*函数名称:显示字符串*/
  49. /*函数功能:在指定位置显示一个字符串*/
  50. /*输入:x要显示的横坐标取值0-40,y要显示的纵坐标取值0-1
  51. ,*str:需要显示的字符串*/
  52. void dis_1602str(uchar x,uchar y,uchar *str)
  53. {
  54.         if(y)        x|=0x40;
  55.         x|=0x80;
  56.         while(*str!='\0')
  57.         {
  58.                 write_1602dat(*str++);
  59.         }
  60. }
  61. /*******************************************/
  62. /*函数名称:显示字符*/
  63. /*函数功能:在指定位置显示一个字符*/
  64. /*输入:x要显示的横坐标取值0-40,y要显示的纵坐标取值0-1
  65. ,dat:需要显示的数据已ASCLL形式*/
  66. void dis_1602onechar(uchar x,uchar y,uchar dat)
  67. {
  68.         if(y)        x|=0x40;
  69.         x|=0x80;
  70.         write_1602cmd(x);
  71.         write_1602dat(dat);
  72. }
  73. void init_1602()//1602初始化
  74. {
  75.         write_1602cmd(0x38);//16*2显示
  76.         write_1602cmd(0x0c);//开显示
  77.         write_1602cmd(0x06);//读一个字节后指针加一
  78.         write_1602cmd(0x01);//清除显示/
  79. }
  80. void write_ds1302_dat(uchar cmd,uchar dat)//写ds1302数据
  81. {
  82.         uchar i;
  83.         TRST=0;                //拉低使能端
  84.         TSCIK=0;    //拉低数据总线
  85.         TRST=1;           //拉高使能端,产生上升沿
  86.         for(i=0;i<8;i++)  //每次写一位,写八次
  87.         {
  88.                 TSCIK=0;
  89.                 TI0=cmd&0x01;
  90.                 TSCIK=1;
  91.                 cmd>>=1;
  92.         }
  93.         for(i=0;i<8;i++)
  94.         {
  95.                 TSCIK=0;
  96.                 TI0=dat&0x01;
  97.                 TSCIK=1;
  98.                 dat>>=1;
  99.         }
  100. }
  101. uchar read_ds1302_dat(uchar cmd)//读ds1302数据
  102. {
  103.         uchar i,dat;
  104.         TRST=0;
  105.         TSCIK=0;
  106.         TRST=1;
  107.         for(i=0;i<8;i++)
  108.         {
  109.                 TSCIK=0;
  110.                 TI0=cmd&0x01;
  111.                 TSCIK=1;
  112.                 cmd>>=1;
  113.         }
  114.         for(i=0;i<8;i++)
  115.         {
  116.                 TSCIK=0;
  117.                 dat>>=1;
  118.                 if(TI0)        dat|=0x80;
  119.                 TSCIK=1;
  120.         }
  121.         return dat;
  122. }
  123. uchar dat_to_bcd(uchar dat)//数据转bcd码
  124. {
  125.         uchar dat1,dat2;
  126.         dat1=dat/10;
  127.         dat2=dat%10;
  128.         dat2=dat2+dat1*16;
  129.         return dat2;
  130. }
  131. uchar bcd_to_dat(uchar dat)//bcd码转数据
  132. {
  133.         uchar dat1,dat2;
  134.         dat1=dat/16;
  135.         dat2=dat%16;
  136.         dat2=dat2+dat1*10;
  137.         return dat2;
  138. }
  139. bit ds18b20_init()//da18b20初始化
  140. {
  141.         bit i;
  142.         DS=1;
  143.         _nop_();
  144.         DS=0;
  145.         delay_us(75);
  146.         DS=1;
  147.         delay_us(4);
  148.         i=DS;
  149.         delay_us(20);
  150.         DS=1;
  151.         _nop_();
  152.         return(i);
  153. }
  154. void write_byte18b20(uchar dat)//ds18b20写数据
  155. {
  156.         uchar i;
  157.         for(i=0;i<8;i++)
  158.         {
  159.                 DS=0;
  160.                 _nop_();
  161.                 DS=dat&0x01;
  162.                 delay_us(10);
  163.                 DS=1;
  164.                 _nop_();
  165.                 dat>>=1;
  166.         }
  167. }
  168. uchar read_byte18b20()//ds188b20读数据
  169. {
  170.         uchar i,j,dat;
  171.         for(i=0;i<8;i++)
  172.         {
  173.                 DS=0;
  174.                 _nop_();
  175.                 DS=1;
  176.                 _nop_();
  177.                 j=DS;
  178.                 delay_us(10);
  179.                 DS=1;
  180.                 _nop_();
  181.                 dat=(j<<7|(dat>>1));
  182.         }
  183.         return(dat);
  184. }
  185. /**************************/
  186. /***函数功能:获得温度(三位数无小数点)***/
  187. uint get_tmp()
  188. {
  189.         uchar L,M;
  190.     uint i;
  191.     ds18b20_init();
  192.         write_byte18b20(0xcc);//发送跳跃ROM指令
  193.         write_byte18b20(0x44);//发送温度转换指令
  194.         ds18b20_init();
  195.         write_byte18b20(0xcc);
  196.         write_byte18b20(0xbe);
  197.         L=read_byte18b20();
  198.         M=read_byte18b20();
  199.         i=M;
  200.         i<<=8;
  201.         i|=L;
  202.         i=i*0.0625*10+0.5;//读取正温度值
  203.         return(i);
  204. }
  205. void main()
  206. {
  207.         uchar sec,min,hour,secshi,secge,minshi,minge,hourshi,hourge,ge,shi,bai,k;
  208.         uint i;
  209.         write_ds1302_dat(0x8e,0);
  210.         write_ds1302_dat(0x80,dat_to_bcd(00));//对秒写数据
  211.         write_ds1302_dat(0x82,dat_to_bcd(02));//对分写数据
  212.         write_ds1302_dat(0x84,dat_to_bcd(17));//对时写数据
  213.         write_ds1302_dat(0x8e,0x80);
  214.         init_1602();
  215.         while(1)
  216.         {
  217.                 write_ds1302_dat(0x8e,0);
  218.                 sec= bcd_to_dat(read_ds1302_dat(0x81));//秒
  219.                 min= bcd_to_dat(read_ds1302_dat(0x83));//分
  220.                 hour=bcd_to_dat(read_ds1302_dat(0x85));//时
  221. ……………………

  222. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
lcd1602,ds18b20,ds1302驱动.doc (4.41 KB, 下载次数: 5)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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