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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7515|回復: 4
收起左側

[求助]AD轉換結果輸出到1602上亂碼

[復制鏈接]
ID:27772 發表于 2011-1-12 01:09 | 顯示全部樓層 |閱讀模式

代碼如下,第一行正常顯示,第二行亂碼

 

  1. <br>1 #include<STC12C5A60S2.H> <br>2 #include<intrins.h> <br>3 <br>4 #define uchar unsigned char <br>5 #define uint unsigned int <br>6 <br>7 unsigned int temp1,sh1,ge1,n1,m1; <br>8 unsigned char ad_result_data[10]; //AD轉換高八位 <br>9 unsigned char ad_result_low2[10]; //AD轉換低八位 <br>10 unsigned char ad_result_total[10]; //AD轉換總十位 <br>11 unsigned char ad_average_result; //AD轉換十次的平均值 <br>12 unsigned char Ain,Vin; <br>13 unsigned int temp1,sh1,ge1,n1,m1; <br>14 char tp=0; <br>15 <br>16 //===============================LCD1602接口定義===================== <br>17 <br>18 //定義引腳 <br>19 #define LCM_Data P0 //數據接口 <br>20 #define Busy 0x80 //用于檢測LCM狀態字中的Busy標識 <br>21 sbit LCM_RS = P2^2; //寄存器選擇輸入端 <br>22 sbit LCM_RW = P2^3; //讀寫控制輸入端 <br>23 sbit LCM_E = P2^4; //使能信號輸入端 <br>24 <br>25 void WriteDataLCM(unsigned char WDLCM); <br>26 void WriteCommandLCM(unsigned char WCLCM,BuysC); <br>27 unsigned char ReadDataLCM(void); <br>28 unsigned char ReadStatusLCM(void); <br>29 void LCMInit(void); <br>30 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); <br>31 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); <br>32 void Delay5Ms(void); <br>33 void Delay400Ms(void); <br>34 void AD_initiate(); <br>35 void ADC_Power_On(); <br>36 void get_ad_result(); <br>37 void caiyangP10(); <br>38 <br>39 void main(void) <br>40 { <br>41 Delay400Ms(); //啟動等待,等LCM講入工作狀態 <br>42 LCMInit(); //LCM初始化 <br>43 Delay5Ms(); //延時片刻(可不要) <br>44 AD_initiate(); //初始化 <br>45 ADC_Power_On(); //開AD電源 <br>46 <br>47 DisplayListChar(0, 0, "ADCTest"); <br>48 Delay5Ms(); <br>49 DisplayListChar(0, 1, "GAGA"); <br>50 //ReadDataLCM();//測試用句無意義 <br>51 while(1){ <br>52 &nbsp;&nbsp;&nbsp;&nbsp;caiyangP10(); <br>53 &nbsp;&nbsp;&nbsp;&nbsp;DisplayListChar(0, 1, Vin ); <br>54 &nbsp;&nbsp;&nbsp;&nbsp;Delay400Ms(); <br>55 } <br>56 } <br>57 <br>58 //寫數據 <br>59 void WriteDataLCM(unsigned char WDLCM) <br>60 { <br>61 ReadStatusLCM(); //檢測忙 <br>62 LCM_Data = WDLCM; <br>63 LCM_RS = 1; <br>64 LCM_RW = 0; <br>65 LCM_E = 0; //若晶振速度太高可以在這后加小的延時 <br>66 LCM_E = 0; //延時 <br>67 LCM_E = 1; <br>68 } <br>69 <br>70 //寫指令 <br>71 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測 <br>72 { <br>73 if (BuysC) ReadStatusLCM(); //根據需要檢測忙 <br>74 LCM_Data = WCLCM; <br>75 LCM_RS = 0; <br>76 LCM_RW = 0; <br>77 LCM_E = 0; <br>78 LCM_E = 0; <br>79 LCM_E = 1; <br>80 } <br>81 <br>82 //讀數據 <br>83 unsigned char ReadDataLCM(void) <br>84 { <br>85 LCM_RS = 1; <br>86 LCM_RW = 1; <br>87 LCM_E = 0; <br>88 LCM_E = 0; <br>89 LCM_E = 1; <br>90 return(LCM_Data); <br>91 } <br>92 <br>93 //讀狀態 <br>94 unsigned char ReadStatusLCM(void) <br>95 { <br>96 LCM_Data = 0xFF; <br>97 LCM_RS = 0; <br>98 LCM_RW = 1; <br>99 LCM_E = 0; <br>100 LCM_E = 0; <br>101 LCM_E = 1; <br>102 while (LCM_Data &amp; Busy); //檢測忙信號 <br>103 return(LCM_Data); <br>104 } <br>105 <br>106 void LCMInit(void) //LCM初始化 <br>107 { <br>108 LCM_Data = 0; <br>109 WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號 <br>110 Delay5Ms(); <br>111 WriteCommandLCM(0x38,0); <br>112 Delay5Ms(); <br>113 WriteCommandLCM(0x38,0); <br>114 Delay5Ms(); <br>115 <br>116 WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號 <br>117 WriteCommandLCM(0x08,1); //關閉顯示 <br>118 WriteCommandLCM(0x01,1); //顯示清屏 <br>119 WriteCommandLCM(0x06,1); // 顯示光標移動設置 <br>120 WriteCommandLCM(0x0C,1); // 顯示開及光標設置 <br>121 } <br>122 <br>123 //按指定位置顯示一個字符 <br>124 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) <br>125 { <br>126 Y &amp;= 0x1; <br>127 X &amp;= 0xF; //限制X不能大于15,Y不能大于1 <br>128 if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40; <br>129 X |= 0x80; // 算出指令碼 <br>130 WriteCommandLCM(X, 0); //這里不檢測忙信號,發送地址碼 <br>131 WriteDataLCM(DData); <br>132 } <br>133 <br>134 //按指定位置顯示一串字符 <br>135 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) <br>136 { <br>137 unsigned char ListLength; <br>138 <br>139 ListLength = 0; <br>140 Y &amp;= 0x1; <br>141 X &amp;= 0xF; //限制X不能大于15,Y不能大于1 <br>142 while (DData[ListLength]>0x20) //若到達字串尾則退出 <br>143 { <br>144 if (X <= 0xF) //X坐標應小于0xF <br>145 { <br>146 DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符 <br>147 ListLength++; <br>148 X++; <br>149 } <br>150 } <br>151 } <br>152 <br>153 //5ms延時 <br>154 void Delay5Ms(void) <br>155 { <br>156 unsigned int TempCyc = 5552; <br>157 while(TempCyc--); <br>158 } <br>159 <br>160 //400ms延時 <br>161 void Delay400Ms(void) <br>162 { <br>163 unsigned char TempCycA = 5; <br>164 unsigned int TempCycB; <br>165 while(TempCycA--) <br>166 { <br>167 TempCycB=7269; <br>168 while(TempCycB--); <br>169 }; <br>170 } <br>171 <br>172 /************************AD轉換結束***********************/ <br>173 void AD_initiate() //初始化函數 <br>174 { <br>175 ES=0; <br>176 TMOD=0x21; //定時計數器方式控制寄存器,"自動重裝,16位計數器". <br>177 SCON=0x50; //串行控制寄存器,方便在串口助手那觀察 <br>178 TH1=0xfa; <br>179 TL1=0xfa; <br>180 TR1=1; <br>181 } <br>182 <br>183 void ADC_Power_On() //AD轉換電 <br>184 { <br>185 ADC_CONTR |= 0x80; <br>186 Delay5Ms(); //必要的延時 <br>187 } <br>188 <br>189 void get_ad_result() //取AD結果函數,它是十位AD轉換,每十次平均,最后取低八位作為AD采樣數據 <br>190 { <br>191 uint i,q=0; <br>192 for(i=0;i<10;i++) <br>193 { <br>194 tp=0; <br>195 ADC_RES=0; //高八位數據清零,STC12C5A60S2 AD數據寄存名與STC12C54××系列不同 <br>196 ADC_RESL=0; //低兩位清零 <br>197 ADC_CONTR|=0x08; //啟動AD轉換 <br>198 while(!tp) //判斷AD轉換是否完成 <br>199 { <br>200 tp=0x10; <br>201 tp&amp;=ADC_CONTR; <br>202 } <br>203 ADC_CONTR&amp;=0xe7; <br>204 ad_average_result=ADC_RES; <br>205 q=q+ad_average_result; <br>206 } <br>207 ad_average_result=q/10; <br>208 //ad_average_result=ad_average_result*4*5000/1024; <br>209 } <br>210 /************************AD轉換結束***********************/ <br>211 <br>212 //---------------------電壓采樣程序------------------------- <br>213 <br>214 void caiyangP10() //測電壓 <br>215 { <br>216 P1M0|=0x01; //設P1_0為開漏模式 如: P1_0= #00000000B <br>217 P1M1|=0x01; <br>218 ADC_CONTR=0xe0; //設置P1.0為輸入AD轉換口 <br>219 Delay5Ms(); <br>220 get_ad_result(); //取轉換數據 <br>221 Vin=ad_average_result; <br>222 }
復制代碼

[此貼子已經被作者于2011-1-12 1:11:55編輯過]
回復

使用道具 舉報

ID:27770 發表于 2011-1-12 11:14 | 顯示全部樓層

建議你:

1.先解決 1602 顯示的問題,這個事情與是否 AD 或是其它內容沒有直接聯系.做一個測試程序,讓 1602 先正常顯示 2 行字.(不算難的工作.)

2.上面解決后,把 AD 轉換結果拷貝到 1602 測試程序,看看是否正常.如果原來測試正常,后來不正常,則是 AD 數據可能格式不對,或者數據過大.(AD 數據原始是 HEX 碼,你需要處理后給 1602 .)

3.上面正常后,停止測試.把測試部分顯示移植到你項目去.----這樣不會再出錯了吧?

積木式的工作順序,特別是如果你第一次使用 1602 ,更應該這么做.養成好習慣------其它新東西也是這種做法.

4.提示: 12C5A 的 AD 結果有 2 種選擇,它們組合  2 個數據字節得到 10BIT 數據,檢查一下你的組合是否正確.(弄錯了就會大大超過 10BIT 非正常結果.)

僅供參考!

回復

使用道具 舉報

ID:27772 發表于 2011-1-15 16:51 | 顯示全部樓層
謝謝你,我發現是數據類型錯了,直接寫int的,1602會當做指令處理了,增加了一個switch語句,把原始數據轉換成一位一位的,顯示出來 就ok了,不過發現這款單片機AD轉換線性不夠好,誤差比較大
回復

使用道具 舉報

ID:27770 發表于 2011-1-16 14:29 | 顯示全部樓層

祝賀你的成功!----畢竟,論壇的幫助很有限,主要還是靠你自己的努力!

STC12C5A60S2  ----包括許多牌子的單片機自帶的 AD 效果都不怎么好,如果你希望依靠它作出比較好的效果來,是要付出比較大的努力的!

把你的測量范圍分割為 100 份,甚至 1000 份.每一份單獨測量出來,取16次平均值,作為標準.制定一個表格,然后,把 AD 讀數通過查表去得到實際電壓數據.---表格越多越是精確,越是辛苦!

要不要試一下?

僅供參考!

回復

使用道具 舉報

ID:80407 發表于 2015-6-8 07:22 | 顯示全部樓層
樓主,你好!我的ADC0809的數據輸入口和液晶屏的數據口都用的P0口但是ADC0809加了一個鎖存器,但是還是出現亂碼的情況,請問這樣怎么辦啊?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产福利91精品 | 久久精品二区亚洲w码 | 日本不卡一区 | 国产精品美女久久久久aⅴ国产馆 | 成人精品国产一区二区4080 | 四虎av电影 | 成人免费观看视频 | 国产中文字幕在线 | 在线看免费 | 久久专区 | 国产一区二区中文字幕 | 国产精品区一区二区三区 | 91精品国产乱码久久久久久 | 久久久久久国产精品久久 | 日韩在线一区二区三区 | 人人人人干 | 中文字幕国产视频 | 特黄av| 99精品国产一区二区三区 | 中文字幕高清 | 国产乱码精品一品二品 | 欧美精品成人影院 | av 一区二区三区 | 亚洲精品久久久久中文字幕二区 | 亚洲天堂av在线 | 亚洲精品久 | 日本三级网址 | 超碰在线播 | 免费黄色在线 | 亚洲综合在线播放 | 国产精品精品久久久 | 亚洲啊v在线 | 欧美日韩亚洲国产综合 | 一区二区三区四区在线视频 | 久久久久久高清 | 成人啊啊啊 | 国产视频欧美 | 色综合久久天天综合网 | 国产成人一区二区三区久久久 | 日韩免费一区二区 | 欧美在线一区二区三区四区 |