|
ID:686513
发表于 2021-12-26 13:38
|
显示全部楼层
| 阅读模式
一直卡在ADC转换等待那里,屏没显示。把ADC_IN();注示掉就可以显示000.这个中断程序是抄stc规格书里的.应该不会错呀。下面是原理图
芯片和基准电压供电
气压力传感器
单片机源程序如下:
//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;
}
}
|
|