純?cè)瓌?chuàng),此篇只在51黑電子論壇發(fā)過(guò),所以不用擔(dān)心重復(fù)。
內(nèi)容:已知有ADC0809模數(shù)轉(zhuǎn)換器,有一模擬電壓0—5V,電壓高低有電位器控制。 功能:1.使用51單片機(jī)完成設(shè)計(jì)。 2.使用0809上的IN3采集模擬電壓值。 3.將采集到的電壓值用3位數(shù)碼管顯示,整數(shù)位占1位,顯示小數(shù)點(diǎn),小數(shù)占兩位。 4.將0809轉(zhuǎn)換的結(jié)果以區(qū)間的方式用8位LED顯示。 原理圖:
1.png (36.88 KB, 下載次數(shù): 57)
下載附件
2020-4-7 20:09 上傳
代碼如下:
- /**************************************/
- /* 功能:ADC轉(zhuǎn)換與顯示 */
- /* AD芯片:ADC0809 */
- /* 控制器:AT89C52 */
- /* 主時(shí)鐘頻率:12MHz */
- /* 作者:溫爾暖 */
- /* QQ:648232352 */
- /**************************************/
- /******************調(diào)用頭文件*******************/
- #include "reg52.h"
- #include "intrins.h"
- /*****************定義地址**********************/
- sbit KEY = P1^0; //按鍵
- sbit ADD_C = P1^2;
- sbit ADD_B = P1^3;
- sbit ADD_A = P1^4; // 選輸入口
- sbit CLK = P1^5; // 時(shí)鐘
- sbit START = P1^6; // 轉(zhuǎn)換啟動(dòng)信號(hào)
- sbit EOC = P1^7; // 轉(zhuǎn)換結(jié)束信號(hào)
- sbit OE = P1^1; // 輸出允許信號(hào)
- /*****************定義全局變量********************/
- int flag = 0;
-
- /*****************數(shù)碼管段碼**********************/
- unsigned char code DUAN[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //不帶小數(shù)點(diǎn)
- unsigned char code DUAN1[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x80}; //帶小數(shù)點(diǎn)
- /*****************電壓值區(qū)間******************/
- float JS[] = {0,62.5,125,187.5,250,312.5,375,437.5,500};
- /*******************讀ADC*******************/
- void read_adc(void)
- {
- START = 0;
- _nop_();
- START = 1;
- _nop_();
- START = 0;
- while(EOC==0);
- OE=1;
- }
- /*****************AD值區(qū)間計(jì)算*********************/
- int LED_JS(float AD)
- {
- int t0 = 0;
- int i = 0;
- for(; i<8 ;i++)
- {
- if(AD >= JS[i])
- if(AD <= JS[i+1])
- t0 = i;
- }
- return t0+1;
- }
- /*****************不精確延時(shí)**********************/
- void delay_ms(int i)
- {
- int j=0;
- while(i--)
- {
- for(j=0;j<120;j++);
- }
- }
- /*****************數(shù)碼管顯示**********************/
- void display1(unsigned char ADC1_PORT)
- {
- int AD1 = ADC1_PORT * 500.0/255.0;
- P2 = 0xFD; P0 = DUAN1[AD1/100]; delay_ms(5); // 位選:P2^1 個(gè)位
- P2 = 0xFB; P0 = DUAN[(AD1/10)%10]; delay_ms(5); // 位選:P2^2 小數(shù)點(diǎn)后一位
- P2 = 0xF7; P0 = DUAN[AD1%10]; delay_ms(5); // 位選:P2^3 小數(shù)點(diǎn)后兩位
- }
- /*****************LED顯示**********************/
- void display2(unsigned char ADC2_PORT)
- {
- float AD2 = ADC2_PORT * 1.96;
- P2 = 0xFF; // 清屏
- switch(LED_JS(AD2))
- {
- case 1: P0 = 0xff; break;
- case 2: P0 = 0xfe; break;
- case 3: P0 = 0xfc; break;
- case 4: P0 = 0xf8; break;
- case 5: P0 = 0xe0; break;
- case 6: P0 = 0xc0; break;
- case 7: P0 = 0x80; break;
- case 8: P0 = 0x00; break;
- default:P0 = 0xef;
- }
- }
- /*******************初始化*******************/
- void init()
- {
-
- ADD_C=0;
- ADD_B=1;
- ADD_A=1; // 選擇第三通道
-
- CLK=0; //時(shí)鐘
- START=1; // 內(nèi)部寄存器清零
- EOC=1; // 轉(zhuǎn)換結(jié)束
- OE=0; // 使能
-
- TMOD=0x02; // 0000_0010 8位 0~255
- TH0=200;
- TL0=200; // 裝載初值
- EA=1; // 開總中斷
- ET0=1; // 開定時(shí)器中斷
- TR0=1; // 開定時(shí)器
- }
- /****************mAin函數(shù)*******************/
- void main()
- {
- init(); // 初始化
- while(1)
- {
- if(KEY == 0) // 檢測(cè)到按鍵
- {
- delay_ms(5); // 防抖
- if(KEY == 0)
- {
- while(!KEY); // 等松手
- flag ++; // 加1
- flag &= 0x01; // 與0x01相與 保證每次進(jìn)入flag都為0或1
- }
- }
-
- if(flag == 0)
- {
- read_adc();
- display1(P3);
- OE=0;
- }
-
- if(flag == 1)
- {
- read_adc();
- display2(P3);
- OE=0;
- }
- }
- }
- /****************中斷服務(wù)程序*******************/
- void TIM0_Serves() interrupt 1 // 用于產(chǎn)生CLK
- {
- CLK = !CLK;
- }
復(fù)制代碼
2.png (38.65 KB, 下載次數(shù): 40)
下載附件
2020-4-7 20:12 上傳
|