编写C语言实现单片机程序1.功能描述:通过按键(外部中断)启动/停止单片机通过ADC0809定时检测电压值在数码管显示电压值,并上传到PC端。其中定时1S采用定时器定时。e
时间: 2024-03-14 17:45:12 浏览: 153
通过按键选择ADC0809的某一个通过进行模拟电压转换,电压值通过四位数码管进行显示。同时,将模拟电压转换数值存储在外部RAM中
5星 · 资源好评率100%
好的,这是一个很具体的问题,需要详细说明。首先,需要确定单片机的型号和开发环境,这里假设使用的是STC89C52单片机和Keil C51开发环境。
1. 引脚连接
将ADC0809的引脚连接至单片机的IO口,参考ADC0809的数据手册连接,如下表所示:
| ADC0809引脚 | 单片机IO口 |
| ----------- | ---------- |
| INTR | P3.2 |
| EOC | P3.3 |
| OE | P3.4 |
| START | P3.5 |
| A0~A7 | P0 |
| VCC | VCC |
| GND | GND |
同时,需要将数码管的引脚连接至单片机的IO口,如下表所示:
| 数码管引脚 | 单片机IO口 |
| ----------- | ---------- |
| A | P2.0 |
| B | P2.1 |
| C | P2.2 |
| D | P2.3 |
| E | P2.4 |
| F | P2.5 |
| G | P2.6 |
| DP | P2.7 |
2. 程序实现
实现过程分为三个部分:初始化、中断处理和主函数。
1) 初始化
首先需要对单片机进行初始化,包括IO口初始化、定时器初始化和中断初始化。这里使用定时器0定时1s,中断使用外部中断0触发。
```c
#include<reg52.h>
sbit LED=P1^0; //LED灯
sbit KEY=P3^2; //按键
sbit D0=P2^0; //数码管第一位
sbit D1=P2^1; //数码管第二位
sbit D2=P2^2; //数码管第三位
sbit D3=P2^3; //数码管第四位
sbit D4=P2^4; //数码管第五位
sbit D5=P2^5; //数码管第六位
sbit D6=P2^6; //数码管第七位
sbit D7=P2^7; //数码管小数点
sbit INTR=P3^2; //ADC0809中断
sbit EOC=P3^3; //ADC0809转换结束
sbit OE=P3^4; //ADC0809输出使能
sbit START=P3^5; //ADC0809启动转换
unsigned char code LEDChar[]={ //LED灯显示字符
0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,
0x80,0x90
};
unsigned int voltage; //电压值
//定时器0中断处理函数
void timer0_isr() interrupt 1{
TH0=0x4C; //重置定时器初始值
TL0=0x00;
LED=~LED; //LED灯翻转
}
//ADC0809中断处理函数
void adc_isr() interrupt 0{
while(!EOC); //等待转换结束
OE=0; //输出使能
voltage=((P0&0x3F)<<8)+P1; //读取电压值
EOC=0; //清除EOC标志
INTR=0; //清除中断标志
}
void init(){
TMOD=0x01; //定时器0,模式1
TH0=0x4C; //定时1s
TL0=0x00;
IE=0x83; //开启定时器0中断和外部中断0
IT0=1; //下降沿触发
TR0=1; //启动定时器0
EA=1; //开启总中断
}
```
2) 中断处理
外部中断0触发后,启动ADC0809转换,并等待转换结束,读取电压值后上传到PC端。
```c
//外部中断0中断处理函数
void int0_isr() interrupt 0{
START=1; //启动转换
while(!INTR); //等待中断
OE=1; //输出禁止
//上传电压值到PC端
}
```
3) 主函数
主函数中循环检测按键状态,按下按键后停止转换并显示电压值。
```c
void main(){
init(); //初始化
while(1){
if(KEY==0){ //按键按下
START=0; //停止转换
OE=1; //输出禁止
D7=1; //小数点
D6=1;
D5=1;
D4=1;
D3=1;
D2=1;
D1=1;
D0=LEDChar[voltage/100%10]; //第一位
delay(5);
D7=0;
D6=1;
D5=1;
D4=1;
D3=1;
D2=1;
D1=LEDChar[voltage/10%10]; //第二位
delay(5);
D7=0;
D6=0;
D5=1;
D4=1;
D3=1;
D2=LEDChar[voltage%10]; //第三位
delay(5);
D7=0;
D6=0;
D5=0;
D4=1;
D3=LEDChar[voltage/1000%10]; //第四位
delay(5);
D7=0;
D6=0;
D5=0;
D4=0;
D3=LEDChar[voltage/10000%10]; //第五位
delay(5);
D7=0;
D6=0;
D5=0;
D4=0;
D3=0;
D2=LEDChar[voltage/100000%10]; //第六位
delay(5);
D7=0;
D6=0;
D5=0;
D4=0;
D3=0;
D2=0;
D1=LEDChar[voltage/1000000%10]; //第七位
delay(5);
}
}
}
```
3. 其他说明
此处只是一个简单的示例程序,仅供参考。实际应用中需要根据具体需求进行修改。同时,需要注意单片机和外部电路的连接,以及程序中各个部分的功能和实现方法。
阅读全文