找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机公交车报站Proteus仿真+源程序

[复制链接]
跳转到指定楼层
楼主
附件proteus8.7版本的仿真图keil4的程序文件,还可以显示温度,温度代码还在完善中

51公交车报站仿真可以显示时间,自动手动报站显示上行下行


lcd12864可以显示ds1302的时间可以通过三个按键调试时间


单片机源程序如下:
  1. /*
  2. * 功能:51公交车报站仿真
  3. *作者:单片机爱好者
  4. *
  5. */
  6. #include "main.h"    //包含头文件main.h
  7. #include "LCD.h"   //包含头文件LCD.h
  8. #include "DS1302.h"   //包含头文件DS1302.h
  9. #include "word.h"   //包含头文件word.h
  10. #include "lunar_calendar.h" //包含头文件lunar_calendar.h
  11. #include "buzz.h"   //包含头文件buzz.h

  12. TIME time, tmp_time;        //时间变量
  13. ALARM alarm;    //时间变量
  14. bit Alarm_flag=0;   //时间变量
  15. bit Clock_flag=0;   //时间变量
  16. bit flag=0;     //时间变量
  17. int8 flat=0;
  18. sbit DQ=P2^6;   //DS18B20 pin 温度传感器引脚
  19. //*************上下行手动自动****************
  20. char code shang[]={
  21. /*--  文字:  上  --*/
  22. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  23. 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,
  24. 0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00
  25. };
  26.    char code xia[]={
  27. /*--  文字:  下  --*/
  28. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  29. 0x02,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x42,0x82,0x02,0x02,0x02,0x02,0x00,
  30. 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00
  31. };
  32.     char code xing[]={
  33. /*--  文字:  行  --*/
  34. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  35. 0x00,0x10,0x88,0xC4,0x33,0x00,0x40,0x42,0x42,0x42,0xC2,0x42,0x42,0x42,0x40,0x00,
  36. 0x02,0x01,0x00,0xFF,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00
  37. };
  38.     char code shou[]={
  39. /*--  文字:  手  --*/
  40. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  41. 0x00,0x00,0x24,0x24,0x24,0x24,0x24,0xFC,0x22,0x22,0x22,0x23,0x22,0x00,0x00,0x00,
  42. 0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00
  43. };
  44.      char code zi[]={
  45. /*--  文字:  自  --*/
  46. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  47. 0x00,0x00,0x00,0xF8,0x88,0x8C,0x8A,0x89,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,0x00,
  48. 0x00,0x00,0x00,0xFF,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,0x00
  49. };
  50.       char code dong[]={
  51. /*--  文字:  动  --*/
  52. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  53. 0x40,0x44,0xC4,0x44,0x44,0x44,0x40,0x10,0x10,0xFF,0x10,0x10,0x10,0xF0,0x00,0x00,
  54. 0x10,0x3C,0x13,0x10,0x14,0xB8,0x40,0x30,0x0E,0x01,0x40,0x80,0x40,0x3F,0x00,0x00
  55. };
  56. //****************************
  57. char code ming[]={
  58. /*--  文字:  名  --*/
  59. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  60. 0x00,0x20,0x20,0x10,0x08,0x14,0x67,0x84,0x44,0x24,0x14,0x0C,0x00,0x00,0x00,0x00,
  61. 0x04,0x04,0x04,0x02,0xFE,0x43,0x43,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00
  62. };
  63. char code zhan[]={
  64. /*--  文字:  站  --*/
  65. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  66. 0x00,0xC8,0x08,0x09,0x0E,0xE8,0x08,0x00,0x00,0x00,0xFF,0x10,0x10,0x10,0x10,0x00,
  67. 0x10,0x30,0x17,0x10,0x0E,0x09,0x08,0xFF,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00
  68. };
  69. char code m[]={
  70. /*--  文字:  :  --*/
  71. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  72. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  73. 0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  74. };
  75. char code yi[]={
  76. /*--  文字:  一  --*/
  77. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  78. 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
  79. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  80. };
  81. char code er[]={
  82. /*--  文字:  二  --*/
  83. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  84. 0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,
  85. 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00
  86. };
  87. char code san[]={
  88. /*--  文字:  三  --*/
  89. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  90. 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
  91. 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00
  92. };
  93. char code si[]={
  94. /*--  文字:  四  --*/
  95. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  96. 0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
  97. 0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00
  98. };
  99. char code wu[]={
  100. /*--  文字:  五  --*/
  101. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  102. 0x00,0x02,0x42,0x42,0x42,0xC2,0x7E,0x42,0x42,0x42,0x42,0xC2,0x02,0x02,0x00,0x00,
  103. 0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x00
  104. };
  105. char code liu[]={
  106. /*--  文字:  六  --*/
  107. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  108. 0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2C,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
  109. 0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x60,0x00,0x00
  110. };
  111. char code qi[]={
  112. /*--  文字:  七  --*/
  113. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  114. 0x80,0x80,0x80,0x80,0x80,0x40,0xFF,0x40,0x40,0x40,0x20,0x20,0x20,0x20,0x00,0x00,
  115. 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x00
  116. };
  117. char code ba[]={
  118. /*--  文字:  八  --*/
  119. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  120. 0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x7E,0x80,0x00,0x00,0x00,0x00,0x00,
  121. 0x00,0x80,0x60,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x00
  122. };
  123. char code jiu[]={
  124. /*--  文字:  九  --*/
  125. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  126. 0x00,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,
  127. 0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x78,0x00
  128. };
  129. char code ssi[]={
  130. /*--  文字:  十  --*/
  131. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  132. 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
  133. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  134. };
  135. //-----------------18B20-----------------------
  136. unsigned char L_18B20,H_18B20,zhengshu,shangwen,xiawen;  //温度用变量
  137. unsigned int fg=0,xiaoshu_a;       //温度用变量
  138. //-----------------18B20----------------------
  139. //-------------音乐-----------------------------
  140. /*
  141. uint8 code SONG_TONE[]=          //音乐数据
  142. {
  143.   212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,129,169,190,119,119,126,159,142,159,0
  144. };
  145. uint8 code SONG_LONG[]=//
  146. {
  147.   9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0
  148. };   */
  149. uint8 code SONG_TONE[]=          //音乐数据
  150. {
  151.   212,212,0
  152. };
  153. uint8 code SONG_LONG[]=//
  154. {
  155.   9,3,0
  156. };
  157. //------------------------------------------------------------
  158. void delay(uint16 n)//延时us级
  159. {
  160. while (n--);
  161. }
  162. //************************************************************************/
  163. // 函数: LCD_Delay()
  164. // 描述: 延时t ms函数
  165. // 参数: t
  166. // 返回: 无
  167. // 备注: 11.0592MHZ       t=1延时时间约1ms
  168. // 版本:  2011/01/01      First version
  169. //************************************************************************/
  170. void Delay_nms(unsigned int t)
  171. {
  172. unsigned int i,j;
  173. for(i=0;i<t;i++)      //循环t次
  174. for(j=0;j<113;j++)   //循环113次 每次约3us
  175. ;
  176. }
  177. /////////////////////////////////////////////////
  178. //-----------播放音乐----------------------------
  179. void PlayMusic()
  180. {
  181.   uint16 i =0,j,k;
  182. while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
  183. {
  184.    for(j=0;j<SONG_LONG[i]*20;j++)   //读取数据
  185.   {
  186.     BEEP = ~BEEP;     //蜂鸣器取反
  187.    for(k=0;k<SONG_TONE[i]/3;k++);  //读取数据
  188.   }
  189.   Delay_nms(10);      //延时10ms
  190.   i++;                        //累加1
  191. }
  192. BEEP =1;        //关闭蜂鸣器
  193. }
  194. /////////////////////////////////////////////////
  195. /*------DS18B20------*/
  196. void delay_18B20(unsigned int i)
  197. {
  198. while(i--);
  199. }
  200. /*DS18B20的复位脉冲 主机通过拉低单总线至少480us以产生复位脉冲
  201.   然后主机释放单总线并进入接收模式 此时单总线电平被拉高
  202.   DS18B20检测到上升沿后 延时15~60us,拉低总线60~240us产生应答脉冲  */      
  203. void Init_DS18B20(void)
  204. {
  205.   unsigned char x=0;
  206.   DQ = 1;          //DQ复位
  207.   delay_18B20(8);  //稍做延时
  208.   DQ = 0;          //单片机将DQ拉低
  209.   delay_18B20(80); //精确延时 大于 480us
  210.   DQ = 1;          //拉高总线
  211.   delay_18B20(14); //延时
  212.   x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  213.   delay_18B20(20); //延时
  214. }
  215. /*写时隙 主机在写1时隙向DS18B20写入1,在写0时隙向DS18B20写入0
  216.   所有写时隙至少需要60us,且在两次写时隙之间至少需要1us的恢复时间
  217.   两种写时隙均以主机拉低总线开始
  218.   产生写1时隙:主机拉低总线后,必须在15us内释放总线,由上拉电阻拉回至高电平
  219.   产生写0时隙:主机拉低总线后,必须整个时隙保持低电平 */
  220. void WriteOneChar(unsigned char dat)
  221. {
  222.   unsigned char i=0;
  223.   for (i=8; i>0; i--)//循环8次
  224.   {
  225.     DQ = 0;   //DQ输出0
  226.    DQ = dat&0x01;
  227.      delay_18B20(5); //延时
  228.    DQ = 1;         //DQ输出1
  229.      dat>>=1;        //右移位
  230. }
  231. }
  232.   
  233. /*所有读时隙至少60us 且两次独立的读时隙之间至少需要1us的恢复时间
  234.   每次读时隙由主机发起,拉低总线至少1us。
  235.   若传1,则保持总线高电平;若发送0,则拉低总线
  236.   传0时DS18B20在该时隙结束时释放总线,再拉回高电平状态,主机必须在读时隙开始后的15us内释放总线,并保持采样总线状态 */
  237. unsigned char ReadOneChar(void)
  238. {
  239. unsigned char i=0;
  240. unsigned char dat = 0;
  241. for (i=8;i>0;i--)
  242.   {
  243.     DQ = 0;   // 给脉冲信号
  244.     dat>>=1;      //移位
  245.     DQ = 1;   // 给脉冲信号
  246.     if(DQ)       //如果DQ=1,执行下面的语句   
  247.     dat|=0x80;
  248.     delay_18B20(4);//延时
  249.   }
  250.   return(dat);  //返回数据
  251. }
  252.    
  253. void read_18B20(void)
  254. {
  255. Init_DS18B20();
  256. WriteOneChar(0xCC);     // 跳过读序号列号的操作
  257. WriteOneChar(0x44);  // 启动温度转换
  258. delay_18B20(100);       // this message is wery important
  259. Init_DS18B20();   //初始化DS18B20
  260. WriteOneChar(0xCC);  //跳过读序号列号的操作
  261. WriteOneChar(0xBE);  //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  262. delay_18B20(100);  //延时
  263. L_18B20=ReadOneChar(); //读取低八位数据
  264. H_18B20=ReadOneChar(); //读取高八位数据
  265. zhengshu=L_18B20/16+H_18B20*16; //整数部分
  266. xiaoshu_a=(L_18B20&0x0f)*10/16; //小数第一位
  267. }
  268. //------------------DS18B20---------------------
  269. /////////////////////////////////////////////////
  270. /*
  271. * 按键扫描
  272. */
  273. int8 scan_key(void)
  274. {
  275. int8 val=-1;           //初始化键值为-1
  276. if (KeyIn1 == 0)   //判断=0?有无按键按键
  277. {
  278.   val = 1;    //键值=1
  279.   while (KeyIn1 == 0); //等待按键释放
  280. }
  281. else if (KeyIn2 == 0)  //判断=0?有无按键按键
  282. {
  283.   val = 2;   //键值=2
  284.   while (KeyIn2 == 0);//等待按键释放
  285. }
  286. else if (KeyIn3 == 0) //判断=0?有无按键按键
  287. {
  288.   val = 3;   //键值=3
  289.   while (KeyIn3 == 0);//等待按键释放
  290. }
  291. //if (val > 0)
  292.   //buzzer_sound();
  293. return val;    //返回键值
  294. }
  295. /*************
  296. *  手动/自动按键
  297. ***************/
  298.   int8 scan_key_1(void)
  299. {
  300. // int8 flat=0;           //初始化键值为-1
  301. if (KeyIna == 0)   //判断=0?有无按键按键
  302. {
  303.   flat = 11;    //键值=1
  304.   while (KeyIna == 0); //等待按键释放
  305. }
  306. else if (KeyInb == 0)  //判断=0?有无按键按键
  307. {
  308.   flat ++;   //键值=2
  309.   
  310.   while (KeyInb == 0);//等待按键释放
  311. }

  312. return flat;    //返回键值
  313. }
  314. /*
  315. * 主界面框架
  316. */
  317. void main_frame(void)
  318. {
  319. play32(80, 2, 10); //显示数
  320. play32(32, 2, 10); //显示数
  321. play8(16, 0, S_xie);//显示斜线
  322. play8(40, 0, S_xie);//显示斜线
  323. // play8(96, 0, RH);
  324. // play8(120, 0, S_percent);
  325. // play8(120, 6, S_du);//显示度
  326. }
  327. /*
  328. * 主界面
  329. */
  330. void main_show(bit refresh)
  331. {
  332. //    uint8  lunar[2];
  333. if (refresh)
  334.   read_time((uint8 *)&time);// 读时间函数// 时间              
  335. if (refresh || (time.sec != tmp_time.sec)) // 秒更新
  336. {
  337.   tmp_time.sec = time.sec;      //读取秒数据
  338.       //play8_num(104, 6,zhengshu);      //温度显示
  339.   play32_num(96, 2, time.sec);   //显示秒
  340. }
  341. if (refresh)
  342.   main_frame();//刷新界面
  343. if (refresh || (time.min != tmp_time.min)) // 分更新
  344. {
  345.   if (!refresh)
  346.    flag = 0;
  347.   tmp_time.min = time.min;//读取分
  348.   play32_num(48, 2, time.min); //显示分
  349. }
  350. if (refresh || (time.hour != tmp_time.hour)) // 时更新
  351. {
  352.   if ((!refresh)&&(Clock_flag))
  353.    alarm_sound();
  354.   tmp_time.hour = time.hour;     //读取时
  355.   play32_num(0, 2, time.hour);   //显示时
  356. }
  357. if (refresh || (time.day != tmp_time.day))  //日更新
  358. {
  359.   tmp_time.day = time.day;    //读取日
  360.   play8_num(48, 0, time.day);    //显示日
  361.   // 农历
  362.   //turn_lunar_calendar(&time, lunar);
  363.   //play_lunar_calendar(0, 6, lunar[0], lunar[1]);
  364. }
  365. if (refresh || (time.week != tmp_time.week)) // 周更新
  366. {
  367.   tmp_time.week = time.week;    //读取周
  368.   play_week(68, 0, time.week);   //显示周
  369. }
  370. if (refresh || (time.mon != tmp_time.mon))  // 月更新
  371. {
  372.   tmp_time.mon = time.mon;    //读取月
  373.   play8_num(24, 0, time.mon);    //显示月
  374.   // 农历
  375.   //turn_lunar_calendar(&time, lunar);    //转换农历月
  376.   //play_lunar_calendar(0, 6, lunar[0], lunar[1]); //显示农历月
  377. }
  378. if (refresh || (time.year != tmp_time.year)) // 年更新
  379. {
  380.   tmp_time.year = time.year;     //读取年数据
  381.   play8_num(0, 0, time.year);     //显示年
  382.   // 农历
  383. // turn_lunar_calendar(&time, lunar);    //转换农历年
  384. // play_lunar_calendar(0, 6, lunar[0], lunar[1]); //显示农历年
  385. }

  386. }
  387. /*
  388. * 主机界面设置
  389. */
  390. void main_set(void)
  391. {
  392. int8 key_val,state=1;     //变量
  393. play32_num(96, 2|0x80, time.sec); //显示秒   
  394. while (1)
  395. { key_val = scan_key();//键盘扫描
  396.   if (key_val == 1) // 设置
  397.   {
  398.    if (state >= 7)
  399.     state = 0;
  400.    else
  401.     state++;    //位置状态加1
  402.    set_time((uint8 *)&time); //设置时间
  403.    main_show(1);    //显示主界面
  404.    switch (state)
  405.    { case 0: set_time((uint8 *)&time); break;//设置时间
  406.     case 1: play32_num(96, 2|0x80, time.sec); break;//显示秒
  407.     case 2: play32_num(48, 2|0x80, time.min); break;//显示分
  408.     case 3: play32_num(0, 2|0x80, time.hour); break;//显示时
  409.     case 4: play_week(68, 0|0x80, time.week); break;//显示周
  410.     case 5: play8_num(48, 0|0x80, time.day); break; //显示日
  411.     case 6: play8_num(24, 0|0x80, time.mon); break; //显示月
  412.     case 7: play8_num(0, 0|0x80, time.year); break; //显示年
  413.     default: break;  //退出循环        
  414.    }
  415.   }
  416.   else if (key_val > 1)//按键值大于1
  417.   {
  418.    if (state == 1)//位置1设置秒
  419.    {
  420.     if (key_val == 3)//加按下?
  421.      time.sec++;//秒加1
  422.     else
  423.      time.sec--; //秒减1
  424.     if (time.sec >= 60)
  425.      time.sec = 0;
  426.     else if (time.sec < 0)
  427.      time.sec = 59;      
  428.     play32_num(96, 2|0x80, time.sec);//显示秒
  429.    }
  430.    else if (state == 2)    //位置2设置分
  431.    {
  432.     if (key_val == 3)    //加按下?
  433.      time.min++;     //加1
  434.     else
  435.      time.min--;     //减1
  436.     if (time.min >= 60)
  437.      time.min = 0;
  438.     else if (time.min < 0)
  439.      time.min = 59;
  440.     play32_num(48, 2|0x80, time.min);//显示分
  441.    }
  442.    else if (state == 3)    //位置3设置时
  443.    {  if (key_val == 3)    //加按下?
  444.      time.hour++;    //加1
  445.     else
  446.      time.hour--;    //减1
  447.     if (time.hour >= 24)
  448.      time.hour = 0;
  449.     else if (time.hour < 0)
  450.      time.hour = 23;
  451.     play32_num(0, 2|0x80, time.hour);//显示时
  452.    }
  453.    else if (state == 4)    //位置4设置周
  454.    {  if (key_val == 3)   //加按下?
  455.      time.week++;    //加1
  456.     else
  457.      time.week--;    //减1
  458.     if (time.week >= 8)
  459.      time.week = 1;
  460.     else if (time.week < 1)
  461.      time.week = 7;
  462.     play_week(68, 0|0x80, time.week);//显示周
  463.    }
  464.    else if (state == 5)//位置5设置日
  465.    {
  466.     if (key_val == 3)    //加按下?
  467.      time.day++;     //加1
  468.     else
  469.      time.day--;     //减1
  470.     if (time.day >= 32)
  471.      time.day = 1;
  472.     else if (time.day < 1)
  473.      time.day = 31;
  474.     play8_num(48, 0|0x80, time.day);//显示日
  475.    }
  476.    else if (state == 6)    //位置6设置月
  477.    {
  478.     if (key_val == 3)    //加按下?
  479.      time.mon++;     //加1
  480.     else
  481.      time.mon--;     //减1
  482.     if (time.mon >= 13)
  483.      time.mon = 1;
  484.     else if (time.mon < 1)
  485.      time.mon = 12;
  486.     play8_num(24, 0|0x80, time.mon);//显示月
  487.    }
  488.    else if (state == 7)    //位置7设置年
  489.    {
  490.     if (key_val == 3)    //加按下?
  491.      time.year++;    //加1
  492.     else
  493.      time.year--;    //减1
  494.     if (time.year >= 100)
  495.      time.year = 0;    //0年
  496.     else if (time.year < 0)
  497.      time.year = 99;    //99年
  498.     play8_num(0, 0|0x80, time.year);//显示年
  499.    }
  500.    else
  501.    {
  502.     break;  //退出循环
  503.    }
  504.   }
  505.   if (state == 0)
  506.    break;  //退出循环
  507. }
  508. }
  509. main()
  510. {
  511. uint8 key_val,key_val_1;
  512. uint8 val1=1,val2=1,val3=1,val4=1,val5=1,val6=1,val7=1,val8=1,val9=1,val10=1;
  513.     //read_18B20();    //初始DS18B20
  514.     //Delay_nms(1000);//延时1S,等待18B20工作正常
  515. led1=0;    //手动
  516. led2=0;    //自动
  517. led3=0;    //上
  518. led4=0;    //下
  519.       
  520. LCD_init();           //初始化液晶
  521. clear12864();         //清屏幕
  522. main_frame();         //显示主界面框架
  523. main_show(1);         //刷新1次
  524.     //read_18B20();        //读温度
  525. // play8_num(104, 6,zhengshu);   //显示温度
  526. while(1)
  527. {
  528.   play16(0, 6,zhan);
  529.   play16(16, 6,ming);
  530.   play16(32, 6,m);
  531.   key_val = scan_key();
  532.   key_val_1 = scan_key_1();
  533.   if(key_val_1==11){  //自动
  534.     play16(90, 6,zi);  //自动显示
  535.   led2=1;
  536.   led1=0;   
  537.   //上行
  538.    play16(112, 6,shang);
  539.   led3=1;   led4=0;
  540.      play16(40, 6,yi);  PlayMusic();
  541.   play16(66, 6,zhan); Delay_nms(5000);    PlayMusic();
  542.   play16(40, 6,er);Delay_nms(5000);      PlayMusic();
  543.   play16(40, 6,san);Delay_nms(5000);       PlayMusic();
  544.   play16(40, 6,si);Delay_nms(5000);       PlayMusic();
  545.   play16(40, 6,wu); Delay_nms(5000);        PlayMusic();
  546.   //下行
  547.   play16(112, 6,xia);
  548.   led3=0;   led4=1;
  549.   play16(40, 6,wu); Delay_nms(5000);        PlayMusic();
  550.   play16(40, 6,si);Delay_nms(5000);         PlayMusic();
  551.   play16(40, 6,san);Delay_nms(5000);          PlayMusic();
  552.   play16(40, 6,er);Delay_nms(5000);        PlayMusic();
  553.   play16(40, 6,yi);Delay_nms(5000);        PlayMusic();
  554.   }
  555.   if(key_val_1>0&&key_val_1<11)  //
  556.   {
  557.    led1=1;
  558.    led2=0;
  559.    play16(90, 6,shou);
  560.   }
  561.   //手动按键
  562.      //上行
  563.   if(key_val_1>=1&&key_val_1<6)
  564.   {
  565.   play16(112, 6,shang);
  566.    led3=1;   led4=0;
  567.    }
  568.   if(key_val_1==1)
  569.   {
  570.    play16(40, 6,yi);   //
  571.   play16(66, 6,zhan);
  572.   while(val1){  PlayMusic();val1--; }
  573.      
  574.   }
  575.   if(key_val_1==2)
  576.   {
  577.    play16(40, 6,er);   
  578.    while(val2){  PlayMusic();val2--; }
  579.   }
  580.    if(key_val_1==3)
  581.   {
  582.    play16(40, 6,san);   
  583.    while(val3){  PlayMusic();val3--; }
  584.   }
  585.   if(key_val_1==4)
  586.   {
  587.    play16(40, 6,si);   
  588.    while(val4){  PlayMusic();val4--; }
  589.   }
  590.          if(key_val_1==5)
  591.   {
  592.    play16(40, 6,wu);   
  593.    while(val5){  PlayMusic();val5--; }
  594.   }
  595.   //********手动下行*************/
  596.   if(key_val_1>=6&&key_val_1<11)
  597.   {
  598.   play16(112, 6,xia);
  599.    led3=0;   led4=1;
  600.       }
  601.        if(key_val_1==6)
  602.   {
  603.    play16(40, 6,wu);   
  604.    while(val6){  PlayMusic();val6--; }
  605.   }
  606.            if(key_val_1==7)
  607.   {
  608.    play16(40, 6,si);     
  609.    while(val7){  PlayMusic();val7--; }
  610.   }
  611.            if(key_val_1==8)
  612.   {
  613.    play16(40, 6,san);     
  614.    while(val8){  PlayMusic();val8--; }
  615.   }
  616.            if(key_val_1==9)
  617.   {
  618.    play16(40, 6,er);     
  619.    while(val9){  PlayMusic();val9--; }
  620.   }
  621.            if(key_val_1==10)
  622.   {
  623.    play16(40, 6,yi);     
  624.    while(val10){  PlayMusic();val10--; }
  625.    key_val_1=0;
  626.   }
  627.   
  628.   /*****************************
  629.   *时间控制
  630.   *****************************/
  631.   if (key_val == 1)         //K1?
  632.   {
  633.    main_set();           //设置主界面
  634.   }
  635.   else if (key_val == 2)    //K2?
  636.   {
  637.    clear12864();         //清屏幕
  638. //   alarm_show();    //闹钟画面
  639.    clear12864();       //清屏幕
  640.    main_show(1);    //主界面
  641.   }
  642.   else if (key_val == 3)    //K3?
  643.   {
  644.    clear12864();         //清屏幕
  645. //   alarm_show();    //闹钟画面
  646.    clear12864();         //清屏幕
  647.    main_show(1);    //主界面
  648.   }
  649.   else
  650.   {
  651.    read_time((uint8 *)&time);   //读取时间
  652.    main_show(0);      //显示主界面
  653.    if((time.sec%2)==0){read_18B20();}  //每隔2S采集一次
  654.   }
  655.   
  656.   // 闹钟
  657. /*  if (Alarm_flag)//如果闹钟标志有 执行下面的
  658.   {
  659.    if ((flag == 0) && (alarm.hour == time.hour) && (alarm.min == time.min))//判断条件是否满足
  660.    {
  661.     flag = 1;
  662.     clear12864();     //清屏幕
  663. //    alarm_show();     //闹钟
  664. //       PlayMusic();      //播放音乐
  665. //    PlayMusic();      //播放音乐
  666.     clear12864();     //清屏幕  
  667.     main_show(1);     //显示主界面
  668.    }
  669.   } */
  670. }
  671. }
复制代码

Proteus仿真工程文件51hei下载地址:
51_12864_proteus_1.rar (59.08 KB, 下载次数: 48)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
阿波罗车 发表于 2020-6-1 17:51 | 只看该作者
你好 有这个设计的流程图 ,框图之类的嘛 或者一整套的资料
回复

使用道具 举报

板凳
51hei团团 发表于 2020-6-1 19:53 | 只看该作者
阿波罗车 发表于 2020-6-1 17:51
你好 有这个设计的流程图 ,框图之类的嘛 或者一整套的资料

只有源程序 其他都没有
回复

使用道具 举报

地板
Shawnc 发表于 2020-6-20 02:55 | 只看该作者
程序库函数不全吗
回复

使用道具 举报

5#
songxia8013 发表于 2020-10-18 18:25 | 只看该作者
文件里面缺少程序,只有仿真文件!!!
回复

使用道具 举报

6#
yechuan220 发表于 2020-10-18 19:29 | 只看该作者
文件里面缺少程序,只有仿真文件!!!
回复

使用道具 举报

7#
51hei团团 发表于 2020-10-19 15:18 | 只看该作者
yechuan220 发表于 2020-10-18 19:29
文件里面缺少程序,只有仿真文件!!!

程序在1楼 一共647行
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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