[信息与通信]万年历程序不要嫌程序长功能很齐全而且对初学者很有帮助.doc

上传人:sccc 文档编号:4657726 上传时间:2023-05-03 格式:DOC 页数:34 大小:183KB
返回 下载 相关 举报
[信息与通信]万年历程序不要嫌程序长功能很齐全而且对初学者很有帮助.doc_第1页
第1页 / 共34页
[信息与通信]万年历程序不要嫌程序长功能很齐全而且对初学者很有帮助.doc_第2页
第2页 / 共34页
[信息与通信]万年历程序不要嫌程序长功能很齐全而且对初学者很有帮助.doc_第3页
第3页 / 共34页
[信息与通信]万年历程序不要嫌程序长功能很齐全而且对初学者很有帮助.doc_第4页
第4页 / 共34页
[信息与通信]万年历程序不要嫌程序长功能很齐全而且对初学者很有帮助.doc_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《[信息与通信]万年历程序不要嫌程序长功能很齐全而且对初学者很有帮助.doc》由会员分享,可在线阅读,更多相关《[信息与通信]万年历程序不要嫌程序长功能很齐全而且对初学者很有帮助.doc(34页珍藏版)》请在三一办公上搜索。

1、#include #include #define uint unsigned int#define uchar unsigned charvoid Stopwatch(); /声明秒表函数void Clock(); /声明闹钟函数void Output(); /声明输出函数void important(); /声明重要函数(相当于mian()函数)void TLimit(); /声明调节温度上下限函数sbit DS1302_CLK = P17; /实时时钟时钟线引脚 sbit DS1302_IO = P16; /实时时钟数据线引脚 sbit DS1302_RST = P15; /实时时钟复位

2、线引脚sbit wireless_1 = P30; /温度过上限标志sbit wireless_2 = P31; /温度适中标志sbit wireless_3 = P32; /温度过下限标志sbit fan = P34; /开风扇标志sbit clock=P35; /开关闹钟sbit setclock = P36; /闹钟开启控制sbit stopwatch = P37; /秒表开启控制sbit ACC0 = ACC0;sbit ACC7 = ACC7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_yea

3、r; /秒,分,时到日,月,年位闪的计数sbit Set = P20; /模式切换键sbit Up = P21; /加法按钮sbit Down = P22; /减法按钮sbit out = P23; /立刻跳出调整模式按钮sbit DQ = P10; /温度传送数据IO口char c3,c2=0;char c=0,LowerBonud=20,UpperLimit=30;char a1=0,a2=0,a3=0,a4=0;char k8=0,0,:,0,0,:,0,0;void InitTimer0(void)/产生10ms时间间隔 TMOD = (TMOD & 0XF0) | 0X01; /定时

4、器0工作在模式1,16Bit定时器模式 TH0 = (65536 - 8000)/256; TL0 = (65536 - 8000)%256; TR0 =1; ET0 =1;/开启定时器和中断 EA = 1;char done,count,temp,flag,up_flag,down_flag; /uchar temp_value; /温度值uchar TempBuffer5,week_value2,h8; /unsigned char NL5;void show_time(); /液晶显示程序/*1602液晶显示部分子程序*/Port Definitions*sbit LcdRs= P25;

5、sbit LcdRw= P26;sbit LcdEn = P27;sfr DBPort = 0x80;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/内部等待函数*unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_(); LcdEn=0;return DBPort;/向LCD写入命令或数据*#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#define LCD_CLEAR_SCREEN0x01 / 清屏#define LCD_H

6、OMING 0x02 / 光标返回原点void LCD_Write(bit style, unsigned char input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意顺序LcdEn=1;_nop_();/注意顺序LcdEn=0;_nop_();LCD_Wait();/设置显示模式*#define LCD_SHOW0x04 /显示开#define LCD_HIDE0x00 /显示关 #define LCD_CURSOR0x02 /显示光标#define LCD_NO_CURSOR0x00 /无光标 #define

7、 LCD_FLASH0x01 /光标闪动#define LCD_NO_FLASH0x00 /光标不闪动void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|DisplayMode);/设置输入模式*#define LCD_AC_UP0x02#define LCD_AC_DOWN0x00 / default#define LCD_MOVE0x01 / 画面可平移#define LCD_NO_MOVE0x00 /defaultvoid LCD_SetInput(unsigned char InputMod

8、e)LCD_Write(LCD_COMMAND, 0x04|InputMode);/初始化LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0x38); /8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC递增, 画面不动/液晶字符输入的

9、位置*void GotoXY(unsigned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0x80|(x-0x40);/将字符输出到液晶显示void Print(unsigned char *str)while(*str!=0)/while(*str!=0)LCD_Write(LCD_DATA,*str);str+;/*DS1302时钟部分子程序*/typedef struct SYSTEMTIMEunsigned char Second;unsigned

10、char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char YearH;unsigned char YearL;unsigned char day;unsigned char month;unsigned char year;unsigned char DateString11;unsigned char NLDateString12;unsigned char TimeString9;SYSTEMTIME;/定义

11、的时间类型SYSTEMTIME CurrentTime; /#define AM(X)X#define PM(X)(X+12) / 转成24小时制#define DS1302_SECOND0x80 /时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE0x82#define DS1302_HOUR0x84 #define DS1302_WEEK0x8A#define DS1302_DAY0x86#define DS1302_MONTH0x88#define DS1302_YEAR0x8C #define DS1302_YEARH 0xC0 void DS1302InputB

12、yte(unsigned char d) /实时时钟写入一字节(内部函数) unsigned char i; ACC = d; for(i=8; i0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) ACC = ACC 1; /相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK

13、= 1; DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要写的数据 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(unsigne

14、d char ucAddr)/读取DS1302某地址的数据 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_GetTime(SYSTEMTIME *Time) /获取时钟芯片的时钟数据到自定义的结构型数组unsigned char R

15、eadValue;ReadValue = Read1302(DS1302_SECOND);Time-Second = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time-Minute = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time-Hour = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(D

16、S1302_DAY);Time-Day = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time-Week = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time-Month = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time-Year = (ReadValue&0x70

17、)4)*10 + (ReadValue&0x0F);Time-YearH = 20;void DateToStr(SYSTEMTIME *Time) /将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString if(hide_year2) /这里的if,else语句都是判断位闪烁,2就不显示,输出字符串为 2007/07/22 Time-DateString0 = Time-YearH/10 + 0; Time-DateString1 = Time-YearH%10 + 0; Time-DateString2 = Time-Year/10 + 0; Time-DateSt

18、ring3 = Time-Year%10 + 0; else Time-DateString0 = ; Time-DateString1 = ; Time-DateString2 = ; Time-DateString3 = ;Time-DateString4 = /;if(hide_monthDateString5 = Time-Month/10 + 0; Time-DateString6 = Time-Month%10 + 0; else Time-DateString5 = ; Time-DateString6 = ; Time-DateString7 = /;if(hide_dayDa

19、teString8 = Time-Day/10 + 0; Time-DateString9 = Time-Day%10 + 0; else Time-DateString8 = ; Time-DateString9 = ; if(hide_weekWeek%10 + 0; /星期的数据另外放到 week_value数组里,跟年,月,日的分开存放,因为等一下要在最后显示 else week_value0 = ; week_value1 = 0;Time-DateString10 = 0; /字符串末尾加 0 ,判断结束字符void TimeToStr(SYSTEMTIME *Time) /将时,

20、分,秒数据转换成液晶显示字符放到数组 TimeString; if(hide_hourTimeString0 = Time-Hour/10 + 0; Time-TimeString1 = Time-Hour%10 + 0; h0=Time-TimeString0; h1=Time-TimeString1; else Time-TimeString0 = ; Time-TimeString1 = ;Time-TimeString2 = :;h2=Time-TimeString2; if(hide_minTimeString3 = Time-Minute/10 + 0; Time-TimeStri

21、ng4 = Time-Minute%10 + 0; h3=Time-TimeString3; h4=Time-TimeString4; else Time-TimeString3 = ; Time-TimeString4 = ; Time-TimeString5 = :;h5=Time-TimeString5; if(hide_secTimeString6 = Time-Second/10 + 0; Time-TimeString7 = Time-Second%10 + 0; h6=Time-TimeString6; h7=Time-TimeString7; else Time-TimeStr

22、ing6 = ; Time-TimeString7 = ; Time-DateString8 = 0;if (a1=h4)&(a2=h3)&(a30;i-) DQ = 0; / 给脉冲信号 dat=1; /数据右移一位 DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; /按位或,取最高位 delay_18B20(4); return(dat);/*ds18b20写一个字节*/ void WriteOneChar(uchar dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; /取最低位 delay_

23、18B20(5); DQ = 1; /上升沿将数据送入 dat=1; /*读取ds18b20当前温度*/void ReadTemp(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换delay_18B20(100); / this message is wery importantInit_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作Writ

24、eOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(100);a=ReadOneChar(); /读取温度值低位b=ReadOneChar(); /读取温度值高位temp_value=b4;/取温度值的地位的高四位,右移四位后与温度的高四位相加得到温度值if (temp_value=UpperLimit) wireless_1 =0;fan=1; else wireless_1 =1;fan=0; if (temp_valueLowerBonud)&(temp_valueUpperLimit) wireless_2 =0; else w

25、ireless_2 =1;if (temp_value=LowerBonud) wireless_3 =0; else wireless_3 =1; void temp_to_str() /温度数据转换成液晶字符显示 TempBuffer0=temp_value/10+0; /十位 TempBuffer1=temp_value%10+0; /个位 TempBuffer2=0xdf; /温度符号 TempBuffer3=C; TempBuffer4=0;void Delay1ms(unsigned int count)unsigned int i,j;for(i=0;icount;i+)for(

26、j=0;j0;delay-) for(i=0;i32;i+); /1ms延时. /*阳历转换阴历*/code unsigned char year_code597= 0x04,0xAe,0x53, /1901 0 0x0A,0x57,0x48, /1902 3 0x55,0x26,0xBd, /1903 6 0x0d,0x26,0x50, /1904 9 0x0d,0x95,0x44, /1905 12 0x46,0xAA,0xB9, /1906 15 0x05,0x6A,0x4d, /1907 18 0x09,0xAd,0x42, /1908 21 0x24,0xAe,0xB6, /1909

27、 0x04,0xAe,0x4A, /1910 0x6A,0x4d,0xBe, /1911 0x0A,0x4d,0x52, /1912 0x0d,0x25,0x46, /1913 0x5d,0x52,0xBA, /1914 0x0B,0x54,0x4e, /1915 0x0d,0x6A,0x43, /1916 0x29,0x6d,0x37, /1917 0x09,0x5B,0x4B, /1918 0x74,0x9B,0xC1, /1919 0x04,0x97,0x54, /1920 0x0A,0x4B,0x48, /1921 0x5B,0x25,0xBC, /1922 0x06,0xA5,0x5

28、0, /1923 0x06,0xd4,0x45, /1924 0x4A,0xdA,0xB8, /1925 0x02,0xB6,0x4d, /1926 0x09,0x57,0x42, /1927 0x24,0x97,0xB7, /1928 0x04,0x97,0x4A, /1929 0x66,0x4B,0x3e, /1930 0x0d,0x4A,0x51, /1931 0x0e,0xA5,0x46, /1932 0x56,0xd4,0xBA, /1933 0x05,0xAd,0x4e, /1934 0x02,0xB6,0x44, /1935 0x39,0x37,0x38, /1936 0x09,

29、0x2e,0x4B, /1937 0x7C,0x96,0xBf, /1938 0x0C,0x95,0x53, /1939 0x0d,0x4A,0x48, /1940 0x6d,0xA5,0x3B, /1941 0x0B,0x55,0x4f, /1942 0x05,0x6A,0x45, /1943 0x4A,0xAd,0xB9, /1944 0x02,0x5d,0x4d, /1945 0x09,0x2d,0x42, /1946 0x2C,0x95,0xB6, /1947 0x0A,0x95,0x4A, /1948 0x7B,0x4A,0xBd, /1949 0x06,0xCA,0x51, /1950 0x0B,0x55,0x46, /1951 0x55,0x5A,0xBB, /1952 0x04,0xdA,0x4e, /1953 0x0A,0x5B,0x43, /1954 0x35,0x2B,0xB8, /1955 0x05,0x2B,0x4C, /1956 0x8A,0x95,0x3f, /1957 0x0e,0x95,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号