{
EX0=0;
ave=sum/0x08; *addata=ave;
}
*adch=0x03; //启动A/D工作 }
void main() {
i=0x00;
adch=0x7fff; addata=0x20; sum=0; EA=1; EX0=1; IT0=1;
*adch=0x03; //启动A/D工作 while(1); }
3.6 根据下图输出连续梯形波,波形如图3所示。设选通地址为FEH。
ALE MCS-51 单 片 机 WR P0 锁 存 器 DAC0832 VREF 译 FEH 码 CS 器 XFER Rfb +5V ILE Iout1 D0~D7 Iout2 WR1 WR2 V 60ms t 答:
梯形波
51单片机与DAC0832的接口
+5V _ -+ Vout A #include
#define DAC0832 XBYTE[0xfe] #define uchar unsigned char uchar flag;
void INI_TIMEOUT(void) \\*定时60ms输出最大电压*\\ {
TMOD=0x01;
TH0=(65536-60000)/256; TL0=(65536-60000)%6; EA=1; ET0=1; TR0=1;
DAC0832=0xff; flag=0x01; }
void int(void) interrupt 1\\*定时中断子程序*\\ {
EA=0; ET0=0; TR0=0; flag=0x00; }
void delay(void) {
uchar j;
for(j=0;j<100;j++) }
void main() {
uchar i; while(1) {
for (i=0; i<0xff ;i=i++) {
DA0832=i; delay(); }
INIT_TIMEOUT(); while(flag==0x01);
for (i=0xff; i>0; i=i--) {
DA0832=i; delay(); } } }
第四章作业
4.1 LED显示器扫描方式有哪两种?简述其工作原理。
答:分为静态扫描和动态扫描。静态扫描:微型计算机一次输出显示模型后,LED能保持显示该结果,直到下次发送新的显示模型为止。动态显示:微型计算机实时的对LED扫描,让显示单元分时工作,只要扫描频率够快,就会感觉所有器件均在显示。
4.2 一个4位LED显示器,试用C语言,编写高位0不显示的处理程序。假设四位数据存放在DPBUF开始的四个单元,低位在前。
答:判断DPBUF开始的单元,从高位向低位判断,最低位不用判断;如果最高位为0,将这位对应的dispdata[j]中置为0x00,让数码管无显示,并继续判断次高位,以此类推。假设显示char DPBUF[4];其中ch0为待显示数据的序号,P1口送位选码,P1.0选中最高位,P1.3选中最低位。则高位不显示0的显示函数如下:
char code dispdata[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; void disp(unsigned char ch0) /*显示函数*/ {
static char ch=0x01; P1=ch;
if((DPBUF[ch0]==0)&&(ch!=0x08)) P1=0x00;
P2= dispdata[DPBUF[ch0]]; ch=ch<<1;
if (ch==0x10) ch=0x01; }
4.3 如图4.1的电路,使用外部中断,编写按键程序,要求完成如下简单功能:
按下按键1,P1.3输出一个负脉冲;按下按键2,P1.4输出高电平;按下按键3,P1.5输出低电平。
+5VP1.0P1.189C51P1.2P1.3P1.4P1.5INT0&图4.1 题4.1图
答:
#include
void int(void) interrupt 0 \\\\中断服务程序 {
if(P1_0==0) {
delay(100); \\\\消抖 if(P1_0==0) {
P1_3=1; \\\\输出负脉冲 delay(500); P1_3=0; delay(500); P1_3=1; } }
if(P1_1==0) {
delay(100); if(P1_1==0) {
P1_4=1; \\\\输出高电平
S1S2S3负脉冲高电平+5V低电平0V