一直卡在ADC轉換等待那里,屏沒顯示。把ADC_IN();注示掉就可以顯示000.這個中斷程序是抄stc規格書里的.應該不會錯呀。下面是原理圖
a.jpg (40.77 KB, 下載次數: 46)
下載附件
芯片和基準電壓供電
2021-12-26 13:35 上傳
b.png (2.73 KB, 下載次數: 63)
下載附件
氣壓力傳感器
2021-12-26 13:37 上傳
單片機源程序如下:
//ADC基本操作(中斷方式)
#include "ADC.H"
unsigned int AD_Dat;
void ADC_IN()
{
P1M1 = 0x01; P1M0 = 0x00; //設置 P1.0 為 ADC 輸入口
P_SW2|=0X80; //打開特殊功能寄存器
ADCTIM=0X3F; //設置ADC內部時序
P_SW2&=0X7F; //關閉特殊功能寄存器
ADCCFG=0X0F; //設置ADC結果左對齊+ADC時鐘為系統時鐘/2/16
ADC_CONTR=0X80; //使能ADC模塊(ADC電源打開并選擇ADC通道P1.0/ADC0)
EADC=1; //使能ADC中斷 (ADC中斷打開)
EA=1; //總開關打開
ADC_CONTR|=0X40; //啟動AD轉換
while(1);
}
void ADC_ISR()interrupt 5
{
ADC_CONTR&=~0X20; //清中斷標志
AD_Dat=(ADC_RES<<8)|ADC_RESL; //讀取ADC結果
ADC_CONTR|=0X40; //繼續AD轉換
}
上面是.C文件 ,下面是.H文件
#ifndef __ADC_H__
#define __ADC_H__
#include "stc8hxx.h"
sbit a2=P1^1;
sbit a3=P1^7;
void ADC_IN();
extern unsigned int AD_Dat;
#endif
main程序
//頭文件
#include "stc8hxx.h" //包含此頭文件后,里面聲明的寄存器不需要再手動輸入,避免重復定義
#include "delay.h"
#include "display.h"
#include "key.h"
#include "ADC.H"
#define MAIN_Fosc 12000000L //定義主時鐘
/*******************************************************************************
* 文件名: 重定義
* 描 述:
* 功 能:
* 作 者:
* 版本號:1.0.1(2017.05.23)
*******************************************************************************/
//typedef unsigned char u8;
//typedef unsigned int u16;
//typedef unsigned long u32;
/*******************************************************************************
* 文件名:全局變量定義區域
* 描 述:
* 功 能:
* 作 者:
* 版本號:1.0.1(2015.03.03)
*******************************************************************************/
unsigned char wnd=0; //窗口變量,初始為P1 0可以改變默認窗口
unsigned char parm1=0; //窗口P1 對應的變量
unsigned char parm2=0; //窗口P2 對應的變量
unsigned char parm3=0; //窗口P3 對應的變量
unsigned char parm4=0; //窗口P4 對應的變量
/*******************************************************************************
* 文件名:函數前置聲明
* 描 述:
* 功 能:
* 作 者:
* 版本號:1.0.1(2017.05.23)
*******************************************************************************/
void dis_Service(); //顯示的功能函數
void key_Service(); //按鍵的功能函數
/*******************************************************************************
* 文件名:主函數
* 描 述: 完成程序模塊的調用
* 功 能:
* 參 數:無
* 版本號:1.0.1(2017.05.23)
*******************************************************************************/
void main()
{
P0M1 = 0x00; P0M0 = 0x00; //設置為準雙向口
P2M1 = 0x00; P2M0 = 0x00; //設置為準雙向口
P3M1 = 0x00; P3M0 = 0x00; //設置為準雙向口
P5M1 = 0x00; P5M0 = 0x00; //設置為準雙向口
//P1M1 = 0x01; P1M0 = 0x00; //設置 P1.0 為 ADC 輸入口
// led1=0; md1=0; fmq=0;
a2=0; a3=0;
while(1)
{
//開機界面
// unsigned int i;
//
// for(i=0;i<5000;i++)
// {
// Display();
// }
ADC_IN();
dis_Service();
Display();
}
}
void dis_Service()
{
LEDBuf[0]=AD_Dat/100;
LEDBuf[1]=AD_Dat%100/10;
LEDBuf[2]=AD_Dat%10;
LEDBuf[3]=wnd;
}
還有個顯示子程序
#include "display.h"
//共陽數碼管編碼表
unsigned char code leddata[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,0x91};
//共陰數碼管編碼表
//unsigned char code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
// 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
//數據顯示緩沖區
unsigned char LEDBuf[]= {16,13,2,8};
//位選信號
unsigned char code PLACE_CODE[] ={0xfe,0xfd,0xfb,0xf7};
//單位段碼
unsigned char code unit[] ={0xfe,0xfd,0xf7,0xfb};
void Display()
{
unsigned char i;
//1.送段碼
//2.送位選
//3.延時 1ms 全部數碼管顯示時間<10ms
//4.消隱
switch(i)
{
case 0:
duan=leddata[LEDBuf[0]];
wei=PLACE_CODE[0];
DelayXms(1);
duan=0xff;
i++;
break;
case 1:
duan=leddata[LEDBuf[1]];
wei=PLACE_CODE[1];
DelayXms(1);
duan=0xff;
i++;
break;
case 2:
duan=leddata[LEDBuf[2]];
wei=PLACE_CODE[2];
DelayXms(1);
duan=0xff;
i++;
break;
case 3:
duan=unit[LEDBuf[3]];
wei=PLACE_CODE[3];
DelayXms(1);
duan=0xff;
i=0;
break;
default:break;
}
}
|