用C语言编写8051单片机程序

用C语言编写8051单片机程序,第1张

/********************************

/* MCU: AT89S52

/* MCU-crystal: 12M

/* Version: 01

/* Last Updata: 2009-2-21

/* Author:

/* Description:

/* 使用定时器0,定时中断2ms一次对数码管显示扫描;

/* 三个位管要以扫描方式显示,使用共阳管,计数速度为1S;

/* 段A-H接到P0.1....7,位选为 P1.0,1,2;

/* 流水也以计数方式从200到250在P2口显示,低电平有效;

/****************************************************/

#include <reg52.h>

unsigned char code num_disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}//共阳数字字形0到9

unsigned char code bit_sel[]={0xfb,0xfd,0xfe}//低电平有效数字个十百位选择

unsigned char buf[3]={0,0,2}//计算中的个十百位暂时存放处

unsigned char one,ten,second//个十位变量和流水灯显示3秒的时间变量

unsigned char rate//扫描速度,调整以适应显示效果

unsigned char stop=0, flag=1,flag1=0//闪烁3秒的标志位,用于主函数对中断的关断参数传递

unsigned int t,tt//2ms变量

unsigned char rate//与变量t同步,辅助赋值变

/**********主函数**********/

main(void)

{

TMOD=0X01

TH0=0xf8//定时2ms

TL0=0x30

ET0=1

EA=1

TR0=1

while(1)

{ if(stop==1)//判断stop信号,为1后便关闭定时器

{ TR0=0

ET0=0

EA=0

}

}

}

/*******************中断*******************/

void timer0() interrupt 1

{

TH0=0xf8//重新赋值定时2ms

TL0=0x30

if(flag==0)//定义用于判断计数是否到了250,若到了则不再计数,转向else执行流水灯闪烁任务

{

t++

if(t==500)

{ t=0

one++

P2=200+ten*10+one//在P2口的流水等,也是从200开始计数。

if(one==10)

{ one=0

ten++

if(ten==5)

{ flag=1//转向执行闪烁任务

}

}

}

}

else//flag已经==1;转向else执行流水灯闪烁任务

{ tt++

if(tt==500)

{ tt=0

second++

P2=~P2//流水灯全部以1S速度闪烁

if(second==3)stop=1//判断3秒时间到,关闭中断,停止闪烁,数码管熄灭

}

}

rate++

P0=0XFF//消隐

if(rate==3)rate=0

P0=num_disp[buf[rate]]

P1=bit_sel[rate]

buf[0]=one

buf[1]=ten

//因为百位没有变,所以不用赋值

}

以下是一个单片机间隔点亮一LED灯的C语言程序,以8051单片机为例:

c

Copy code

#include

//包含了AT89C51的寄存器定义

void delay(unsigned int xms) //延时函数,xms为要延时的毫秒数

{

unsigned int i,j

for(i=xmsi>0i--)

for(j=112j>0j--)

}

void main()

{

P1=0x00//将P1口全部置为0,防止其它引脚影响

while(1)

{

P1=0xff//点亮P1口第0个引脚上的LED灯,0xff为二进制的11111111

delay(1000)//延时1秒

P1=0x00//将P1口全部置为0,熄灭LED灯

delay(1000)//延时1秒

}

}

上述程序的作用是在单片机的P1口上间隔点亮一盏LED灯,每隔1秒钟灯的状态会发生一次变化,即由点亮状态变为熄灭状态,再由熄灭状态变为点亮状态。

启动ADC0809,ADC0809将开始将外部电压转换成数字,当转换完成时,转换完成信号引脚会输出一个电平(请查看datasheet).这时单片机就可以直接读取数据了.

如果要不停采集,就继续启动采集,再查询ADC0809完成引脚.

ADC0809芯片的采集速度是几百K吧.记不得了,你自己看下.

也可以将ADC0809的完成引脚接到单片机的外部中断引脚上,这样就可以在中断中读取.

代码自己找下吧,网上很多的.

这个给你参考:

#define voldata P2

sbit adra=P0^0

sbit adrb=P0^1

sbit adrc=P0^2

sbit ale=P0^3

sbit st=P0^4

sbit eoc=P0^5

sbit oe=P0^6

unsigned char getvol(unsigned char adr)

{

unsigned char volnumber=0

unsigned int n=1000

oe=0

ale=0

adra=!(!(adr&0x01))

adrb=!(!(adr&0x02))

adrc=!(!(adr&0x04))

ale=1

st=0

st=1

st=0

while(n--)

while(!eoc)

oe=1

volnumber=voldata

oe=0

return(volnumber)

}

只要向函数传递一个0-7的地址(adra、adrb、adrc是地址线);便会返回相对应地址上的0-255的值;再根据相应的基准电压便可以计算出被测电压的值了!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7829642.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-10
下一篇2023-04-10

发表评论

登录后才能评论

评论列表(0条)

    保存