51单片机程序

  • e9_306065
    了解作者
  • 15.2KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-04-14 09:49
    上传日期
51单片机程序 温度程序 时钟程序 单片机中断 矩阵键盘 状态机键盘
51单片机程序.rar
  • 51单片机程序
  • 新建文件夹
  • Key.h
    699B
  • MA12864.h
    5.2KB
  • Ds18b20.h
    1.9KB
  • main.c
    3KB
  • 串口通信.asm
    584B
  • ds1302_2.c
    3.2KB
  • SERIES.ASM
    789B
  • sd5020.c
    3.1KB
  • 中断之检测标志位.asm
    528B
  • ds1302_3.c
    10.4KB
  • 矩阵键盘.asm
    2.2KB
  • ds18b20.c
    3.1KB
  • SERIES2.ASM
    576B
  • 状态机键盘.asm
    2.4KB
内容介绍
#include<reg51.h> #include<intrins.h> sbit k1 = P3^0 ; sbit k2 = P3^1 ; sbit k3 = P3^2 ; sbit k4 = P3^3 ; sbit led=P1^0; sbit io_DS1302_RST = P3^5 ; sbit io_DS1302_IO = P3^4 ; sbit io_DS1302_SCLK = P3^6 ; sbit wei1=P2^7; sbit wei2=P2^6; sbit wei3=P2^5; sbit wei4=P2^4; sbit wei5=P2^3; sbit wei6=P2^2; sbit wei7=P2^1; sbit wei8=P2^0; sbit DQ=P1^7; //-------------------------------------常数宏---------------------------------// #define uint unsigned int #define uint8 unsigned char #define DS1302_SCLK_HIGH io_DS1302_SCLK = 1 ; #define DS1302_SCLK_LOW io_DS1302_SCLK = 0 ; #define DS1302_IO_HIGH io_DS1302_IO = 1 ; #define DS1302_IO_LOW io_DS1302_IO = 0 ; #define DS1302_IO_READ io_DS1302_IO #define DS1302_RST_HIGH io_DS1302_RST = 1 ; #define DS1302_RST_LOW io_DS1302_RST = 0 ; uint8 code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //数码管显示数字 0 1 2 3 4 5 6 7 8 9 uint8 read_addres[]={0x8d,0x89,0x87,0x8b,0x85,0x83,0x81}; //要读出的地址 年 月 日 周 时 分 秒 uint8 write_addres[]={0x8c,0x88,0x86,0x8a,0x84,0x82,0x80}; //要写入的地址 年 月 日 周 时 分 秒 uint8 time_data[]={0x12,0x10,0x23,0x02,0x11,0x30,0x00}; //要写入的初始时间12年10月23日 周2 11点30分0秒 uint8 time_read[7]; //存放读取的时间 uint8 wei[]={0xfd,0xfe,0xef,0xf7,0x7f,0xbf}; void display(); void delay(uint z); void keyscan( ); void hour_add(); //小时调整(加1) void minite_add(); //分钟调整(加1) void delay_um(uint um) ; void ds18b20(); void ds18b20_update(); void ds18b20_display(); uint8 ds18b20_readchar(); void ds18b20_writechar(unsigned char dat); void ds18b20_int(); void ReadTemperature(); uint8 temp,temp1,temp2,flag=0; uint xs; /****************************************************************************** 103.* Function: static void v_DS1302Write_f( uint8 Content ) * 105.* Description:向DS1302写一个字节的内容 * 107.* Parameter:uint8 Content : 要写的字节 * 111.******************************************************************************/ static void v_DS1302Write_f( uint8 Content ) { uint8 i ; for( i = 8 ; i > 0 ; i-- ) { io_DS1302_IO=Content & 0x01; Content >>= 1 ; DS1302_SCLK_HIGH DS1302_SCLK_LOW } } /****************************************************************************** 159.* Function: static uint8 v_DS1302Read_f( void ) * 161.* Description: 从DS1302当前设定的地址读取一个字节的内容 * 165.* Return: 返回读出来的值(uint8) * 167.******************************************************************************/ static uint8 v_DS1302Read_f( void ) { uint8 i, ReadValue ; DS1302_IO_HIGH for( i = 8 ; i > 0 ; i-- ) { ReadValue >>= 1 ; if( DS1302_IO_READ ) { ReadValue |= 0x80 ; } DS1302_SCLK_HIGH DS1302_SCLK_LOW } return ReadValue ; } /****************************************************************************** 217.* Function: void v_DS1302WriteByte_f( uint8 Address, uint8 Content ) * 219.* Description: 从DS1302指定的地址写入一个字节的内容 * 227.******************************************************************************/ void v_DS1302WriteByte_f( uint8 Address, uint8 Content ) { DS1302_RST_LOW DS1302_SCLK_LOW DS1302_RST_HIGH // delay(1); v_DS1302Write_f( Address ) ; v_DS1302Write_f( Content ) ; DS1302_RST_LOW // delay(1); DS1302_SCLK_HIGH // delay(1); } /****************************************************************************** 257.* Function: uint8 v_DS1302ReadByte_f( uint8 Address ) * 259.* Description:从DS1302指定的地址读出一个字节的内容 * 267.******************************************************************************/ uint8 v_DS1302ReadByte_f( uint8 Address ) { uint8 ReadValue ; DS1302_RST_LOW DS1302_SCLK_LOW // delay(1); DS1302_RST_HIGH delay(1); v_DS1302Write_f( Address ) ; ReadValue = v_DS1302Read_f() ; DS1302_RST_LOW // delay(1); DS1302_SCLK_HIGH // delay(1); return ReadValue ; } /****************************************************************************** 299.* Function: void v_ClockInit_f( void ) * 301.* Description:初始化写入DS1302时钟寄存器的值(主程序中只需调用一次即可) * 309.******************************************************************************/ void v_ClockInit_f( void ) { uint8 i; if( v_DS1302ReadByte_f( 0xc1) != 0xf0 ) { v_DS1302WriteByte_f( 0x8e, 0x00 ) ; //允许写操作 for(i=0;i<7;i++) {v_DS1302WriteByte_f( write_addres[i], time_data[i] ) ; } v_DS1302WriteByte_f( 0x90, 0xa5 ) ; //充电 v_DS1302WriteByte_f( 0xc0, 0xf0 ) ; //判断是否初始化一次标识写入 v_DS1302WriteByte_f( 0x8e, 0x80 ) ; //禁止写操作 } } /****************************************************************************** 读取的时间放在time_read[ ] 这个数组中 void v_ClockUpdata_f( void ) ******************************************************************************/ void v_ClockUpdata_f( void ) { uint i; for(i=0;i<7;i++) { time_read[i]=v_DS1302ReadByte_f( read_addres[i] ) ; } } //延时函数 void delay_um(uint um) { uint x; for(x = um;x>0;x--); } void delay(uint z) { uint x,y; for(x = z;x>0;x--) for(y = 64;y>0;y--); } void display() { uint8 i,j,k,g,s,m ; i=7; for(j=0;j<5;j=j+2) { i--; m=j; s=time_read[i]/16; g=time_read[i]%16; for(k=0;k<2;k++) { P0=table[s]; P2=wei[j] ; delay(2); P2=0xff; delay(2); s=g; j=j+1; } j=m; } } /* uint8 mg,ms,fg,fs,xsg,xss ; ms=time_read[6]/16; mg=time_read[6]%16; P0=table[ms]; wei7=0 ; delay(2); wei7=1; delay(2); P0=table[mg]; wei8=0; delay(2); wei8=1; delay(2); fs=time_read[5]/16; fg=time_read[5]%16; P0=table[fs]; wei4=0 ; delay(2); wei4=1; delay(2); P0=table[fg]; wei5=0; delay(2); wei5=1; delay(2); xss=time_read[4]/16; xsg=time_read[4]%16; P0=table[xss]; wei1=0 ; delay(2); wei1=1; delay(2); P0=table[xsg]; wei2=0; delay(2); wei2=1; delay(2); } */ void hour_add() { uint8 L; L=v_DS1302ReadByte_f( read_addres[4] ) ; L = ((L >> 4) * 10) + (L & 0x0f); //BCD Convert to Hex L++; if(L > 24) { L=0; }//到60清0 L = ((L / 10) << 4) + (L % 10) ;//Hex Convert to BCD v_DS1302WriteByte_f( 0x8e, 0x00 ) ; //允许写操作 v_DS1302WriteByte_f( write_addres[4], L ) ; v_DS1302WriteByte_f( 0x8e, 0x80 ) ; //禁止写操作 } void minite_add() { uint8 L; L=v_DS1302ReadByte_f( read_addres[5] ) ; L = ((L >> 4) * 10) + (L & 0x0f); //BCD Convert to Hex L++; if(L > 59) { L=0; }//到60清0 L = ((L / 10) << 4) + (L % 10) ;//Hex Convert to BCD v_DS1302WriteByte_f( 0x8e, 0x00 ) ; //允许写操作 v_DS1302WriteByte_f( write_addres[5], L ) ; v_DS1302WriteByte_f( 0x8e, 0x80 ) ; //禁止写操作 } void keyscan() //键盘扫描 {// uint8 i; if(k1==0) { delay(5); if(k1==0) {hour_add(); } while(!k1) //等待按键释放,如果不释放,一直执行v_ClockUpdata_f()、display()两函数,不会造成数码管不显示 { v_ClockUpdata_f(); display(); } } if(k2==0) {delay(5); if(k2==0) {minite_add(); } while(!k2) { v_ClockUpdata_f(); display(); } } if(k3==0) {delay(5); if(k3==0) { led=0; delay(1); led=1; delay(1); } } } //初始化ds18b20 void ds18b20_int() { uint8 x=0; DQ = 1; //DQ复位 ds18b20通信端口 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(4); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则
评论
    相关推荐