找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机控制电力柜用操控状态仪表程序源码

[复制链接]
跳转到指定楼层
楼主
前几年做的操控状态仪表,里边有COG液晶,串口,按键,IO,温湿度传感器,EEPROM等等
对于单片机的初学者有帮助,可以了解单片机和外设工作的基本原理
和简单的数据处理,


全部资料51hei下载地址:
CaoKonog20120110.rar (850.75 KB, 下载次数: 28)

单片机源码如下:
  1. #include <iom64v.h>
  2. #include <macros.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <ctype.h>
  6. #include <eeprom.h>
  7. #include <math.h>
  8. /*********************************************************************************************************/
  9. #include "IO.h"
  10. #include "uart.h"
  11. #include "lcd.h"
  12. #include "key.h"
  13. #include "sht.h"
  14. /*********************************************************************************************************/
  15. #pragma data:data

  16. unsigned char temp_flag=0;
  17. unsigned char wd_shang;
  18. unsigned char wd_xia;
  19. unsigned char sd_shang;
  20. unsigned char sd_xia;
  21. unsigned char pf_shang;
  22. unsigned char pf_xia;
  23. unsigned char Body_Flag;                                    //人体靠近带电标志位
  24. unsigned char rt_gy;                                       // 人体感应非投入,1:投入,2:非投入
  25. unsigned char db_du;
  26. unsigned char InIt_Para[]={0x0a,0x05,0x5D,0x55,0x37,0x32,0x01,0x01};
  27. /*********************************************************************************************************/
  28. unsigned char wd_bz;
  29. unsigned char sd_bz;
  30. unsigned char pf_bz;
  31. unsigned char wendu1_biaozhi;
  32. unsigned char wendu2_biaozhi;
  33. unsigned char mima;
  34. /*********************************************************************************************************/
  35. unsigned int  R_ms_Timer,mincount1;
  36. unsigned int  timer_count;
  37. unsigned char timer_count1;
  38. unsigned char timer_count2;
  39. unsigned char timer_count3;
  40. unsigned char Cls_Lcd_Flag;
  41. unsigned char  GPIOSamp_counter_Flag;
  42. unsigned char  GPIOSamp_counter;
  43. /*********************************************************************************************************/
  44. extern unsigned char  bz;                                //位标志                  
  45. extern unsigned char  bz1;                               //位标志,判断是地址还是数据
  46. extern unsigned char  di_zhi;
  47. extern unsigned char  Receiver_Flag;                     //  接受数据标志
  48. extern unsigned char  Back_Light_Flag;
  49. extern unsigned char  rx0_buf[16];                       // 接收数据缓存器
  50. extern unsigned char  rx0_index;                         // 接收数据计数器
  51. extern unsigned char  Tx0_buf[16];                       // 发送数据缓存器
  52. extern unsigned char  R_KeyValue1;
  53. /*********************************************************************************************************/
  54. //todao[0]:湿度测量  1; todao[1]:  温度测量  1;   todao[2]:湿度测量  2;   todao[3]:温度测量  2
  55. extern float   todao[4];                       //{temp,rh};  模拟量寄存器从1到2   
  56.                                                                                           
  57. extern unsigned char  rx0_index;                                             
  58.                                                                                           
  59. extern unsigned char  Q,n,TT1,T,TT2;
  60. extern unsigned char  ch,cl;      
  61. extern unsigned char  Up_Counter;
  62. extern unsigned char  Page_Flag;
  63. extern unsigned char  Page_Flag1;
  64. /**********************************************************************************************************
  65. ** 函数名称:init_para()
  66. ** 函数功能:开机时取得、设定各项参数
  67. ** 入口参数:      
  68. ** 出口参数:无
  69. ** 说    明:
  70. *********************************************************************************************************/
  71. void init_para(void)
  72. {
  73.         EEPROMReadBytes(0x0010,&wd_shang,1);                                 
  74.         delay_nms(10);
  75.         EEPROMReadBytes(0x0011,&wd_xia,1);                           
  76.                                  
  77.     delay_nms(10);
  78.     EEPROMReadBytes(0x0012,&sd_shang,1);
  79.         EEPROMReadBytes(0x0013,&sd_xia,1);
  80.     delay_nms(10);
  81.         EEPROMReadBytes(0x0014,&pf_shang,1);                                
  82.     EEPROMReadBytes(0x0015,&pf_xia,1);
  83.     EEPROMReadBytes(0x0016,&rt_gy,1);
  84.     EEPROMReadBytes(0x0017,&di_zhi,1);
  85.                            
  86. }
  87. /**********************************************************************************************************
  88. * 函数名称:EEprom_init()
  89. * 函数功能:开机时取得、设定各项参数
  90. * 入口参数:      
  91. * 出口参数:无
  92. * 说    明:
  93. ********************************************************************************************************/
  94. void EEprom_init(void)
  95. {  
  96.    unsigned char EEP_Read=0,Eep_Write=0;
  97.    
  98.    EEPROMReadBytes(0x03,&EEP_Read,1);
  99.    if( EEP_Read != 0x55)
  100.     {
  101.             Eep_Write = 0x55;
  102.             EEPROMWriteBytes(0x0003,&Eep_Write,1);
  103.             EEPROMWriteBytes(0x0010,InIt_Para,8);
  104.             init_para();
  105.           }
  106.    else
  107.     {
  108.            init_para();
  109.         }
  110. }
  111. /**********************************************************************************************************
  112. ** 函数名称:timer0_init()
  113. ** 函数功能:初始化定时器0,10ms定时器
  114. ** 入口参数:无      
  115. ** 出口参数:无
  116. ** 说明:    8位定时器,和8051相似,只是注意定时器时钟是晶振分频以后
  117. *********************************************************************************************************/
  118. void Timer0_init(void)
  119. {
  120.    TCCR0 = 0x00;
  121.    ASSR  = 0x00;
  122.    TCNT0 = 0xB1;                      // 定时初值 8Mhz
  123.    //TCNT0 = 0x93;                    // 定时初值 11Mhz
  124.    OCR0  = 0x00;                     
  125.    TCCR0 = 0x07;                      // 时钟1024分频 ,启动定时器
  126.    TIMSK |= 0x01;                     // timer0中断使能
  127. }
  128. /**********************************************************************************************************
  129. ** 函数名称:timer0_ovf_isr()
  130. ** 函数功能:定时器0溢出中断服务程序
  131. ** 入口参数:无      
  132. ** 出口参数:无
  133. ** 说明:
  134. *********************************************************************************************************/
  135. #pragma interrupt_handler Timer0_ovf_isr:iv_TIMER0_OVF
  136. void Timer0_ovf_isr(void)
  137. {
  138.    TCNT0 = 0xB1;
  139.          R_ms_Timer++;
  140.          timer_count1++;
  141.          if(timer_count1>=4)
  142.          {
  143.            KeyValue_Pro();
  144.            timer_count1=0;
  145.          }
  146.          if(GPIOSamp_counter_Flag)
  147.           GPIOSamp_counter++;
  148.          
  149.          
  150.          if((Back_Light_Flag==1)&&((Body_Flag == 0)||(Body_Flag == 2)))                   //    液晶背光
  151.           {
  152.              mincount1++;
  153.              if(mincount1 >= Ldc_Timer )                              //    30秒
  154.                   {
  155.                         mincount1 = 0;
  156.             DI_jdq5_ZHMIN_OUT1;  
  157.                         LCD_LED_OUT1;
  158.                   }
  159.           }
  160.          if(Back_Light_Flag==0)
  161.          {
  162.               LCD_LED_OUT0;
  163.                   DI_jdq5_ZHMIN_OUT0;
  164.                   mincount1 = 0;
  165.          }
  166.          
  167. }

  168. /**********************************************************************************************************
  169. ** 函数名称:timer1_init()
  170. ** 函数功能:初始化定时器1
  171. ** 入口参数:无      
  172. ** 出口参数:无
  173. ** 说明:
  174. **        16位定时器,和8051相似,只是注意定时器时钟是晶振分频以后
  175. **        TCNT1 = 65536 - (Focs X  m) / 1024;   m:  为定时时间,单位 s
  176. **        TCNT1分为TCNT1H和TCNT1L
  177. *********************************************************************************************************/
  178. void Timer1_init(void)
  179. {
  180.    TCCR1B = 0x00;            //stop

  181.    //TCNT1H = 0x0D5;         //计数初值 , 定时为1秒  Focs = 11.0592Mhz
  182.    //TCNT1L = 0x0D0;
  183.    
  184.    //TCNT1H = 0x02D;         //计数初值 , 定时为5秒  Focs = 11.0592Mhz
  185.    //TCNT1L = 0x00F;

  186.    //TCNT1H = 0x0E1;         //计数初值,  定时为1秒  Focs = 8Mhz
  187.    //TCNT1L = 0x07B;
  188.    TCNT1H = 0x0F0;           //计数初值,  定时为0.5秒  Focs = 8Mhz
  189.    TCNT1L = 0x0BD;
  190.    
  191.    OCR1AH = 0x98;            // 输出比较寄存器A初值
  192.    OCR1AL = 0x96;

  193.    OCR1BH = 0x98;            // 输出比较寄存器B初值
  194.    OCR1BL = 0x96;

  195.    ICR1H  = 0x98;            // 输入捕获寄存器初值
  196.    ICR1L  = 0x96;

  197.    TCCR1A = 0x00;            // 比较匹配模式禁止
  198.    TCCR1B = 0x05;            // start Timer,时钟分频1024分频      
  199.    TIMSK |= 0x04;            // timer1中断使能
  200. }
  201. /**********************************************************************************************************
  202. ** 函数名称:timer1_ovf_isr()
  203. ** 函数功能:定时器1溢出中断服务程序
  204. ** 入口参数:      
  205. ** 出口参数:无
  206. ** 说    明:500ms
  207. *********************************************************************************************************/
  208. #pragma interrupt_handler Timer1_ovf_isr:iv_TIMER1_OVF
  209. void Timer1_ovf_isr(void)
  210. {
  211.     TCNT1H = 0x0F0;               
  212.     TCNT1L = 0x0BD;     
  213.         timer_count2++;
  214.         if((Page_Flag !=0))
  215.         {
  216.        timer_count3++;
  217.            if(timer_count3 >=60)                                 //   一定时间内没有按键,强制返回温湿度显示页面
  218.             {
  219.                   timer_count3 = 0;
  220.                   Cls_Lcd_Flag = 1;
  221.                 }
  222.         }
  223.         if(timer_count2 >= 2)                                      //   1.5秒重新检测一次温湿度
  224.          {
  225.             timer_count2 = 0;
  226.                   temp_flag=1;
  227.          }   
  228.         if(Body_Flag == 1)                                         //  人体感应设置为投时,检测到人体感应时
  229.          {
  230.                 LCD_LED_OUT0;
  231.                 DI_jdq5_ZHMIN_OUT0;
  232.                 timer_count = 0;
  233.          }
  234.         if(Body_Flag == 0)                                         //  人体感应设置为投时,未检测到人体感应时                                                   
  235.          {
  236.             timer_count++;
  237.                 if(timer_count >= Body_Timer )                          //   1分钟后关闭液晶背光
  238.                  {
  239.                    timer_count = 0;
  240.                    LCD_LED_OUT1;
  241.                    DI_jdq5_ZHMIN_OUT1;
  242.                  }
  243.          }
  244. }
  245. /**********************************************************************************************************
  246. ** 函数名称:QuanJu_Var_Init()
  247. ** 函数功能:全局变量初始化
  248. ** 入口参数:      
  249. ** 出口参数:无
  250. ** 说    明:
  251. *********************************************************************************************************/
  252. void QuanJu_Var_Init(void)
  253. {
  254.         
  255.         bz1 = 1;
  256.         T=15;
  257.     TT1=18;
  258.     TT2=18;
  259.     Q=n=ch=cl=0;
  260.     rx0_index = 0;
  261.         Up_Counter = 1;
  262.         Receiver_Flag = 0;
  263.         Back_Light_Flag = 1;
  264.         db_du =0x70;
  265.         Body_Flag = 0;                              
  266.         LCD_LED_OUT0;
  267.         memset(Tx0_buf,0,sizeof(Tx0_buf));
  268.         memset(rx0_buf,0,sizeof(rx0_buf));
  269.         memset(todao,0,sizeof(todao));
  270. }

  271. /**********************************************************************************************************
  272. ** 函数名称:Hardware_Init()                                                                              
  273. ** 函数功能:所有外设端口初始化                                                                     
  274. ** 入口参数:                                                                                             
  275. ** 出口参数:无                                                                                            
  276. ** 说    明:                                                                                             
  277. *********************************************************************************************************/
  278. void Hardware_Init(void)
  279. {
  280.         //keyboard
  281.         PORTD |= 0x0f0;                  //输入置为上拉
  282.         
  283.         KY1_IN;
  284.     KY2_IN;
  285.     KY3_IN;
  286.     KY4_IN;
  287.   // 温湿度
  288.           SHT10_SCK1_OUT;
  289.     SHT10_SDA1_OUT;
  290.     SHT10_SCK2_OUT;
  291.     SHT10_SDA2_OUT;  
  292.   //LED灯
  293.         DI_led1_OUT;
  294.     DI_led2_OUT;
  295.     DI_led3_OUT;
  296.     DI_led4_OUT;
  297.     DI_led5_OUT;
  298.     DI_led6_OUT;
  299.     DI_led7_OUT;
  300.     DI_led8_OUT;
  301.    
  302.         DI_led1_OUT0;
  303.     DI_led2_OUT1;
  304.     DI_led3_OUT0;
  305.     DI_led4_OUT0;
  306.     DI_led5_OUT0;
  307.     DI_led6_OUT0;
  308.     DI_led7_OUT0;
  309.     DI_led8_OUT1;
  310.    
  311.    //继电器
  312.     DI_jdq0_JRA_OUT;  
  313.     DI_jdq1_JRB_OUT;  
  314.     DI_jdq2_PF_OUT;   
  315.         DI_jdq3_BJ_OUT;   
  316.         DI_jdq4_BS_OUT;   
  317.     DI_jdq5_ZHMIN_OUT;
  318.    
  319.     DI_jdq0_JRA_OUT1;  
  320.     DI_jdq1_JRB_OUT1;  
  321.     DI_jdq2_PF_OUT1;   
  322.         DI_jdq3_BJ_OUT1;   
  323.         DI_jdq4_BS_OUT1;   
  324.     DI_jdq5_ZHMIN_OUT1;
  325.    
  326.     //语音
  327.     DI_yu_ying1_OUT;   
  328.     DI_yu_ying2_OUT;   
  329.     DI_yu_ying3_OUT;  
  330.     DI_yu_ying4_OUT;   
  331.     DI_yu_ying5_ZD_OUT;

  332.     DI_yu_ying1_OUT0;   
  333.     DI_yu_ying2_OUT0;   
  334.     DI_yu_ying3_OUT0;  
  335.     DI_yu_ying4_OUT0;   
  336.     DI_yu_ying5_ZD_OUT0;
  337.     //HC165输入端口
  338.     HC165_SCK_OUT;
  339.         HC165_LD_OUT;
  340.     HC165_SD_IN;
  341.         PORTG |= 0x04;
  342.         // 人体感应
  343.         Re_gyin_RT;
  344.         PORTD |= 0x01;
  345.     //LCD端口
  346.     LCD_DIR1_OUT;
  347.         LCD_DIR2_OUT;
  348.          
  349.         LCD_CS_OUT;
  350.         LCD_RST_OUT;
  351.         LCD_RS_OUT;
  352.         LCD_RW_OUT;
  353.         LCD_ERW_OUT;
  354.         LCD_LED_OUT;
  355.          
  356.         DDRA = 0xff;                                // PA为输出
  357.          
  358.         LCD_DIR1_OUT1;
  359.         LCD_DIR2_OUT1;
  360.     //RS485 接收发送选择:接收
  361.     SET_485_EN_OUT;
  362.         SET_485_EN_OUT1;
  363.    
  364.     DI_jdq5_ZHMIN_OUT0;                       //照明
  365.    
  366. }

  367. /**********************************************************************************************************
  368. ** 函数名称:main()                                                                              
  369. ** 函数功能:                                                                     
  370. ** 入口参数:                                                                                             
  371. ** 出口参数:无                                                                                            
  372. ** 说    明:                                                                                             
  373. *********************************************************************************************************/
  374. void main(void)
  375. {
  376.    CLI();                    
  377.    EEprom_init();        
  378.    Hardware_Init();
  379.    uart0_init();
  380.    Timer0_init();
  381.    Timer1_init();
  382.    QuanJu_Var_Init();
  383.    Lcd_Init();
  384.    Temp_Humi_Init();
  385.    SEI();
  386.    Init_LcdDis();
  387.    while(1)
  388.    {
  389.                         //KeyValue_Pro();
  390.                         if((Page_Flag1==1)&&(Page_Flag !=0))
  391.                         {
  392.                            Page_Flag1 = 0;
  393.                            LCD_CLS();
  394.                         }
  395.                         if(Cls_Lcd_Flag)
  396.                         {
  397.                             Cls_Lcd_Flag = 0;
  398.                                   Page_Flag = 0;
  399.                             LCD_CLS();
  400.                             Up_Counter = 1;
  401.                         }
  402.                         
  403.                         Menu_Display();
  404.                         /*
  405.                         if(temp_flag && (Page_Flag == 0))        // 由于温度检测测量时间较长影响按键和通讯,只有在温度显示页面才进行温度刷新
  406.                         {
  407.                            Temp_Humi_Init();
  408.                            temp_flag=0;
  409.                         }
  410.                         */
  411.                         Out_Logic();  
  412.                       Check_IO_Pra();   
  413.                         if(Receiver_Flag)
  414.                         {
  415.                                 shuju_chuli();
  416.                                 clear_rx0_tx0_buf();
  417.                                 Receiver_Flag = 0;
  418. …………
  419. …………
  420. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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