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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+LM393測速傳感器在LCD12864上顯示程序

  [復制鏈接]
跳轉到指定樓層
樓主
    第一次發,不知道怎么發。。。為比賽準備的程序,可惜比賽沒用到。用的LCD12864是帶字庫的,用的是LM393測速傳感器如圖。
    程序分為main.c+lcd12864.c+lcd12864.h

制作出來的實物圖如下:


單片機源程序如下:

//lcd12864.h的程序

#ifndef __LCD12864_H
#define __LCD12864_H
//---包含頭文件---//
#include<reg51.h>
//---重定義關鍵詞---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//---如果使用畫圖模式定義這個---//
//#define LCD12864_PICTURE
//---定義使用的IO口---//
#define LCD12864_DATAPORT P0   //數據IO口
sbit LCD12864_RS  =  P2^6;             //(數據命令)寄存器選擇輸入
sbit LCD12864_RW  =  P2^5;             //液晶讀/寫控制
sbit LCD12864_EN  =  P2^7;             //液晶使能控制
sbit LCD12864_PSB =  P3^2;             //串/并方式控制
sbit LCD12864_RST =  P3^4;      //復位端

//---聲明全局函數---//
void LCD12864_Delay1ms(uint c);
uchar LCD12864_Busy(void);
void LCD12864_WriteCmd(uchar cmd);
void LCD12864_WriteData(uchar dat);
void LCD12864_Init();
void LCD12864_ClearScreen(void);
void LCD12864_SetWindow(uchar x, uchar y);
#endif


//lcd12864.c 的程序

  1. #include"lcd12864.h"
  2. /*******************************************************************************
  3. * 函 數 名         : LCD12864_Delay1ms
  4. * 函數功能     : 延時1MS
  5. * 輸    入         : c
  6. * 輸    出         : 無
  7. *******************************************************************************/
  8. void LCD12864_Delay1ms(uint c)
  9. {
  10.     uchar a,b;
  11. for(; c>0; c--)
  12. {
  13.      for(b=199; b>0; b--)
  14.   {
  15.          for(a=10; a>0; a--);
  16.   }
  17. }
  18. }
  19. /*******************************************************************************
  20. * 函 數 名         : LCD12864_Busy
  21. * 函數功能     : 檢測LCD是否忙
  22. * 輸    入         : 無
  23. * 輸    出         : 1或0(1表示不忙,0表示忙)
  24. *******************************************************************************/
  25. uchar LCD12864_Busy(void)
  26. {
  27. uchar i = 0;
  28. LCD12864_RS = 0;    //選擇命令
  29. LCD12864_RW = 1; //選擇讀取
  30. LCD12864_EN = 1;
  31. LCD12864_Delay1ms(1);
  32. while((LCD12864_DATAPORT & 0x80) == 0x80) //檢測讀取到的值
  33. {
  34.   i++;
  35.   if(i > 100)
  36.   {
  37.    LCD12864_EN = 0;
  38.    return 0;    //超過等待時間返回0表示失敗
  39.   }
  40. }
  41. LCD12864_EN = 0;
  42. return 1;
  43. }
  44. /*******************************************************************************
  45. * 函 數 名         : LCD12864_WriteCmd
  46. * 函數功能     : 寫命令
  47. * 輸    入         : cmd
  48. * 輸    出         : 無
  49. *******************************************************************************/
  50. void LCD12864_WriteCmd(uchar cmd)
  51. {
  52. uchar i;
  53. i = 0;
  54. while( LCD12864_Busy() == 0)
  55. {
  56.   LCD12864_Delay1ms(1);
  57.   i++;
  58.   if( i>100)
  59.   {
  60.    return;    //超過等待退出
  61.   }
  62. }

  63. LCD12864_RS = 0;     //選擇命令
  64. LCD12864_RW = 0;     //選擇寫入
  65. LCD12864_EN = 0;     //初始化使能端
  66. LCD12864_DATAPORT = cmd;   //放置數據
  67. LCD12864_EN = 1;     //寫時序
  68. LCD12864_Delay1ms(5);
  69. LCD12864_EN = 0;         
  70. }
  71. /*******************************************************************************
  72. * 函 數 名         : LCD12864_WriteData
  73. * 函數功能     : 寫數據
  74. * 輸    入         : dat
  75. * 輸    出         : 無
  76. *******************************************************************************/
  77. void LCD12864_WriteData(uchar dat)
  78. {
  79. uchar i;
  80. i = 0;
  81. while( LCD12864_Busy() == 0)
  82. {
  83.   LCD12864_Delay1ms(1);
  84.   i++;
  85.   if( i>100)
  86.   {
  87.    return;    //超過等待退出
  88.   }
  89. }
  90. LCD12864_RS = 1;     //選擇數據
  91. LCD12864_RW = 0;     //選擇寫入
  92. LCD12864_EN = 0;     //初始化使能端
  93. LCD12864_DATAPORT = dat;   //放置數據
  94. LCD12864_EN = 1;     //寫時序
  95. LCD12864_Delay1ms(5);
  96. LCD12864_EN = 0;            
  97. }
  98. /*******************************************************************************
  99. * 函 數 名         : LCD12864_ReadData
  100. * 函數功能     : 讀取數據
  101. * 輸    入         : 無
  102. * 輸    出         : 讀取到的8位數據
  103. *******************************************************************************/
  104. #ifdef LCD12864_PICTURE
  105. uchar LCD12864_ReadData(void)
  106. {
  107. uchar i, readValue;
  108. i = 0;
  109. while( LCD12864_Busy() == 0)
  110. {
  111.   LCD12864_Delay1ms(1);
  112.   i++;
  113.   if( i>100)
  114.   {
  115.    return 0;    //超過等待退出
  116.   }
  117. }
  118. LCD12864_RS = 1;       //選擇命令
  119. LCD12864_RW = 1;
  120. LCD12864_EN = 0;
  121. LCD12864_Delay1ms(1);  //等待
  122. LCD12864_EN = 1;
  123. LCD12864_Delay1ms(1);
  124. readValue = LCD12864_DATAPORT;
  125. LCD12864_EN = 0;
  126. return readValue;
  127. }
  128. #endif
  129. /*******************************************************************************
  130. * 函 數 名         : LCD12864_Init
  131. * 函數功能     : 初始化LCD12864
  132. * 輸    入         : 無
  133. * 輸    出         : 無
  134. *******************************************************************************/
  135. void LCD12864_Init()
  136. {
  137. LCD12864_PSB = 1;   //選擇并行輸入
  138. LCD12864_RST = 1;   //復位
  139. LCD12864_WriteCmd(0x30);  //選擇基本指令操作
  140. LCD12864_WriteCmd(0x0c);  //顯示開,關光標
  141. LCD12864_WriteCmd(0x01);  //清除LCD12864的顯示內容
  142. }
  143. /*******************************************************************************
  144. * 函 數 名         : LCD12864_ClearScreen
  145. * 函數功能     : 在畫圖模式下,LCD12864的01H命令不能清屏,所以要自己寫一個清
  146. *                  * 屏函數
  147. * 輸    入         : 無
  148. * 輸    出         : 無
  149. *******************************************************************************/
  150. #ifdef LCD12864_PICTURE
  151. void LCD12864_ClearScreen(void)
  152. {
  153. uchar i,j;
  154. LCD12864_WriteCmd(0x34);   //開啟拓展指令集
  155. for(i=0;i<32;i++)     //因為LCD有縱坐標32格所以寫三十二次
  156. {
  157.   LCD12864_WriteCmd(0x80+i);    //先寫入縱坐標Y的值
  158.   LCD12864_WriteCmd(0x80);    //再寫入橫坐標X的值
  159.   for(j=0;j<32;j++)    //橫坐標有16位,每位寫入兩個字節的的數據,也
  160.   {        //就寫入32次以為當寫入兩個字節之后橫坐標會自
  161.    LCD12864_WriteData(0xFF);   //動加1,所以就不用再次寫入地址了。
  162.   }
  163. }
  164. LCD12864_WriteCmd(0x36);  //0x36擴展指令里面打開繪圖顯示
  165. LCD12864_WriteCmd(0x30);  //恢復基本指令集
  166. }
  167. #endif
  168. /*******************************************************************************
  169. * 函 數 名         : LCD12864_SetWindow
  170. * 函數功能     : 設置在基本指令模式下設置顯示坐標。注意:x是設置行,y是設置列
  171. * 輸    入         : x, y
  172. * 輸    出         : 無
  173. *******************************************************************************/
  174. void LCD12864_SetWindow(uchar x, uchar y)
  175. {
  176. uchar pos;
  177. if(x == 0)    // 第一行的地址是80H
  178. {
  179.   x = 0x80;
  180. }
  181.   
  182. else if(x == 1)  //第二行的地址是90H
  183. {
  184.   x = 0x90;
  185. }

  186. else if(x == 2)  //第三行的地址是88H
  187. {
  188.   x = 0x88;
  189. }

  190. else if(x == 3)
  191. {
  192.   x = 0x98;
  193. }

  194. pos = x + y;
  195. LCD12864_WriteCmd(pos);
  196. }

  197. //main.c的程序

  198. #include<reg51.h>
  199. #include<lcd12864.h>
  200. //--定義全局變量--//
  201. unsigned char DisplayData[8];
  202. //用來存放要顯示的8位數的值
  203. //--聲明全局函數--//
  204. void TIMER_Configuration(); //初始化定時器
  205. //--定義全局變量--//
  206. unsigned long   Freq;        //用來存放要顯示的頻率值
  207. unsigned long TimeCount;   //用于計算1S鐘的
  208. /*******************************************
  209. *函數名  :main
  210. *功  能  :主函數
  211. *輸  入  :無
  212. *輸  出  :無
  213. *******************************************/
  214. unsigned char code CharCode1[]="速度: n/s";

  215. void main()
  216. {
  217. char i;
  218. TIMER_Configuration();
  219. LCD12864_Init();
  220. LCD12864_SetWindow(0, 0);

  221. while(1)
  222. {
  223.   if(TR0 == 0)         //當計數器停下的時候,表明計數完畢
  224.   {
  225.    Freq = Freq + TL1;         //讀取TL的值
  226.    Freq = Freq + (TH1 * 256); //讀取TH的值
  227.    Freq= Freq/ 2;      //根據扇葉數除數
  228.    //--求頻率的個十百千萬十萬位--//
  229.   

  230.    
  231.    DisplayData[0] = (Freq%100000/10000)+0x30;
  232.    DisplayData[1] = (Freq%10000/1000)+0x30;
  233.    DisplayData[2] = (Freq%1000/100)+0x30;
  234.    DisplayData[3] = (Freq%100/10)+0x30;
  235.    DisplayData[4] = (Freq%10)+0x30;
  236.    
  237.    //--顯示完,重新計算下一次頻率。--//
  238.    Freq = 0;//將計算的頻率清零
  239.    TH1 = 0; //將計數器的值清零
  240.    TL1 = 0;
  241.    TR0 = 1; //開啟定時器
  242.    TR1 = 1; //開啟計數器
  243.   }
  244.   //--顯示求得的數值--//
  245.   LCD12864_SetWindow(0,0);
  246.   LCD12864_WriteData(CharCode1[0]);
  247.   LCD12864_WriteData(CharCode1[1]);
  248.      LCD12864_WriteData(CharCode1[2]);
  249.      LCD12864_WriteData(CharCode1[3]);
  250.      LCD12864_WriteData(CharCode1[4]);
  251.      LCD12864_WriteData(CharCode1[5]);
  252.   for(i=0;i<5;i++)   
  253.   LCD12864_WriteData(DisplayData[i]);
  254.   LCD12864_WriteData(CharCode1[7]);
  255.      LCD12864_WriteData(CharCode1[8]);
  256.      LCD12864_WriteData(CharCode1[9]);
  257. }
  258. }
  259. /*******************************************
  260. *函數名  :TIMER_Configuration
  261. *功  能  :配置定時/計數器T0和T1
  262. *輸  入  :無
  263. *輸  出  :無
  264. *******************************************/
  265. void TIMER_Configuration()
  266. {
  267. //--定時器T1做計數器,工作方式1(16位定時器),只由TRx打開計數器--//
  268. //--定時器T0做定時器,工作方式1(16位定時器),只由TRx打開定時器--//
  269. TMOD=0x51;
  270. //--設置定時器晶振為12MHZ時定時50ms--//
  271. TH0=0x3C;
  272. TL0=0xB0;
  273. //--打開中斷-//
  274. ET0=1;
  275. ET1=1;
  276. EA=1;
  277. //--打開定時器*/
  278. TR0=1;
  279. TR1=1;
  280. }
  281. /*******************************************
  282. *函數名  :Timer0
  283. *功  能  :定時器0的中斷函數
  284. *輸  入  :無
  285. *輸  出  :無
  286. *******************************************/
  287. void Timer0() interrupt 1
  288. {
  289. TimeCount++;
  290. if(TimeCount==20)//計時到1S
  291. {
  292.   TR0=0;
  293.   TR1=0;
  294.   TimeCount=0;  
  295. }
  296. //--12MHZ設置定時50ms的初值--//
  297. TH0=0x3C;
  298. TL0=0xB0;
  299. }
  300. /*******************************************
  301. *函數名  :Timer1
  302. *功  能  :定時器1的中斷函數
  303. *輸  入  :無
  304. *輸  出  :無
  305. *******************************************/
  306. void Timer1() interrupt 3
  307. {
  308. //--進入一次中斷,表明計數到了65536--//
  309. Freq=Freq+65536;  
  310. }
復制代碼

全部資料51hei下載地址:
測速—12864.zip (35.86 KB, 下載次數: 54)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:541949 發表于 2019-5-19 11:24 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频第一页 | 国产一在线观看 | 成人区精品一区二区婷婷 | 亚洲一区二区三区免费在线 | 成人免费黄色片 | 九色 在线 | 国产精品久久久久久久免费观看 | 久久高清国产视频 | 粉嫩av| 97国产在线视频 | 第四色影音先锋 | 国产欧美一区二区三区免费 | 中文字幕乱码一区二区三区 | 亚洲精品乱码8久久久久久日本 | 免费黄色大片 | 欧美精品一区二区三区在线播放 | 欧美成人在线影院 | 国产乱码精品一品二品 | 综合五月| 亚洲激情一区二区 | 国产一区二区三区四区 | 情侣酒店偷拍一区二区在线播放 | 亚洲三级在线观看 | 欧美精品91 | 日韩精品专区在线影院重磅 | 97久久精品午夜一区二区 | 亚洲成人精品一区二区 | 国产精品99久久久久久久久 | 亚洲欧美日韩精品久久亚洲区 | 中文一区| 久久久精品一区二区 | 黄色大全免费看 | 手机av在线 | 九九av| 亚洲有码转帖 | 亚洲精品久久久一区二区三区 | 视频在线观看一区二区 | 欧美黑人一区二区三区 | 97色在线视频 | 成人高潮片免费视频欧美 | 99久久亚洲 |