找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1637|回復: 4
打印 上一主題 下一主題
收起左側(cè)

單片機程序是對脈沖進行計數(shù),然后從lcd顯示出來,但就是顯示不正確 求幫助

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:839532 發(fā)表于 2021-5-11 22:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg52.h>
#include<intrins.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
#define DataPort P2
sbit RS = P3^0; //定義端口 (顯示屏)
sbit RW = P3^1;
sbit EN = P3^2;
void LCD_Init(void);
void inti()
{ LCD_Init() ;
TMOD=0x05 ;//*T0為16位計數(shù)方式*/
TH0=F0 ;
TL0=60 ;//*預置初值*/
TR0=1;
}
// 單片機計算脈沖數(shù) 顯示
uint num;//計數(shù)變量聲明
/*延時子程序*******************************************************/
void delay(uint xms)
{
uint j;
for(;xms>0;xms--)
for(j=110;j>0;j--);
}
/*------------------------------------------------
uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
判忙函數(shù)
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return (bit)(DataPort & 0x80);
}
/*------------------------------------------------
寫入命令函數(shù)
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{
//while(LCD_Check_Busy()); //忙則等待
DelayMs(5);
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
寫入數(shù)據(jù)函數(shù)
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
//while(LCD_Check_Busy()); //忙則等待
DelayMs(5);
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函數(shù)
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
寫入字符串函數(shù)
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x); //表示第一行
}
else
{
LCD_Write_Com(0xC0 + x); //表示第二行
}
while (*s)
{
LCD_Write_Data( *s);
s ++;
}
}
/*------------------------------------------------
寫入字符函數(shù)
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data( Data);
}
/*------------------------------------------------
初始化函數(shù)
------------------------------------------------*/
void LCD_Init(void)
{
LCD_Write_Com(0x38); /*顯示模式設(shè)置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*顯示關(guān)閉*/
LCD_Write_Com(0x01); /*顯示清屏*/
LCD_Write_Com(0x06); /*顯示光標移動設(shè)置*/
DelayMs(5);
LCD_Write_Com(0x0C); /*顯示開及光標設(shè)置*/
}
/*主程序***************************************************************/
void main()
{
inti();
while(1)
{
float num1,num2,num;
unsigned char x;
unsigned char y;
unsigned char Data;
Data=TH0*255+TL0;//讀計數(shù)器數(shù)據(jù)
if(Data==4000){TH0=F0;TL0=60;TR0=0;} //計滿清零
num1=Data/4*0.05;
num2=0.05/4*(Data%4);
num=num1+num2;
LCD_Write_Char(x,y,num);
}
}

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

使用道具 舉報

沙發(fā)
ID:65956 發(fā)表于 2021-5-12 08:22 | 只看該作者
雖然沒有附上實際運行結(jié)果圖,但按個人經(jīng)驗來看,我認為你計算器應采用中斷方式進入計數(shù),而顯示放在主函數(shù)中運行,這樣才能保證計數(shù)后送顯示的及時性和正確性,如果按你現(xiàn)在計數(shù)及顯示都在主函數(shù)處理,你會發(fā)現(xiàn)計數(shù)值比你顯示的快得多,因為顯示需要的時間遠遠大于計數(shù),除非你的計數(shù)是HZ速度,如果是KHZ的速度,顯示會來不及顯示,所以計數(shù)值會比顯示快,也就是你說的不對,只是想法,希望對你有幫助
回復

使用道具 舉報

板凳
ID:213173 發(fā)表于 2021-5-12 10:48 | 只看該作者
脈沖頻率不太高可以用這個方式計數(shù)。你的計數(shù)和數(shù)據(jù)處理有點問題,不清楚你要顯示實際數(shù)還是比例數(shù),按需自行修改。
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<math.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define RS_CLR RS=0
  7. #define RS_SET RS=1
  8. #define RW_CLR RW=0
  9. #define RW_SET RW=1
  10. #define EN_CLR EN=0
  11. #define EN_SET EN=1
  12. #define DataPort P0
  13. sbit RS = P3^0; //定義端口 (顯示屏)
  14. sbit RW = P3^1;
  15. sbit EN = P3^2;
  16. uchar data dis_buf[]="0000";

  17. void LCD_Init(void);

  18. void inti()
  19. {
  20.         LCD_Init() ;
  21.         TMOD=0x05 ;//*T0為16位計數(shù)方式*/
  22.         TH0=F0 ;
  23.         TL0=60 ;//*預置初值*/
  24.         TR0=1;
  25. }
  26. // 單片機計算脈沖數(shù) 顯示
  27. //uint num;//計數(shù)變量聲明
  28. /*延時子程序*******************************************************/
  29. /*
  30. void delay(uint xms)
  31. {
  32.         uint j;
  33.         for(;xms>0;xms--)
  34.                 for(j=110;j>0;j--);
  35. }*/
  36. /*------------------------------------------------
  37. uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
  38. unsigned char 是定義無符號字符變量,其值的范圍是
  39. 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
  40. 長度如下 T=tx2+5 uS
  41. ------------------------------------------------*/
  42. void DelayUs2x(unsigned char t)
  43. {
  44. while(--t);
  45. }
  46. /*------------------------------------------------
  47. mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
  48. unsigned char 是定義無符號字符變量,其值的范圍是
  49. 0~255 這里使用晶振12M,精確延時請使用匯編
  50. ------------------------------------------------*/
  51. void DelayMs(unsigned char t)
  52. {
  53. while(t--)
  54. {
  55. //大致延時1mS
  56. DelayUs2x(245);
  57. DelayUs2x(245);
  58. }
  59. }
  60. /*------------------------------------------------
  61. 判忙函數(shù)
  62. ------------------------------------------------*/
  63. /*
  64. bit LCD_Check_Busy(void)
  65. {
  66.         DataPort= 0xFF;
  67.         RS_CLR;
  68.         RW_SET;
  69.         EN_CLR;
  70.         _nop_();
  71.         EN_SET;
  72.         return (bit)(DataPort & 0x80);
  73. }*/
  74. /*------------------------------------------------
  75. 寫入命令函數(shù)
  76. ------------------------------------------------*/
  77. void LCD_Write_Com(unsigned char com)
  78. {
  79.         //while(LCD_Check_Busy()); //忙則等待
  80.         DelayMs(5);
  81.         RS_CLR;
  82.         RW_CLR;
  83.         EN_SET;
  84.         DataPort= com;
  85.         _nop_();
  86.         EN_CLR;
  87. }
  88. /*------------------------------------------------
  89. 寫入數(shù)據(jù)函數(shù)
  90. ------------------------------------------------*/
  91. void LCD_Write_Data(unsigned char Data)
  92. {
  93.         //while(LCD_Check_Busy()); //忙則等待
  94.         DelayMs(5);
  95.         RS_SET;
  96.         RW_CLR;
  97.         EN_SET;
  98.         DataPort= Data;
  99.         _nop_();
  100.         EN_CLR;
  101. }
  102. /*------------------------------------------------
  103. 清屏函數(shù)
  104. ------------------------------------------------*/
  105. /*
  106. void LCD_Clear(void)
  107. {
  108.         LCD_Write_Com(0x01);
  109.         DelayMs(5);
  110. }*/
  111. /*------------------------------------------------
  112. 寫入字符串函數(shù)
  113. ------------------------------------------------*/
  114. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  115. {
  116.         if (y == 0)
  117.         {
  118.                 LCD_Write_Com(0x80 + x); //表示第一行
  119.         }
  120.         else
  121.         {
  122.                 LCD_Write_Com(0xC0 + x); //表示第二行
  123.         }
  124.         while (*s)
  125.         {
  126.                 LCD_Write_Data( *s);
  127.                 s ++;
  128.         }
  129. }
  130. /*------------------------------------------------
  131. 寫入字符函數(shù)
  132. ------------------------------------------------*/
  133. /*
  134. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  135. {
  136.         if (y == 0)
  137.         {
  138.                 LCD_Write_Com(0x80 + x);
  139.         }
  140.         else
  141.         {
  142.                 LCD_Write_Com(0xC0 + x);
  143.         }
  144.         LCD_Write_Data( Data);
  145. }*/
  146. /*------------------------------------------------
  147. 初始化函數(shù)
  148. ------------------------------------------------*/
  149. void LCD_Init(void)
  150. {
  151. LCD_Write_Com(0x38); /*顯示模式設(shè)置*/
  152. DelayMs(5);
  153. LCD_Write_Com(0x38);
  154. DelayMs(5);
  155. LCD_Write_Com(0x38);
  156. DelayMs(5);
  157. LCD_Write_Com(0x38);
  158. LCD_Write_Com(0x08); /*顯示關(guān)閉*/
  159. LCD_Write_Com(0x01); /*顯示清屏*/
  160. LCD_Write_Com(0x06); /*顯示光標移動設(shè)置*/
  161. DelayMs(5);
  162. LCD_Write_Com(0x0C); /*顯示開及光標設(shè)置*/
  163. }
  164. /*主程序***************************************************************/
  165. void main()
  166. {
  167.         unsigned int  Data;
  168.         inti();
  169.         while(1)
  170.         {
  171.                 Data=TH0<<8|TL0;//讀計數(shù)器數(shù)據(jù)
  172.                 if(Data>=4000)
  173.                         TR0=0;
  174.                 dis_buf[0]=Data/1000%10+'0';
  175.                 dis_buf[1]=Data/100%10+'0';
  176.                 dis_buf[2]=Data/10%10+'0';
  177.                 dis_buf[3]=Data%10+'0';
  178.                 LCD_Write_String(0,0,dis_buf);

  179.         }
  180. }

復制代碼



回復

使用道具 舉報

地板
ID:839532 發(fā)表于 2021-5-12 11:41 | 只看該作者
aking991 發(fā)表于 2021-5-12 08:22
雖然沒有附上實際運行結(jié)果圖,但按個人經(jīng)驗來看,我認為你計算器應采用中斷方式進入計數(shù),而顯示放在主函數(shù) ...

我計數(shù)的是khz的,那我應該怎么修改啊,剛接觸,寫的比較簡單,用的是中斷計數(shù),不知道這個計數(shù)程序?qū)懙膶Σ粚,很多東西都沒想到,求大神指點一下
回復

使用道具 舉報

5#
ID:839532 發(fā)表于 2021-5-12 15:14 | 只看該作者
wulin 發(fā)表于 2021-5-12 10:48
脈沖頻率不太高可以用這個方式計數(shù)。你的計數(shù)和數(shù)據(jù)處理有點問題,不清楚你要顯示實際數(shù)還是比例數(shù),按需自 ...

謝謝大神謝謝謝謝,問題解決了謝謝謝謝
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表