day55,page70

程序员生存定律page129

新编大众菜谱page221


main()

{

int a,b,c,d;

unsigned u;

a=12;b=-24;u=10;

c=a+u;d=b+u;

printf(“a+u=%d,b+u=%d\n”,c,d);

}


#include <reg51.h> #include <string.h> #include <intrins.h> // 引脚定义 sbit RS = P2^6; sbit RW = P2^5; sbit E = P2^7; sbit LED = P2^0; // LED引脚(P2^0) sbit k1 = P3^1; // 时/年/闹钟时 sbit k2 = P3^0; // 分/月/闹钟分 sbit k3 = P3^2; // 秒/日/闹钟开关 sbit k4 = P3^3; // 切换显示页面(1-年月日/2-温度/3-闹钟/4-原界面) sbit DQ = P3^7; // 温度传感器引脚 sbit BUZZER = P3^6; // 蜂鸣器引脚 // 时间和日期变量 char year = 24, month = 8, day = 25; // 年(2024),月,日 char hour = 8, minute = 0, second = 0; // 时,分,秒 unsigned int count = 0; // 定时器计数 // 闹钟变量 char alarm_hour = 7; char alarm_minute = 30; bit alarm_enabled = 1; bit alarm_ringing = 0; bit alarm_triggered = 0; // 防止重复触发 // 温度相关变量 float temperature = 25.0; // 当前温度值 bit temp_alarm = 0; // 温度报警标志 bit sensor_status = 0; // 传感器状态 // 页面显示变量 - K4按1-4次对应0-3 unsigned char current_page = 0; // 0-原时间界面,1-年月日调整,2-温度界面,3-闹钟调整 // 星期字符串 char *weekdays[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"}; // 按键状态变量 bit k1_pressed = 0; bit k2_pressed = 0; bit k3_pressed = 0; bit k4_pressed = 0; // 长按检测变量 unsigned char k1_press_count = 0; unsigned char k2_press_count = 0; unsigned char k3_press_count = 0; // 整点报时相关 bit chime_done = 0; unsigned char chime_count = 0; // 整点报时计数器 // 蜂鸣器控制 unsigned char buzzer_mode = 0; // 0-关闭,1-闹钟,2-温度,3-整点,4-按键提示 unsigned int buzzer_timer = 0; // 蜂鸣器计时器 bit buzzer_state = 0; // 蜂鸣器当前状态 // 温度读取定时 unsigned int temp_read_timer = 0; // 温度读取定时器(ms) bit temp_read_flag = 0; // 温度读取标志 // LED控制变量(新增) unsigned int led_timer = 0; // LED闪烁计时器 bit led_state = 0; // LED当前状态(0-灭,1-亮) // 显示缓存 char str1[17]; // 第一行显示缓存 char str2[17]; // 第二行显示缓存 bit display_update = 1; // 显示更新标志 // 全局变量用于日期和时间计算 char last_day = 0; char weekday = 0; char last_hour = 0; // 蜂鸣器控制宏定义(适配NPN三极管) #define BUZZER_ON BUZZER = 0 #define BUZZER_OFF BUZZER = 1 // -------------------------- 精确延时函数(基于11.0592MHz晶振) -------------------------- // 10us延时 void delay_10us(unsigned int t) { while(t--) { _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); } } // ms延时 void delay_ms(unsigned int ms) { unsigned int i, j; for(i = 0; i < ms; i++) for(j = 0; j < 114; j++); } // -------------------------- DS18B20通信时序 -------------------------- // 单总线初始化 unsigned char OneWire_Init(void) { unsigned char i; unsigned char AckBit; DQ=1; DQ=0; i = 247;while (--i); // Delay 500us DQ=1; i = 32;while (--i); // Delay 70us AckBit=DQ; i = 247;while (--i); // Delay 500us return AckBit; } // 单总线发送一位 void OneWire_SendBit(unsigned char Bit) { unsigned char i; DQ=0; i = 4;while (--i); // Delay 10us DQ=Bit; i = 24;while (--i); // Delay 50us DQ=1; } // 单总线接收一位 unsigned char OneWire_ReceiveBit(void) { unsigned char i; unsigned char Bit; DQ=0; i = 2;while (--i); // Delay 5us DQ=1; i = 2;while (--i); // Delay 5us Bit=DQ; i = 24;while (--i); // Delay 50us return Bit; } // 单总线发送一个字节 void OneWire_SendByte(unsigned char Byte) { unsigned char i; for(i=0;i<8;i++) { OneWire_SendBit(Byte&(0x01<<i)); } } // 单总线接收一个字节 unsigned char OneWire_ReceiveByte(void) { unsigned char i; unsigned char Byte=0x00; for(i=0;i<8;i++) { if(OneWire_ReceiveBit()){Byte|=(0x01<<i);} } return Byte; } // DS18B20指令 #define DS18B20_SKIP_ROM 0xCC #define DS18B20_CONVERT_T 0x44 #define DS18B20_READ_SCRATCHPAD 0xBE // DS18B20开始温度变换 void DS18B20_ConvertT(void) { OneWire_Init(); OneWire_SendByte(DS18B20_SKIP_ROM); OneWire_SendByte(DS18B20_CONVERT_T); } // DS18B20读取温度 float DS18B20_ReadT(void) { unsigned char TLSB,TMSB; int Temp; float T; OneWire_Init(); OneWire_SendByte(DS18B20_SKIP_ROM); OneWire_SendByte(DS18B20_READ_SCRATCHPAD); TLSB=OneWire_ReceiveByte(); TMSB=OneWire_ReceiveByte(); Temp=(TMSB<<8)|TLSB; T=Temp/16.0; return T; } // 温度读取 float read_temp(void) { unsigned int wait_cnt = 0; float temp = 999.0; // 默认错误值 if(OneWire_Init() != 0) { // 传感器不存在 return 999.0; } DS18B20_ConvertT(); // 启动转换 while(wait_cnt < 80) { // 等待400ms delay_ms(5); wait_cnt++; } temp = DS18B20_ReadT(); // 读取温度 // 范围校验 if(temp < -55 || temp > 125) { return 999.0; } return temp; } // 传感器测试 bit test_temp_sensor(void) { unsigned char i; bit result = 1; for(i = 0; i < 3; i++) { if(OneWire_Init() != 0) result = 0; delay_ms(100); } return result; } // -------------------------- LCD显示优化 -------------------------- void sentcmd(unsigned char cmd) { RS = 0; RW = 0; P0 = cmd; E = 1; _nop_(); _nop_(); E = 0; delay_10us(5); } void sentdata(unsigned char dat) { RS = 1; RW = 0; P0 = dat; E = 1; _nop_(); _nop_(); E = 0; delay_10us(5); } // 固定显示16个字符 void display(char str[], char i) { unsigned char j; if(i == 1) { sentcmd(0x80); // 第一行 } else { sentcmd(0xC0); // 第二行 } delay_ms(1); for(j = 0; j < 16; j++) { sentdata(str[j]); delay_ms(1); } } void init() { delay_ms(20); BUZZER_OFF; LED = 0; // 初始化LED为灭(新增) // LCD初始化 sentcmd(0x38); delay_ms(5); sentcmd(0x38); delay_ms(5); sentcmd(0x01); delay_ms(2); sentcmd(0x0C); delay_ms(1); // 开显示,关光标 sentcmd(0x06); delay_ms(1); // 增量显示 } // -------------------------- 时间日期计算优化 -------------------------- bit is_leap_year(char y) { int year_full = 2000 + y; return ((year_full % 4 == 0 && year_full % 100 != 0) || (year_full % 400 == 0)) ? 1 : 0; } char get_days_in_month(char y, char m) { if(m == 2) return is_leap_year(y) ? 29 : 28; if(m == 4 || m == 6 || m == 9 || m == 11) return 30; return 31; } char calculate_weekday(char y, char m, char d) { char month_adj, year_adj; int year_full, j, h; year_full = 2000 + y; if (m < 3) { month_adj = m + 12; year_full--; } else { month_adj = m; } year_adj = year_full % 100; j = year_full / 100; h = (d + ((13 * (month_adj + 1)) / 5) + year_adj + (year_adj / 4) + (j / 4) - 2 * j) % 7; return h < 0 ? h + 7 : h; } // -------------------------- 蜂鸣器控制 -------------------------- void set_buzzer(unsigned char mode) { buzzer_mode = mode; buzzer_timer = 0; buzzer_state = 0; chime_count = 0; switch(mode) { case 0: // 关闭 BUZZER_OFF; break; case 1: // 闹钟(500ms周期) case 2: // 温度报警(200ms周期) case 3: // 整点报时(250ms周期) case 4: // 按键提示(100ms) BUZZER_ON; buzzer_state = 1; break; } } // -------------------------- 定时器0中断 -------------------------- void time() { TMOD = 0x01; // 定时器0模式1(16位) TH0 = 0xFC; // 初值:1ms中断(11.0592MHz) TL0 = 0x18; ET0 = 1; // 使能定时器0中断 EA = 1; // 开总中断 TR0 = 1; // 启动定时器0 } void timer0_isr() interrupt 1 using 1 { TH0 = 0xFC; TL0 = 0x18; count++; led_timer++; // LED计时器累加(新增) // 1ms中断×1000 = 1秒 if(count >= 1000) { count = 0; second++; chime_done = 0; // 秒→分→时→日→月→年进位 if(second >= 60) { second = 0; minute++; if(minute >= 60) { minute = 0; hour++; if(hour >= 24) { hour = 0; day++; if(day > get_days_in_month(year, month)) { day = 1; month++; if(month > 12) { month = 1; year++; if(year >= 100) year = 0; } } } } } } // 蜂鸣器控制 buzzer_timer++; switch(buzzer_mode) { case 1: // 闹钟(500ms周期) if(buzzer_timer >= 500) { buzzer_timer = 0; buzzer_state = !buzzer_state; if(buzzer_state) BUZZER_ON; else BUZZER_OFF; } break; case 2: // 温度报警(200ms周期) if(buzzer_timer >= 200) { buzzer_timer = 0; buzzer_state = !buzzer_state; if(buzzer_state) BUZZER_ON; else BUZZER_OFF; } break; case 3: // 整点报时(250ms周期,响3次) if(buzzer_timer >= 250) { buzzer_timer = 0; buzzer_state = !buzzer_state; if(buzzer_state) BUZZER_ON; else BUZZER_OFF; if(++chime_count >= 6) { // 3次响+3次停 chime_count = 0; set_buzzer(0); } } break; case 4: // 按键提示(100ms) if(buzzer_timer >= 100) { set_buzzer(0); } break; } // LED闪烁控制(新增):温度报警时500ms闪烁一次,否则灭 if(temp_alarm) { if(led_timer >= 500) { // 500ms切换一次LED状态 led_timer = 0; led_state = !led_state; LED = led_state; } } else { LED = 0; // 非温度报警时LED灭 led_timer = 0; // 重置计时器 led_state = 0; // 重置状态 } // 温度读取定时 temp_read_timer++; } // -------------------------- 按键检测优化 -------------------------- void key() { // K4按键逻辑:按1-4次循环切换页面 if(k4 == 0) { delay_ms(20); // 消抖 if(k4 == 0) { current_page++; // 每次按下计数加1 if(current_page >= 4) { // 按到第4次回到原界面 current_page = 0; } set_buzzer(4); // 按键提示音 display_update = 1; // 更新显示 delay_ms(300); // 防连按 } } // 根据当前页面处理其他按键 switch(current_page) { // 页面0:原时间显示界面(K4按4次) case 0: // 调整时间 if(k1 == 0) // 调整小时 { delay_ms(20); if(k1 == 0) { hour++; if(hour >= 24) hour = 0; display_update = 1; set_buzzer(4); delay_ms(300); } } if(k2 == 0) // 调整分钟 { delay_ms(10); if(k2 == 0) { minute++; if(minute >= 60) minute = 0; display_update = 1; set_buzzer(4); delay_ms(200); } } if(k3 == 0) // 调整秒钟 { delay_ms(20); if(k3 == 0) { second++; if(second >= 60) second = 0; display_update = 1; set_buzzer(4); delay_ms(300); } } break; // 页面1:年月日调整界面(K4按1次) case 1: if(k1 == 0) // 调整年份 { delay_ms(20); if(k1 == 0) { year++; if(year >= 100) year = 0; display_update = 1; set_buzzer(4); delay_ms(300); } } if(k2 == 0) // 调整月份 { delay_ms(20); if(k2 == 0) { month++; if(month > 12) month = 1; display_update = 1; set_buzzer(4); delay_ms(300); } } if(k3 == 0) // 调整日期 { delay_ms(20); if(k3 == 0) { day++; if(day > get_days_in_month(year, month)) day = 1; display_update = 1; set_buzzer(4); delay_ms(300); } } break; // 页面2:温度界面(K4按2次) case 2: // 温度界面无按键操作,仅显示 break; // 页面3:闹钟调整模式(K4按3次) case 3: if(k1 == 0) // 调整闹钟小时 { delay_ms(20); if(k1 == 0) { alarm_hour++; if(alarm_hour >= 24) alarm_hour = 0; display_update = 1; set_buzzer(4); delay_ms(300); } } if(k2 == 0) // 调整闹钟分钟 { delay_ms(20); if(k2 == 0) { alarm_minute++; if(alarm_minute >= 60) alarm_minute = 0; display_update = 1; set_buzzer(4); delay_ms(300); } } if(k3 == 0) // 切换闹钟开关 { delay_ms(20); if(k3 == 0) { alarm_enabled = !alarm_enabled; display_update = 1; set_buzzer(4); delay_ms(300); } } break; } // 停止闹钟/温度报警(任意按键) if(alarm_ringing || temp_alarm) { if(k1 == 0 || k2 == 0 || k3 == 0 || k4 == 0) { delay_ms(10); if(k1 == 0 || k2 == 0 || k3 == 0 || k4 == 0) { alarm_ringing = 0; temp_alarm = 0; set_buzzer(0); delay_ms(300); } } } } // -------------------------- 显示更新函数 -------------------------- void update_display() { unsigned char i; int int_part; // 温度整数部分 unsigned int dec_part; // 温度小数部分 // 星期计算(仅当日期变化时) if(day != last_day) { weekday = calculate_weekday(year, month, day); last_day = day; } // 页面显示逻辑 switch(current_page) { // 页面0:原时间界面(K4按4次) case 0: // 第一行:2024-08-25 SUN str1[0] = '2'; str1[1] = '0'; str1[2] = (year / 10) + '0'; str1[3] = (year % 10) + '0'; str1[4] = '-'; str1[5] = (month / 10) ? (month / 10) + '0' : '0'; str1[6] = (month % 10) + '0'; str1[7] = '-'; str1[8] = (day / 10) ? (day / 10) + '0' : '0'; str1[9] = (day % 10) + '0'; str1[10] = ' '; str1[11] = weekdays[weekday][0]; str1[12] = weekdays[weekday][1]; str1[13] = weekdays[weekday][2]; for(i = 14; i < 16; i++) str1[i] = ' ';//剩下位置与空格补齐 // 第二行:08:00:00 str2[0] = (hour / 10) ? (hour / 10) + '0' : '0'; str2[1] = (hour % 10) + '0'; str2[2] = ':'; str2[3] = (minute / 10) ? (minute / 10) + '0' : '0'; str2[4] = (minute % 10) + '0'; str2[5] = ':'; str2[6] = (second / 10) ? (second / 10) + '0' : '0'; str2[7] = (second % 10) + '0'; str2[8] = ' '; str2[9] = ' '; str2[10] = ' '; str2[11] = 'Y'; str2[12] = 'X'; str2[13] = 'Q'; for(i = 14; i < 16; i++) str2[i] = ' '; break; // 页面1:年月日调整界面(K4按1次) case 1: // 第一行:Date Set str1[0] = 'Y'; str1[1] = 'e'; str1[2] = 'a'; str1[3] = 'r'; str1[4] = ':'; str1[5] = ' '; str1[6] = ' '; str1[7] = ' '; for(i = 8; i < 16; i++) str1[i] = ' '; // 第二行:2024-08-25 str2[0] = '2'; str2[1] = '0'; str2[2] = (year / 10) + '0'; str2[3] = (year % 10) + '0'; str2[4] = '-'; str2[5] = (month / 10) ? (month / 10) + '0' : '0'; str2[6] = (month % 10) + '0'; str2[7] = '-'; str2[8] = (day / 10) ? (day / 10) + '0' : '0'; str2[9] = (day % 10) + '0'; for(i = 10; i < 16; i++) str2[i] = ' '; break; // 页面2:温度界面(K4按2次) case 2: // 第一行:Temperature: str1[0] = 'T'; str1[1] = 'e'; str1[2] = 'm'; str1[3] = 'p'; str1[4] = 'e'; str1[5] = 'r'; str1[6] = 'a'; str1[7] = 't'; str1[8] = 'u'; str1[9] = 'r'; str1[10] = 'e'; str1[11] = ':'; for(i = 12; i < 16; i++) str1[i] = ' '; // 第二行:显示带小数的温度 memset(str2, ' ', 16); if(temperature == 999.0) { str2[7] = 'E'; str2[8] = 'R'; str2[9] = 'R'; // 错误提示 } else if(temperature < 0) { str2[6] = '-'; int_part = (int)(-temperature); dec_part = (unsigned int)((-temperature - int_part) * 10); str2[7] = (int_part / 10) + '0'; str2[8] = (int_part % 10) + '0'; str2[9] = '.'; str2[10] = dec_part + '0'; str2[11] = 'C'; } else { str2[6] = ' '; int_part = (int)temperature; dec_part = (unsigned int)((temperature - int_part) * 10); str2[7] = (int_part / 10) + '0'; str2[8] = (int_part % 10) + '0'; str2[9] = '.'; str2[10] = dec_part + '0'; str2[11] = 'C'; } break; // 页面3:闹钟调整模式(K4按3次) case 3: // 第一行:Alarm Set [ON/OFF] str1[0] = 'A'; str1[1] = 'l'; str1[2] = 'a'; str1[3] = 'r'; str1[4] = 'm'; str1[5] = ':'; str1[6] = ' '; str1[7] = ' '; str1[8] = ' '; str1[9] = ' '; str1[10] = ' '; str1[11] = alarm_enabled ? 'O' : 'F'; str1[12] = alarm_enabled ? 'N' : 'F'; str1[13] = ' '; for(i = 14; i < 16; i++) str1[i] = ' '; // 第二行:07:30 memset(str2, ' ', 16); str2[7] = (alarm_hour / 10) ? (alarm_hour / 10) + '0' : '0'; str2[8] = (alarm_hour % 10) + '0'; str2[9] = ':'; str2[10] = (alarm_minute / 10) ? (alarm_minute / 10) + '0' : '0'; str2[11] = (alarm_minute % 10) + '0'; break; } // 刷新LCD显示 display(str1, 1); display(str2, 2); display_update = 0; } // -------------------------- 主函数 -------------------------- void main() { unsigned char i; // 初始化显示缓存为空格 for(i = 0; i < 16; i++) { str1[i] = ' '; str2[i] = ' '; } str1[16] = '\0'; str2[16] = '\0'; // 硬件初始化 init(); // LCD初始化 time(); // 定时器0初始化 sensor_status = test_temp_sensor(); // 检测温度传感器 DS18B20_ConvertT(); // 上电先转换一次温度 delay_ms(500); // 等待转换完成 while(1) { // 每1秒读取一次温度 if(temp_read_timer >= 1000 && !temp_read_flag) { temp_read_timer = 0; DS18B20_ConvertT(); delay_ms(75); temperature = DS18B20_ReadT(); // 温度报警判断(5℃~35℃为正常范围) temp_alarm = (temperature != 999.0 && (temperature < 5 || temperature > 35)) ? 1 : 0; temp_read_flag = 1; display_update = 1; } if(temp_read_flag && temp_read_timer > 100) { temp_read_flag = 0; } // 整点报时 if(minute == 0 && second == 0 && hour != last_hour) { set_buzzer(3); last_hour = hour; } // 闹钟判断 if(alarm_enabled && !alarm_ringing) { if(hour == alarm_hour && minute == alarm_minute && second == 0 && !alarm_triggered) { alarm_ringing = 1; alarm_triggered = 1; set_buzzer(1); } } else if(second != 0) { alarm_triggered = 0; } // 按键检测 key(); // 更新显示 if(display_update) { update_display(); } } }保留代码全部功能,精简代码
09-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值