?? adc.c
字號:
#include <AT89X51.H> //51系列單片機定義文件
#include <intrins.h> //調_nop_(),延時函數用
#define ad_con P0 //A/D控制口
#define addata P0 //A/D數據計入讀入口
#define Disdata P1 //顯示數據段碼輸出口
#define uchar unsigned char //無符號字符(8位)
#define uint unsigned int //無符號整數(16位)
uint s=0x00; //通道號初值
uint m=0; //內存單元計數
uint n=0; //顯示通道號初值
sbit ALE=P2^4; //地址鎖存位
sbit START=P2^5; //啟動一次轉換位
sbit OE=P2^6; //0890輸出數據控制位
sbit DISX=Disdata^7; //LED 小數點位
//
//
unsigned char code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/*共陽7段LED段碼表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮"*/
unsigned char code scan_con[4]={0x0e,0x0d,0x0b,0x07};//4位列掃控制字
unsigned char data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//定義8個數據內存單元
unsigned int data dis[5]={0x00,0x00,0x00,0x00,0x00};//定義4個顯示數據單元和一個數據存儲單元
//
//
delay1ms(unsigned int t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
//
/**********顯示單通道掃描子函數**********/
scan(n)
{
uint k,h;
dis[3]=n; //通道號顯示
dis[2]=ad_data[n]/51; //測得值轉換為3個BCD碼,最大值為5.00V
dis[4]=ad_data[n]%51; //余數暫存
dis[4]=dis[4]*10; //計算小數第一位
dis[1]=dis[4]/51;
dis[4]=dis[4]%51;
dis[4]=dis[4]*10; //計算小數第二位
dis[0]=dis[4]/51;
for(h=0;h<250;h++) //每個通道值顯示控制時間(約0.5S)
{
for(k=0;k<4;k++) //4位LED掃描控制
{
Disdata=dis_7[dis[k]];
if(k==2){DISX=0;}
P2=scan_con[k];delay1ms(1);
}
}
}
/**********0809AD轉換子函數**********/
test()
{
ad_con=s;
ALE=1;_nop_();_nop_();ALE=0; //轉換通道地址鎖存
START=1;_nop_();_nop_();START=0; //開始轉換命令
ad_con=0x00; //控制復位
}
/**********ADC中斷函數**********/
void int1()interrupt 2
{
OE=1;ad_data[m]=addata;OE=0;//取A/D值
m++;if(m>=8) m=0;
s++;ad_con=s;
if(s>=8) s=0;//通道地址加1
ALE=1;_nop_();_nop_();ALE=0; //轉換通道地址鎖存
START=1;_nop_();_nop_();START=0; //開始下次轉換命令
}
/**********顯示通道中斷函數**********/
void int0()interrupt 0
{
n++;
}
/**********主函數**********/
main()
{
P0=0xff; //初始端口
P3=0xff;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
test();
while(1)
{
scan(n);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -