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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機空氣流量計Proteus仿真程序

[復制鏈接]
跳轉到指定樓層
樓主
仿真 使用Proteus +keil4 使用51單片機進行仿真, 用dac0832模擬不同的電壓 模仿不同的空氣流量
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:

  1. #include"XPT2046.h"        
  2.            
  3. #include<intrins.h>  //包含_nop_()函數定義的頭文件
  4. #include<reg52.h>
  5. #include"lcd.h"
  6. #include"temp.h"


  7. typedef unsigned int u16;          //???????????
  8. typedef unsigned char u8;
  9. u8 disp[5];
  10. u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  11. //--定義使用的IO口--//
  12. sbit PWM=P2^1;
  13. bit DIR;
  14. sbit k1=P3^1;         //定義P31口是k1
  15. sbit k2=P3^2;         //定義P31口是k1
  16. sbit led=P2^0;         //定義P20口是led
  17. //ADC0832端口引腳定義
  18. //sbit CS=P3^5;       //將CS位定義為P3.4引腳
  19. //sbit CLK=P3^6;      //將CLK位定義為P1.0引腳
  20. sbit DIO=P3^4;       //將DIO位定義為P1.1引腳
  21. //液晶端口定義
  22. sbit RS=P2^6;           //寄存器選擇位,將RS位定義為P2.0引腳
  23. sbit RW=P2^5;           //讀寫選擇位,將RW位定義為P2.1引腳
  24. sbit E=P2^7;            //使能信號位,將E位定義為P2.2引腳
  25. sbit BF=P0^7;           //忙碌標志位,,將BF位定義為P0.7引腳
  26. //全局變量聲明
  27. unsigned char code digit[10]={"0123456789"};   //定義字符數組顯示數字
  28. unsigned char code Str[]={"Volt="};            //說明顯示的是電壓
  29. //--定義一個全局變量--//
  30. u16 count,timer1;

  31. void LcdDisplay(int);
  32. void UsartConfiguration();
  33. void datapros();
  34. /*******************************************************************************
  35. * 函 數 名         : delay
  36. * 函數功能                   : 延時函數,i=1時,大約延時10us
  37. *******************************************************************************/
  38. void delay(u16 i)
  39. {
  40.         while(i--);        
  41. }







  42. /*****************************************************
  43. 函數功能:延時1ms
  44. (3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
  45. ***************************************************/
  46. void delay1ms()
  47. {
  48.    unsigned char i,j;
  49.   for(i=0;i<10;i++)
  50.    for(j=0;j<33;j++)
  51.     ;  
  52. }
  53. /*****************************************************
  54. 函數功能:延時若干毫秒
  55. 入口參數:n
  56. ***************************************************/
  57. void delaynms(unsigned char n)
  58. {
  59.    unsigned char i;
  60. for(i=0;i<n;i++)
  61.     delay1ms();
  62. }
  63. /*****************************************************
  64. 函數功能:判斷液晶模塊的忙碌狀態
  65. 返回值:result。result=1,忙碌;result=0,不忙
  66. ***************************************************/
  67. bit BusyTest(void)
  68.   {
  69.     bit result;
  70. RS=0;       //根據規定,RS為低電平,RW為高電平時,可以讀狀態
  71.     RW=1;
  72.     E=1;        //E=1,才允許讀寫
  73.     _nop_();   //空操作
  74.     _nop_();
  75.     _nop_();
  76.     _nop_();   //空操作四個機器周期,給硬件反應時間
  77.     result=BF;  //將忙碌標志電平賦給result
  78.    E=0;         //將E恢復低電平
  79.    return result;
  80.   }
  81. /*****************************************************
  82. 函數功能:將模式設置指令或顯示地址寫入液晶模塊
  83. 入口參數:dictate
  84. ***************************************************/
  85. void WriteInstruction (unsigned char dictate)
  86. {  
  87.     while(BusyTest()==1);   //如果忙就等待
  88.   RS=0;                  //根據規定,RS和R/W同時為低電平時,可以寫入指令
  89.   RW=0;  
  90.   E=0;                   //E置低電平(根據表8-6,寫指令時,E為高脈沖,
  91.                            // 就是讓E從0到1發生正跳變,所以應先置"0"
  92.   _nop_();
  93.   _nop_();               //空操作兩個機器周期,給硬件反應時間
  94.   P0=dictate;            //將數據送入P0口,即寫入指令或地址
  95.   _nop_();
  96.   _nop_();
  97.   _nop_();
  98.   _nop_();               //空操作四個機器周期,給硬件反應時間
  99.   E=1;                   //E置高電平
  100.   _nop_();
  101.   _nop_();
  102.   _nop_();
  103.   _nop_();               //空操作四個機器周期,給硬件反應時間
  104.    E=0;                  //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  105. }
  106. /*****************************************************
  107. 函數功能:指定字符顯示的實際地址
  108. 入口參數:x
  109. ***************************************************/
  110. void WriteAddress(unsigned char x)
  111. {
  112.      WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"
  113. }
  114. /*****************************************************
  115. 函數功能:將數據(字符的標準ASCII碼)寫入液晶模塊
  116. 入口參數:y(為字符常量)
  117. ***************************************************/
  118. void WriteData(unsigned char y)
  119. {
  120.     while(BusyTest()==1);
  121.    RS=1;           //RS為高電平,RW為低電平時,可以寫入數據
  122.    RW=0;
  123.    E=0;            //E置低電平(根據表8-6,寫指令時,E為高脈沖,
  124.                      // 就是讓E從0到1發生正跳變,所以應先置"0"
  125.    P0=y;           //將數據送入P0口,即將數據寫入液晶模塊
  126.    _nop_();
  127.    _nop_();
  128.     _nop_();
  129.      _nop_();       //空操作四個機器周期,給硬件反應時間
  130.    E=1;           //E置高電平
  131.    _nop_();
  132.    _nop_();
  133.    _nop_();
  134.   _nop_();        //空操作四個機器周期,給硬件反應時間
  135.   E=0;            //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  136. }
  137. /*****************************************************
  138. 函數功能:對LCD的顯示模式進行初始化設置
  139. ***************************************************/
  140. void LcdInitiate(void)
  141. {
  142.     delaynms(15);               //延時15ms,首次寫指令時應給LCD一段較長的反應時間
  143.     WriteInstruction(0x38);     //顯示模式設置:16×2顯示,5×7點陣,8位數據接口
  144. delaynms(5);                //延時5ms ,給硬件一點反應時間
  145.     WriteInstruction(0x38);
  146. delaynms(5);               //延時5ms ,給硬件一點反應時間
  147. WriteInstruction(0x38);     //連續三次,確保初始化成功
  148. delaynms(5);               //延時5ms ,給硬件一點反應時間
  149. WriteInstruction(0x0c);     //顯示模式設置:顯示開,無光標,光標不閃爍
  150. delaynms(5);               //延時5ms ,給硬件一點反應時間
  151. WriteInstruction(0x06);     //顯示模式設置:光標右移,字符不移
  152. delaynms(5);                //延時5ms ,給硬件一點反應時間
  153. WriteInstruction(0x01);     //清屏幕指令,將以前的顯示內容清除
  154. delaynms(5);             //延時5ms ,給硬件一點反應時間
  155. }

  156. /*****************************************************
  157. 函數功能:顯示電壓符號
  158. ***************************************************/  
  159. void display_volt(void)
  160. {
  161.     unsigned char i;
  162.   WriteAddress(0x03);    //寫顯示地址,將在第2行第1列開始顯示
  163.   i = 0;                //從第一個字符開始顯示
  164.   while(Str[i] != '\0')  //只要沒有寫到結束標志,就繼續寫
  165.    {      
  166.    WriteData(Str[i]);   //將字符常量寫入LCD
  167.    i++;                 //指向下一個字符   
  168.   }
  169. }
  170. /*****************************************************
  171. 函數功能:顯示電壓的小數點
  172. ***************************************************/  
  173. void  display_dot(void)
  174. {        
  175.   WriteAddress(0x09);   //寫顯示地址,將在第1行第10列開始顯示   
  176.   WriteData('.');       //將小數點的字符常量寫入LCD  
  177. }
  178. /*****************************************************
  179. 函數功能:顯示電壓的單位(V)
  180. ***************************************************/  
  181. void  display_V(void)
  182. {
  183.     WriteAddress(0x0c); //寫顯示地址,將在第2行第13列開始顯示
  184.   WriteData('V');     //將字符常量寫入LCD   
  185.    
  186. }
  187. /*****************************************************
  188. 函數功能:顯示電壓的整數部分
  189. 入口參數:x
  190. ***************************************************/
  191. void display1(unsigned char x)
  192. {
  193. WriteAddress(0x08);    //寫顯示地址,將在第2行第7列開始顯示
  194. WriteData(digit[x]);    //將百位數字的字符常量寫入LCD
  195. }
  196. /*****************************************************
  197. 函數功能:顯示電壓的小數數部分
  198. 入口參數:x
  199. ***************************************************/
  200. void display2(unsigned char x)
  201. {
  202.   unsigned char i,j;
  203. i=x/10;            //取十位(小數點后第一位)
  204. j=x%10;            //取個位(小數點后第二位)
  205.    WriteAddress(0x0a);      //寫顯示地址,將在第1行第11列開始顯示
  206. WriteData(digit[i]);     //將小數部分的第一位數字字符常量寫入LCD
  207. WriteData(digit[j]);     //將小數部分的第一位數字字符常量寫入LCD
  208. }
  209. /*****************************************************
  210. 函數功能:將模擬信號轉換成數字信號
  211. ***************************************************/
  212. unsigned char  A_D()
  213. {
  214.   unsigned char i,dat;
  215.    CS=1;   //一個轉換周期開始
  216.    CLK=0;  //為第一個脈沖作準備
  217.    CS=0;  //CS置0,片選有效
  218.    DIO=1;    //DIO置1,規定的起始信號
  219.    CLK=1;   //第一個脈沖
  220.    CLK=0;   //第一個脈沖的下降沿,此前DIO必須是高電平
  221.    DIO=1;   //DIO置1, 通道選擇信號
  222.    CLK=1;   //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選通道CH0
  223.    CLK=0;   //第二個脈沖下降沿
  224.    
  225.    DIO=0;   //DI置0,選擇通道0
  226.    CLK=1;    //第三個脈沖
  227.    CLK=0;    //第三個脈沖下降沿
  228.    DIO=1;    //第三個脈沖下沉之后,輸入端DIO失去作用,應置1
  229.    CLK=1;    //第四個脈沖
  230.    for(i=0;i<8;i++)  //高位在前
  231.     {
  232.       CLK=1;         //第四個脈沖
  233.       CLK=0;
  234.       dat<<=1;       //將下面儲存的低位數據向右移
  235.    dat|=(unsigned char)DIO;   //將輸出數據DIO通過或運算儲存在dat最低位
  236.     }            
  237.     CS=1;          //片選無效
  238.   return dat;  //將讀書的數據返回   
  239.   }

  240. /*******************************************************************************
  241. * 函 數 名         : keypros
  242. * 函數功能                   : 按鍵處理函數,判斷按鍵K1是否按下
  243. *******************************************************************************/
  244. void keypros()
  245. {

  246. }
  247. //keypros();  //按鍵處理函數        
  248. /*******************************************************************************
  249. * 函 數 名         : Timer1Init
  250. * 函數功能                   : 定時器1初始化
  251. * 輸    入         : 無
  252. * 輸    出         : 無
  253. *******************************************************************************/
  254. void Timer1Init()
  255. {
  256.         TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。

  257.         TH1 = 0xFF;
  258.         TL1 = 0xff;   //1us
  259.                
  260.         ET1=1;//打開定時器1中斷允許
  261.         EA=1;//打開總中斷
  262.         TR1=1;//打開定時器                        
  263. }

  264. /*******************************************************************************
  265. * 函數名         : main
  266. * 函數功能                   : 主函數
  267. * 輸入           : 無
  268. * 輸出                  : 無
  269. *******************************************************************************/
  270. void main()
  271. {                 u16 value=0 ,a=0,b=0 ;
  272.   unsigned int AD_val;    //儲存A/D轉換后的值
  273.   unsigned char Int,Dec;   //分別儲存轉換后的整數部分與小數部分
  274.    LcdInitiate();         //將液晶初始化
  275.    delaynms(5);           //延時5ms給硬件一點反應時間
  276. display_volt();        //顯示溫度說明
  277.    display_dot();         //顯示溫度的小數點
  278.    display_V();           //顯示溫度的單位
  279.         Timer1Init();  //定時器1初始化
  280.         LcdInit();                         //初始化LCD1602
  281.         LcdWriteCom(0x88);        //寫地址 80表示初始地址
  282.         
  283.                 led=0;
  284.         while(1)
  285.         {        

  286.                             AD_val= A_D();    //進行A/D轉換        
  287.            Int=(AD_val)/51;  //計算整數部分
  288.                            if(Int>4){led=1;


  289.                                                    LcdWriteCom(0xc2);                 //寫地址 80表示初始地址
  290.         LcdWriteData(' '); //顯示小數點

  291.                 LcdWriteCom(0xc3);                 //寫地址 80表示初始地址
  292.         LcdWriteData('E'); //顯示小數點
  293.         
  294.                 LcdWriteCom(0xc4);                 //寫地址 80表示初始地址
  295.         LcdWriteData('R'); //顯示小數點

  296.         LcdWriteCom(0xc5);                 //寫地址 80表示初始地址
  297.         LcdWriteData('R'); //顯示小數點

  298.                 LcdWriteCom(0xc6);                 //寫地址 80表示初始地址
  299.         LcdWriteData('O');; //顯示小數點
  300.         
  301.                         LcdWriteCom(0xc7);                 //寫地址 80表示初始地址
  302.         LcdWriteData('R');; //顯示小數點
  303.         
  304.                         LcdWriteCom(0xc8);                 //寫地址 80表示初始地址
  305.         LcdWriteData('!');; //顯示小數點


  306.         
  307.                            }        //超過4報警
  308.                            else{
  309.                            
  310.                            
  311.                                                    led=0;


  312.                                                    LcdWriteCom(0xc2);                 //寫地址 80表示初始地址
  313.         LcdWriteData('N'); //顯示小數點
  314.         SBUF = ' ';//將接收到的數據放入到發送寄存器
  315.         while (!TI);                                 //等待發送數據完成
  316.         TI = 0;
  317.                 LcdWriteCom(0xc3);                 //寫地址 80表示初始地址
  318.         LcdWriteData('O'); //顯示小數點
  319.         
  320.         TI = 0;
  321.                 LcdWriteCom(0xc4);                 //寫地址 80表示初始地址
  322.         LcdWriteData('R'); //顯示小數點
  323.         
  324.         TI = 0;
  325.         LcdWriteCom(0xc5);                 //寫地址 80表示初始地址
  326.         LcdWriteData('M'); //顯示小數點
  327.         
  328.         TI = 0;
  329.                 LcdWriteCom(0xc6);                 //寫地址 80表示初始地址
  330.         LcdWriteData('A');; //顯示小數點

  331.         TI = 0;
  332.                         LcdWriteCom(0xc7);                 //寫地址 80表示初始地址
  333.         LcdWriteData('L');; //顯示小數點

  334.         TI = 0;
  335.                         LcdWriteCom(0xc8);                 //寫地址 80表示初始地址
  336.         LcdWriteData('!');; //顯示小數點
  337.         
  338.         TI = 0;
  339.                            }
  340.                         



  341.            Dec=(AD_val%51)*100/51;    //計算小數部分

  342.             WriteAddress(0x08);    //寫顯示地址,將在第2行第7列開始顯示
  343. display1(Int);    //將百位數字的字符常量寫入LCD
  344.     display2(Dec);     //顯示小數部分

  345.                  display_dot();         //顯示溫度的小數點
  346.    display_V();           //顯示溫度的單位
  347.                                 
  348.         



  349.                

  350.         }               
  351. }


  352. /*******************************************************************************
  353. * 函 數 名       : Time1
  354. * 函數功能                 : 定時器1的中斷函數
  355. * 輸    入       : 無
  356. * 輸    出       : 無
  357. *******************************************************************************/

  358. void Time1(void) interrupt 3    //3 為定時器1的中斷號  1 定時器0的中斷號 0 外部中斷1 2 外部中斷2  4 串口中斷
  359. {
  360.         TH1 = 0xFF;
  361.         TL1 = 0xff;   //1us
  362.         timer1++;

  363.         
  364. }


  365. /*******************************************************************************
  366. * 函 數 名         :UsartConfiguration()
  367. * 函數功能                   :設置串口
  368. * 輸    入         : 無
  369. * 輸    出         : 無
  370. *******************************************************************************/

  371. void UsartConfiguration()
  372. {
  373.         SCON=0X50;                        //設置為工作方式1
  374.         TMOD=0X20;                        //設置計數器工作方式2
  375.         PCON=0X80;                        //波特率加倍
  376.         TH1=0XF3;                                //計數器初始值設置,注意波特率是4800的
  377.         TL1=0XF3;
  378. //        ES=1;                                                //打開接收中斷
  379. //        EA=1;                                                //打開總中斷
  380.         TR1=1;                                        //打開計數器
  381. }
復制代碼

所有資料51hei提供下載:
F流量計空氣.zip (143.97 KB, 下載次數: 20)
(管理提醒:程序測試不成功 請謹慎下載)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 四虎影音 | 免费一看一级毛片 | 久热精品在线 | 伊人狠狠 | 97色在线观看免费视频 | 日韩av在线中文字幕 | 日本成人片在线观看 | 成人精品一区二区三区 | 一区视频在线免费观看 | 国产精品久久久久久久久久久久冷 | 成人不卡 | 黄色网络在线观看 | 成人av片在线观看 | 国产在线精品一区二区三区 | 精品免费国产视频 | 国产中文一区二区三区 | 99精品一区二区 | 欧美伊人久久久久久久久影院 | 亚洲在线| 91新视频| 免费在线观看一区二区三区 | 国产成人精品久久久 | www国产亚洲精品久久网站 | 91porn在线观看 | 国产乱码精品1区2区3区 | 日韩手机在线看片 | 中文字幕日韩一区 | 国产婷婷色综合av蜜臀av | 国产一区二区三区四区五区加勒比 | 国产成人免费视频 | 中文字幕免费中文 | 成人av激情 | 91免费小视频 | 成人在线播放网站 | 成人乱人乱一区二区三区软件 | 欧美中文在线 | 国产精品欧美一区喷水 | 在线国产一区二区三区 | 国产乱码精品一区二区三区中文 | 国产精品一区二区三区在线 | 国产清纯白嫩初高生在线播放视频 |