久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3799|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级特黄aaa大片在线观看 | 欧美11一13sex性hd | 日韩在线免费视频 | 在线看亚洲 | 亚洲一区二区av在线 | 红桃成人在线 | 91精品一区二区三区久久久久久 | aaa综合国产 | 亚洲欧洲小视频 | 免费一级片 | 毛片在线免费 | 91亚洲国产成人久久精品网站 | 国产精品久久久久久久三级 | 一区二区视频在线观看 | 在线黄| 国产精品久久久久久久久久久久久久 | 九色网址 | 亚洲欧美中文日韩在线v日本 | 欧美一区二区精品 | 综合久久99 | 视频在线亚洲 | 精品真实国产乱文在线 | 亚洲欧美日本国产 | 高清人人天天夜夜曰狠狠狠狠 | 成人三级视频 | 久久精彩 | 亚洲a级| 欧美一级黄 | 亚洲国产成人精品女人久久久 | 午夜av一区二区 | 日韩精品成人免费观看视频 | 亚洲一二三在线观看 | 久久精品国产久精国产 | av中文在线 | 欧美亚洲网站 | 久久视频免费观看 | 国产一区在线免费观看 | 中文字幕乱码视频32 | 欧洲一区在线观看 | 天天爱av| 欧美一区二区三区在线看 |