标题:
基于c8051f340设计的AD双单片机通信
[打印本页]
作者:
fujiayu
时间:
2018-6-17 10:06
标题:
基于c8051f340设计的AD双单片机通信
附件是c8051f340的代码
QQ图片20180617100529.png
(251.88 KB, 下载次数: 14)
下载附件
2018-6-17 10:05 上传
单片机源程序如下:
/*************************************************************************************
*******************************************************************************************/
#include <c8051f340.h> //头文件
#include <intrins.h>//包含_nop_的头文件
#define uchar unsigned char
#define uint unsigned int
unsigned int delaytime;
unsigned int beeptime;
int second;
sbit BEEP = P3^0;
sbit SEG1 = P3^1;
sbit SEG2 = P3^2;
sbit SEG3 = P3^3;
sbit SEG4 = P3^4;
bit stop=0;
uint speed=10;
uint counter1,counter2;
uint count;
uchar disbuf[7];
uchar disbuf1[6];
uchar number,revnumber;
void display(void );
/*******************************************************************************/
/*******************************************************************************/
void delayMs(uint ms) //延时程序 精确
//
{
delaytime=ms;
while(delaytime>0) ;
}
/*******************************************************************************/
/*******************************************************************************/
void Oscillator_Init()
{
int i = 0; //外部晶振启动
OSCXCN = 0x67;
for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
CLKMUL = 0x80;
for (i = 0; i < 20; i++); // Wait 5us for initialization
CLKMUL |= 0xC1; // 乘法器的输入为外部晶体
while ((CLKMUL & 0x20) == 0); //乘法器启动
CLKSEL = 0x03; //4倍 48M
OSCICN=0; //关闭内部高频振荡器,不用了,省电。
}
/*******************************************************************************/
/*******************************************************************************/
void main()
{
uchar temp;
int ADVAL;
PCA0MD=0X00; //禁止看门狗
XBR1=0X40; //端口连上引脚
P0MDIN&=0X3F; //晶振引脚为模拟输入
P0SKIP|=0XC0; //跳过P0。6,P0。7
Oscillator_Init(); //振荡器初始化
//SYSCLK=48M
P1MDOUT=0XFF; //推挽输出
P2MDOUT=0XFF; //推挽输出
P3MDOUT=0XFF; //推挽输出
XBR0|=0X01; //串口0连到引脚上。P04\Pp05
TMOD=0X21; //T0T1都工作在定时模式.T0工作在16位模式,T1工作在8位自动重载方式?
IE=0X82; //允许T0中断,T1不中断,允许总中断.
TH0=0X44;
TL0=0x80; //初值
CKCON=0X06; //T0: 脉冲源频率为48M。//T1: 脉冲源频率为48M/48=1M。
TH1=256-1000000/2/9600;
TL1=256-1000000/2/9600; //可产生2400、4800、9600、19200、38400、56000、57600、115200共九个波特率。
TCON=0X50; //启动T0、T1
temp=1; //初值
BEEP=0;
SCON0=0x10; //串口方式1, 8 位 UART,允许接收,10位数据
IE|=0X10;
CKCON&=~0X40; //T3使用外部时钟/8=1.5M
TMR3CN= 0x1; //T3开始作
TMR3RLL=(65536-1500)%256; //重载值
TMR3RLH=(65536-1500)/256;
EIE1|=0X80; //允许T3中断
TMR3CN|=0x04; //T3开始作
AMX0P=0x0e; //P45
AMX0N=0x1f; //GND
P4MDIN=0x9f; //P45?P46?????
REF0CN=0x0e; //ADC0用VDD做为基准源, 温度传感器使能,内部模拟偏压发生器使能位 //基准源
ADC0CF=0X78; //ADC???3M,48/16,???
ADC0CN=0X80; //??ADC0
while(1) //死循环,单片机的固有编程模式
{
delayMs(1000);
BEEP=0;
P1= temp;
temp=_crol_(temp,1); //改成0.5秒
if (temp==0x01)
{BEEP=1;
beeptime=100;}
if (AD0BUSY==0) //????????
{
ADVAL= ADC0H*256+ADC0L;
disbuf1[6]=0x0d;
disbuf1[5]=ADVAL%10;
disbuf1[4]=ADVAL/10%10;
disbuf1[3]=ADVAL/100%10;
disbuf1[2]=ADVAL/1000%10;
disbuf1[1]=ADVAL/10000%10;
SBUF0=0xaa;
number=1;
AD0BUSY=1;
}
}
}
/*******************************************************************************/
/*******************************************************************************/
void display(void ) //动态显示程序,每次调用只显示一个数码管
{
static char count=0;
if (++count==6) count=0;
P2=P2&0X03; //使位选全部无效。
SEG1=disbuf[count]&0X01; //非零即1的关系//输出段码第0位
SEG2=disbuf[count]&0X02; //非零即1的关系//输出段码第1位
SEG3=disbuf[count]&0X04; //非零即1的关系//输出段码第2位
SEG4=disbuf[count]&0X08; //非零即1的关系//输出段码第3位
P2=P2&0X03|(0x04<<count); //输出位码。
}
/*******************************************************************************/
void T0_isp(void) interrupt 1 //T0中断,
{
TH0=0X44; //毫秒中断
TL0+=0X80;
}
void T1_isp(void) interrupt 3 //T1中断
{
static u8 key;
static u8 key2;
static u8 keybuf[5];
TH1=0X44;
TL1=0X80;
//毫秒中断
keybuf[0]=keybuf[1]; //àúê·êy?Y
keybuf[1]=keybuf[2];
keybuf[2]=keybuf[3];
keybuf[3]=keybuf[4];
keybuf[4]=P4;
if(keybuf[0]==keybuf[1] &&
keybuf[0]==keybuf[2] &&
keybuf[0]==keybuf[3] &&
keybuf[0]==keybuf[4] ) //?áμ?á??è?¨μ?êy?Yá?
{
key2=key; //àúê·êy?Y
key=keybuf[0]; //μ±?°êy?Y
//调整秒,分,时
if ((key&0x04)==0 && (key2&0x04)==0x04)
count+=1;
if ((key&0x08)==0 && (key2&0x08)==0x08)
count+=60;
if ((key&0x10)==0 && (key2&0x10)==0x10)
count+=3600; //抖动
if ((key&0x80)==0 && (key2&0x80)==0x80) ; //
}
if (delaytime>0)
delaytime--;
if (!(beeptime--))
BEEP=0;
}
//**********************************************************************************
void T3_isp(void) interrupt 14 //T3中断
{
TMR3CN&=~0X80;
if(delaytime>0) delaytime--;
if(!-- beeptime) BEEP=0;
display();
}
//************************************************************************************
void time1_isp(void) interrupt 4 //串行接口0中断,发送接收是一个中断向量,两个中断源
{
static uchar bufrec[10];
static uchar revnumber;
static uchar temporary;
if(TI0==1)
{
TI0=0;
if (number<6)
SBUF0=disbuf1[++number]; //变成ASCII码
}
if(RI0==1)
{
RI0=0;
temporary=SBUF0;
if (temporary==0xaa )
revnumber=0;
else
{
bufrec[revnumber++]=temporary;
if(revnumber==5 && bufrec[4]==0x0d )
{
disbuf[5]=bufrec[3];
disbuf[4]=bufrec[2];
disbuf[3]=bufrec[1];
disbuf[2]=bufrec[0];
}
}
}
}
//************************************************************************************
复制代码
所有资料51hei提供下载:
5 AD双单片机通信.zip
(45.6 KB, 下载次数: 21)
2018-6-17 10:06 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1