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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2380|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)空氣流量計(jì)Proteus仿真程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:430727 發(fā)表于 2019-12-19 16:07 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
仿真 使用Proteus +keil4 使用51單片機(jī)進(jìn)行仿真, 用dac0832模擬不同的電壓 模仿不同的空氣流量
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:

  1. #include"XPT2046.h"        
  2.            
  3. #include<intrins.h>  //包含_nop_()函數(shù)定義的頭文件
  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;            //使能信號(hào)位,將E位定義為P2.2引腳
  25. sbit BF=P0^7;           //忙碌標(biāo)志位,,將BF位定義為P0.7引腳
  26. //全局變量聲明
  27. unsigned char code digit[10]={"0123456789"};   //定義字符數(shù)組顯示數(shù)字
  28. unsigned char code Str[]={"Volt="};            //說明顯示的是電壓
  29. //--定義一個(gè)全局變量--//
  30. u16 count,timer1;

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







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

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

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

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

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

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

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


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

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

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

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


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


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

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

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



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

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

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



  349.                

  350.         }               
  351. }


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

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

  363.         
  364. }


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

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

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



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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 中文字字幕一区二区三区四区五区 | 久操国产 | 中文字幕国产精品视频 | 日本成人三级电影 | 日韩欧美1区2区 | 日韩在线资源 | 丁香婷婷成人 | 欧美日韩亚洲视频 | 亚洲综合色视频在线观看 | 午夜免费看 | 亚洲成av人片在线观看无码 | 亚洲h在线观看 | 国产精品无码专区在线观看 | 欧美一级片在线观看 | 日韩欧美一区二区在线播放 | 国产精品久久久久久52avav | 久久99精品久久久久久 | 日韩欧美视频在线 | 久久精品视频在线免费观看 | 91精品国产欧美一区二区成人 | 精品视频国产 | 久久久这里都是精品 | 精品乱人伦一区二区三区 | 日韩在线看片 | 91视频国产精品 | 婷婷桃色网 | 亚洲精品大片 | 色播视频在线观看 | 欧洲一区二区在线 | 欧美激情一区二区三区 | 成人午夜激情 | 亚洲天堂av网 | 午夜视频免费 | 亚洲精品综合一区二区 | 久久久久久亚洲精品 | 亚洲九九色| 狠狠爱免费视频 | 久草成人 | 无码日韩精品一区二区免费 | 久久精品一级 | 91精品国产一区二区 |