基于at89s51单片机的电子时钟(带温度显示内容摘要:

置完成后进行确认;/// 按s3进行减;/// 按s4进行加;/// ///////////////////////////////////////////////////////////////////////////////////////////////includedefine uint unsigned intdefine uchar unsigned char/////////////////sbit rw = P2^6。 //sbit rs = P2^5。 // 1602 IO口位定义sbit en = P2^7。 //////////////////////////////////////sbit rst = P3^5。 //sbit sclk = P3^6。 // 1302 IO口位定义sbit io = P3^4。 ////////////////////////////////////////sbit key1 = P1^0。 //sbit key2 = P1^1。 // 独立按键位定义sbit key3 = P1^2。 //sbit key4 = P1^3。 // //////////////////////////////////////sbit DQ = P2^2。 ///////////////////////uchar tempL=0。 //临时变量低位uchar tempH=0。 //临时变量高位uint temperature。 uint hour, minute, second, year, month, day。 uint key = 0。 uchar tab_num[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x2d}。 //对应字符为: { 0 1 2 3 4 5 6 7 8 9 : }uchar tab_time[] = {1,2,10,3,4,10,5,6}。 uchar tab_date[] = {2,0,1,0,11,0,9,11,2,7}。 // 延时函数,延时z毫秒 ******void delay(uint z) { uint x, y。 for(x=0。 xz。 x++) for(y=0。 y110。 y++)。 }//***************************/****************************************************************************函数功能:延时子程序入口参数:k出口参数:****************************************************************************/void delay18b20(unsigned int k){ unsigned int n。 n=0。 while(n k) {n++。 } return。 } /****************************************************************************函数功能:DS18B20初始化子程序入口参数:出口参数:****************************************************************************/Init_DS18B20(void){ unsigned char x=0。 DQ=1。 //DQ先置高 delay18b20(8)。 //延时 DQ=0。 //发送复位脉冲 delay18b20(85)。 //延时(480ms) DQ=1。 //拉高数据线 delay18b20(14)。 //等待(15~60ms) }/****************************************************************************函数功能:向DS18B20读一字节数据入口参数:出口参数:dat****************************************************************************/ReadOneChar(void) { unsigned char i=0。 unsigned char dat=0。 for (i=8。 i0。 i) { DQ=1。 delay18b20(1)。 DQ=0。 dat=1。 DQ=1。 if(DQ) dat|=0x80。 delay18b20(4)。 } return(dat)。 }/****************************************************************************函数功能:向DS18B20写一字节数据入口参数:dat出口参数:****************************************************************************/WriteOneChar(unsigned char dat){ unsigned char i=0。 for(i=8。 i0。 i) { DQ=0。 DQ=datamp。 0x01。 delay18b20(5)。 DQ=1。 dat=1。 } delay18b20(4)。 }/****************************************************************************函数功能:向DS18B20读温度值入口参数:出口参数:temperature****************************************************************************/uint ReadTemperature(void){ Init_DS18B20()。 //初始化 WriteOneChar(0xcc)。 //跳过读序列号的操作 WriteOneChar(0x44)。 //启动温度转换 delay18b20(125)。 //转换需要一点时间,延时 Init_DS18B20()。 //初始化 WriteOneChar(0xcc)。 //跳过读序列号的操作 WriteOneChar(0xbe)。 //读温度寄存器(头两个值分别为温度的低位和高位) tempL=ReadOneChar()。 //读出温度的低位LSB tempH=ReadOneChar()。 //读出温度的高位MSB //温度转换,把高低位做相应的运算转化为实际温度 temperature=((tempH*256)+tempL)*5/8。 delay18b20(200)。 return(temperature)。 }//========1302写一个字节=========void write_byte(uchar dat){ uchar i, dat_w。 dat_w = dat。 for(i=0。 i8。 i++) { io = 0。 if(dat_w amp。 0x01) io = 1。 else io = 0。 dat_w = dat_w 1。 sclk = 0。 sclk = 1。 } sclk = 0。 }//===============================//========1302读一个字节=========uchar read_byte(){ uchar i, k。 k = 0。 for(i=0。 i8。 i++) { k = k 1。 if(io) k = k|0x80。 sclk = 1。 sclk = 0。 } sclk = 0。 return (k)。 }//===============================//========1302把数据写入地址=====void write_add(uchar add, uchar dat){ rst = 0。 sclk = 0。 rst = 1。 write_byte(add)。 write_byte((dat / 10 4) | (dat % 10))。 sclk = 0。 rst = 0。 }//===============================//========1302从地址读出数据=====uchar read_add(uchar add){ uchar temp, dat1, dat2。 rst = 0。 sclk = 0。 rst = 1。 write_byte(add)。 temp = read_byte()。 sclk = 0。 rst = 0。 dat1 = temp / 16。 dat2 = temp % 16。 temp = dat1 * 10 + dat2。 return (temp)。 }//===============================//=========1302时间初始化========void ds1302_init(){ write_add(0x8e,0x00)。 //打开写保护,写入时间; write_add(0x80,50)。 //初始化秒 50; write_add(0x82,59)。 //初始化分 59; write_add(0x84,23)。 //初始化时 23; write_add(0x86,31)。 //初始化日 31; write_add(0x88,12)。 //初始化月 12; write_add(0x8c,10)。 //初始化年 2010; write_add(0x8e,0x80)。 //关闭写保护,禁止写入。 }//===============================//=========1302读出时间==========void ds1302(){ write_add(0x8e,0x00)。 //打开写保护,读出时间; second = read_add(0x81)。 //从1302读出时间秒; minute = read_add(0x83)。 //从1302读出时间分; hour = read_add(0x85)。 //从1302读出时间时; day = read_add(0x87)。 //从1302读出时间日; month = read_add(0x89)。 //从1302读出时间月; year = read_add(0x8d)。 //从1302读出时间年; write_add(0x8e,0x80)。 //关闭写保护,禁止读出;}//===============================//写命令函数 ****************vo。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。