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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2258|回復: 0
打印 上一主題 下一主題
收起左側

有沒有大佬能寫一個這個程序的用做labview串口仿真的串口程序啊,幫幫鵝吧。

[復制鏈接]
跳轉到指定樓層
樓主
ID:369182 發表于 2020-6-11 20:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <reg52.h>          /////////////頭文件
  2. ////////////////////////////////////////////////////////////////////////////
  3. void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  4. void ConfigTimer0(unsigned int ms);
  5. unsigned char IntToString(unsigned char *str, int dat);
  6. extern bit Start18B20();
  7. extern bit Get18B20Temp(int *temp);
  8. extern void InitLcd1602();         
  9. bit DHT_Start();        
  10. void aj (void);
  11. bit DHT_ByteRead(unsigned char *dat);
  12. /////////////////////////////////////////////////////////////////////
  13. sbit K1=P1^4;           ///引腳聲明
  14. sbit K2=P1^5;
  15. sbit K3=P1^6;
  16. sbit K4=P1^7;
  17. sbit M1=P1^0;
  18. sbit M2=P1^1;
  19. sbit M3=P1^2;
  20. sbit M4=P1^3;

  21. sbit D1=P2^7;
  22. sbit D2=P2^6;

  23. sbit KD1=P2^3;
  24. sbit KD2=P2^4;

  25. /////////////////

  26. /////////////////////////////  數組命名
  27. int SD,WD,x,xx,SDC,WDC,PWM1,PWM2;
  28. int KK1,KK2;
  29. int wdg=40,wdd=20,sdg=80,sdd=60;
  30. bit SZ,JB;
  31. bit flag1s = 0;          //1s定時標志
  32. unsigned char T0RH = 0;  //T0重載值的高字節
  33. unsigned char T0RL = 0;  //T0重載值的低字節
  34.   /////////////////////////////////        延時子程序
  35. void delay ()
  36. {
  37. x=99999;
  38. while(x--);
  39. }
  40.    /////////////////////////////////
  41. void main()          ////////////////主程序
  42. {                 

  43.     bit tmp;
  44.     unsigned char str[12];
  45.          unsigned char DHT[5];
  46.   ////初始化///////////////////////
  47.     EA = 1;            //開總中斷
  48.     ConfigTimer0(10);  //T0定時10ms
  49.     InitLcd1602();     //初始化液晶
  50.         M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
  51. ////////////////////////////////////
  52.   DHT_Start();
  53.   delay();
  54.   delay();
  55.     delay();

  56.   delay();

  57.     while (1)
  58.     {
  59.         LcdShowStr(0, 0, "WD");        //顯示到液晶屏上
  60.         LcdShowStr(0, 1, "SD");        //顯示到液晶屏上

  61.     LcdShowStr(5, 0, "H");        //顯示到液晶屏上
  62.         LcdShowStr(5, 1, "H");        //顯示到液晶屏上

  63.         
  64.         LcdShowStr(9, 0, "L");        //顯示到液晶屏上
  65.         LcdShowStr(9, 1, "L");        //顯示到液晶屏上
  66.         if (flag1s)  //每秒更新一次溫度
  67.         {

  68.                         
  69.                str[0] = (wdg/10)%10 + '0';  //十位轉為ASCII碼
  70.            str[1] = (wdg%10) + '0';  //個位轉為ASCII
  71.            str[2] = '\0';
  72.                LcdShowStr(6, 0, str);

  73.                    str[0] = (wdd/10)%10 + '0';  //十位轉為ASCII碼
  74.            str[1] = (wdd%10) + '0';  //個位轉為ASCII
  75.            str[2] = '\0';
  76.                LcdShowStr(10,0, str);

  77.                    str[0] = (sdg/10)%10 + '0';  //十位轉為ASCII碼
  78.            str[1] = (sdg%10) + '0';  //個位轉為ASCII
  79.            str[2] = '\0';
  80.                LcdShowStr(6, 1, str);

  81.                    str[0] = (sdd/10)%10 + '0';  //十位轉為ASCII碼
  82.            str[1] = (sdd%10) + '0';  //個位轉為ASCII
  83.            str[2] = '\0';
  84.                LcdShowStr(10, 1, str);

  85.                 DHT_Start();
  86.                         tmp=DHT_ByteRead(&DHT);
  87.                    if(tmp==1)
  88.                    {
  89.                    str[0] = (DHT[0]/10)%10 + '0';  //十位轉為ASCII碼
  90.            str[1] = (DHT[0]%10) + '0';  //個位轉為ASCII
  91.                LcdShowStr(2, 1, str);

  92.                    str[0] = (DHT[2]/10)%10 + '0';  //十位轉為ASCII碼
  93.            str[1] = (DHT[2]%10) + '0';  //個位轉為ASCII
  94.            str[2] = '\0';
  95.                LcdShowStr(2,0, str);

  96.                    WD= DHT[2];
  97.                    SD=DHT[0];
  98.                    }
  99.         }


  100.                 ////////////////////超熱警報
  101.                 if(wdg<=WD)
  102.                 {
  103.                 WDC=WD-wdg+2;
  104.                  M1=1;
  105.                 }
  106.                 else M1=0;

  107.                 if(wdd>=WD)
  108.                 {
  109.                 WDC=wdd-WD+2;
  110.                  M2=1;
  111.                 }
  112.                 else M2=0;

  113.                 if(sdg<=SD)
  114.                 {
  115.                 SDC=SD-sdg+2;
  116.                  M3=1;
  117.                 }
  118.                 else M3=0;

  119.                 if(sdd>=SD)
  120.                 {
  121.                 SDC=sdd-SD+2;
  122.                  M4=1;
  123.                 }
  124.                 else M4=0;

  125.                 if(wdg<=WD||wdd>=WD)
  126.                 {
  127.                   PWM1++;
  128.                   if(PWM1<WDC)
  129.                   D1=1;
  130.                   if(PWM1>=WDC)
  131.                    D1=0;
  132.                   if(PWM1==10)
  133.                   PWM1=0;
  134.                 }
  135.       if(wdg>WD&&wdd<WD&&KK1==0)
  136.             D1=0;

  137.                 if(sdg<=SD||sdd>=SD)
  138.                 {
  139.                   PWM2++;
  140.                   if(PWM2<SDC)
  141.                   D2=1;
  142.                   if(PWM2>=SDC)
  143.                    D2=0;
  144.                   if(PWM2==10)
  145.                   PWM2=0;
  146.                 }
  147.                 if(sdg>SD&&sdd<SD&&KK2==0)
  148.          D2=0;
  149.                 /////////////////////////////按鍵設置
  150.                  aj();
  151.                   //////////////////////////////////////////////
  152.          }
  153. }

  154. void aj (void)
  155. {

  156. if(KD1==0)
  157. {
  158.   delay();
  159.   KK1++;
  160.   if(KK1==1)
  161.    D1=1;
  162.    if(KK1>=2)
  163.    {
  164.     D1=0;
  165.         KK1=0;
  166.    }
  167. }


  168. if(KD2==0)
  169. {
  170.   delay();
  171.   KK2++;
  172.   if(KK2==1)
  173.    D2=1;
  174.    if(KK2>=2)
  175.    {
  176.     D2=0;
  177.         KK2=0;
  178.    }
  179. }
  180.                  if(K1==0)
  181.                 {
  182.                    xx++;
  183.                   delay();
  184.                   if(xx==1)
  185.                     LcdShowStr(12, 0, "WDH");        //顯示到液晶屏上
  186.                   if(xx==2)
  187.                     LcdShowStr(12, 0, "WDL");        //顯示到液晶屏上  
  188.                   if(xx==3)
  189.                     LcdShowStr(12, 0, "SDH");        //顯示到液晶屏上
  190.                   if(xx==4)
  191.                     LcdShowStr(12, 0, "SDL");        //顯示到液晶屏上
  192.                 if(xx>=5)
  193.                 xx=0;                                                   
  194.                 }
  195.                 if(K2==0)
  196.                 {

  197.                 if(xx==1)
  198.                 {
  199.                   LcdShowStr(12, 1, "WD+");        //顯示到液晶屏上
  200.                   wdg++;
  201.                 }
  202.                                 if(xx==2)
  203.                 {
  204.                   LcdShowStr(12, 1, "WD+");        //顯示到液晶屏上
  205.                   wdd++;
  206.                 }
  207.                                 if(xx==3)
  208.                 {
  209.                   LcdShowStr(12, 1, "SD+");        //顯示到液晶屏上
  210.                   sdg++;
  211.                 }
  212.                                 if(xx==4)
  213.                 {
  214.                   LcdShowStr(12, 1, "SD+");        //顯示到液晶屏上
  215.                   sdd++;
  216.                 }

  217.                   delay();
  218.                 }

  219.                 if(K3==0)
  220.                 {
  221.                                  if(xx==1)
  222.                 {
  223.                   LcdShowStr(12, 1, "WD-");        //顯示到液晶屏上
  224.                   wdg--;
  225.                 }
  226.                                 if(xx==2)
  227.                 {
  228.                   LcdShowStr(12, 1, "WD-");        //顯示到液晶屏上
  229.                   wdd--;
  230.                 }
  231.                                 if(xx==3)
  232.                 {
  233.                   LcdShowStr(12, 1, "SD-");        //顯示到液晶屏上
  234.                   sdg--;
  235.                 }
  236.                                 if(xx==4)
  237.                 {
  238.                   LcdShowStr(12, 1, "SD-");        //顯示到液晶屏上
  239.                   sdd--;
  240.                 }
  241.                   delay();
  242.                 }
  243.                  if(K4==0)
  244.                 {

  245.                   delay();
  246.                   xx=0;
  247.                   InitLcd1602();     //初始化液晶
  248.                 }
  249. }
  250. /* 整型數轉換為字符串,str-字符串指針,dat-待轉換數,返回值-字符串長度 */
  251. unsigned char IntToString(unsigned char *str, int dat)
  252. {
  253.     signed char i = 0;
  254.     unsigned char len = 0;
  255.     unsigned char buf[6];

  256.     if (dat < 0)  //如果為負數,首先取絕對值,并在指針上添加負號
  257.     {
  258.         dat = -dat;
  259.         *str++ = '-';
  260.         len++;
  261.     }
  262.     do {          //先轉換為低位在前的十進制數組
  263.         buf[i++] = dat % 10;
  264.         dat /= 10;
  265.     } while (dat > 0);
  266.     len += i;     //i最后的值就是有效字符的個數
  267.     while (i-- > 0)   //將數組值轉換為ASCII碼反向拷貝到接收指針上
  268.     {
  269.         *str++ = buf[i] + '0';
  270.     }
  271.     *str = '\0';  //添加字符串結束符

  272.     return len;   //返回字符串長度
  273. }
  274. /* 配置并啟動T0,ms-T0定時時間 */
  275. void ConfigTimer0(unsigned int ms)
  276. {
  277.     unsigned long tmp;  //臨時變量

  278.     tmp = 11059200 / 12;      //定時器計數頻率
  279.     tmp = (tmp * ms) / 1000;  //計算所需的計數值
  280.     tmp = 65536 - tmp;        //計算定時器重載值
  281.     tmp = tmp + 12;           //補償中斷響應延時造成的誤差
  282.     T0RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節
  283.     T0RL = (unsigned char)tmp;
  284.     TMOD &= 0xF0;   //清零T0的控制位
  285.     TMOD |= 0x01;   //配置T0為模式1
  286.     TH0 = T0RH;     //加載T0重載值
  287.     TL0 = T0RL;
  288.     ET0 = 1;        //使能T0中斷
  289.     TR0 = 1;        //啟動T0
  290. }
  291. /* T0中斷服務函數,完成1秒定時 */
  292. void InterruptTimer0() interrupt 1
  293. {
  294.     static unsigned char tmr1s = 0;

  295.     TH0 = T0RH;  //重新加載重載值
  296.     TL0 = T0RL;
  297.     tmr1s++;
  298.     if (tmr1s >= 100)  //定時1s
  299.     {
  300.         tmr1s = 0;
  301.         flag1s = 1;
  302.         }


  303. }
  304. #include <reg52.h>
  305. #include <intrins.h>
  306. #define LCD1602_DB  P0

  307. sbit IO_18B20 = P3^2;

  308. sbit LCD1602_RS = P2^0;
  309. sbit LCD1602_RW = P2^1;
  310. sbit LCD1602_E  = P2^2;

  311. /* 等待液晶準備好 */
  312. void LcdWaitReady()
  313. {
  314.     unsigned char sta;

  315.     LCD1602_DB = 0xFF;
  316.     LCD1602_RS = 0;
  317.     LCD1602_RW = 1;
  318.     do {
  319.         LCD1602_E = 1;
  320.         sta = LCD1602_DB; //讀取狀態字
  321.         LCD1602_E = 0;
  322.     } while (sta & 0x80); //bit7等于1表示液晶正忙,重復檢測直到其等于0為止
  323. }
  324. /* 向LCD1602液晶寫入一字節命令,cmd-待寫入命令值 */
  325. void LcdWriteCmd(unsigned char cmd)
  326. {
  327.     LcdWaitReady();
  328.     LCD1602_RS = 0;
  329.     LCD1602_RW = 0;
  330.     LCD1602_DB = cmd;
  331.     LCD1602_E  = 1;
  332.     LCD1602_E  = 0;
  333. }
  334. /* 向LCD1602液晶寫入一字節數據,dat-待寫入數據值 */
  335. void LcdWriteDat(unsigned char dat)
  336. {
  337.     LcdWaitReady();
  338.     LCD1602_RS = 1;
  339.     LCD1602_RW = 0;
  340.     LCD1602_DB = dat;
  341.     LCD1602_E  = 1;
  342.     LCD1602_E  = 0;
  343. }
  344. /* 設置顯示RAM起始地址,亦即光標位置,(x,y)-對應屏幕上的字符坐標 */
  345. void LcdSetCursor(unsigned char x, unsigned char y)
  346. {
  347.     unsigned char addr;

  348.     if (y == 0)  //由輸入的屏幕坐標計算顯示RAM的地址
  349.         addr = 0x00 + x;  //第一行字符地址從0x00起始
  350.     else
  351.         addr = 0x40 + x;  //第二行字符地址從0x40起始
  352.     LcdWriteCmd(addr | 0x80);  //設置RAM地址
  353. }
  354. /* 在液晶上顯示字符串,(x,y)-對應屏幕上的起始坐標,str-字符串指針 */
  355. void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
  356. {
  357.     LcdSetCursor(x, y);   //設置起始地址
  358.     while (*str != '\0')  //連續寫入字符串數據,直到檢測到結束符
  359.     {
  360.         LcdWriteDat(*str++);
  361.     }
  362. }
  363. /* 打開光標的閃爍效果 */
  364. void LcdOpenCursor()
  365. {
  366.         LcdWriteCmd(0x0F);
  367. }
  368. /* 關閉光標顯示 */
  369. void LcdCloseCursor()
  370. {
  371.         LcdWriteCmd(0x0C);
  372. }
  373. /* 初始化1602液晶 */
  374. void InitLcd1602()
  375. {
  376.     LcdWriteCmd(0x38);  //16*2顯示,5*7點陣,8位數據接口
  377.     LcdWriteCmd(0x0C);  //顯示器開,光標關閉
  378.     LcdWriteCmd(0x06);  //文字不動,地址自動+1
  379.     LcdWriteCmd(0x01);  //清屏
  380. }

  381. /////////////////////////////////////////////////////////溫度傳感器18B20
  382. #include<reg52.h>
  383. #include<intrins.h>
  384. sbit DHT_DATA = P3^7;
  385. bit DHT_Start();
  386. bit DHT_ByteRead(unsigned char *dat);

  387. void delay_ms(unsigned char x)   //誤差 -0.651041666667us
  388. {
  389.     unsigned char a,b,c;
  390.         for(c=x;c>0;c--)
  391.     {
  392.                 for(b=102;b>0;b--)
  393.         for(a=3;a>0;a--);
  394.         }
  395. }
  396. void delay_30us(void)   //誤差 -0.703125us
  397. {
  398.     unsigned char a;
  399.     for(a=12;a>0;a--);
  400. }

  401. void delay_40us(void)   //誤差 -0.703125us
  402. {
  403.     unsigned char a,b;
  404.     for(b=3;b>0;b--)
  405.         for(a=4;a>0;a--);
  406. }

  407. bit DHT_Start()
  408. {        unsigned char m=0;
  409.         DHT_DATA=1;
  410.         DHT_DATA=0;        
  411.         delay_ms(20);
  412.         DHT_DATA=1;
  413.         delay_40us();
  414.         if(DHT_DATA==1)
  415.                 return 0;
  416.         else
  417.                 while((DHT_DATA==0)&&(m<200))m++;
  418.         delay_40us();
  419.         delay_40us();
  420.         return 1;                                
  421. }
  422. bit DHT_ByteRead(unsigned char *dat)
  423. {        unsigned char temp=0;
  424.         unsigned char x,y;
  425.         unsigned char m=0;
  426.         unsigned char n=0;
  427.         unsigned char mask=0x01;
  428.         unsigned char sum=0;
  429.         for(y=0;y<5;y++)
  430.         {
  431.                 for(mask=0x80;mask!=0;mask>>=1)
  432.                 {        
  433.                         while(DHT_DATA==0&&m<200)m++;
  434.                         delay_30us();
  435.                         if(DHT_DATA)
  436.                                 temp|=mask;
  437.                         else
  438.                                 temp&=(~mask);
  439.                         while(DHT_DATA==1&&n<200)n++;
  440.                 }
  441.                 *(dat+y)=temp;
  442.                 temp=0;
  443.         }
  444.         for(x=0;x<4;x++)
  445.                 sum+=*(dat+x);        
  446.         if((sum&=0xff)==*(dat+4))
  447.                 return 1;
  448.         else
  449.                 return 0;
  450. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品欧美精品 | 九色视频网站 | 成人av在线播放 | 国产成人午夜高潮毛片 | 一级毛片播放 | 天天澡天天操 | 午夜精品一区二区三区在线观看 | 国产成人综合网 | 麻豆精品一区二区三区在线观看 | 操久久 | 欧美午夜一区二区三区免费大片 | 日韩一区二区在线视频 | av超碰| 亚洲成人免费视频 | 精品视频国产 | 欧美高清dvd | 成人av免费在线观看 | 97国产一区二区精品久久呦 | 国产2区 | 免费国产精品久久久久久 | 日韩精品一区二区三区在线播放 | 香蕉国产在线视频 | 天天操综合网站 | 美女视频h | 羞羞视频在线观看免费观看 | 日韩中文字幕 | 国产精品永久免费 | 亚洲精品国产综合区久久久久久久 | 狠狠躁躁夜夜躁波多野结依 | 91亚洲国产成人精品一区二三 | 国产精品国产成人国产三级 | 三级黄色片在线 | 日韩精品在线播放 | 夜夜夜操 | 欧美一级黄带 | 久久久久久久综合 | 日韩在线免费播放 | 丝袜久久 | 国产高清一区二区 | 亚洲欧美在线观看 | 国产精品一区二区不卡 |