#include "STC8G.h" //6路10位高速ADC(8路PWM可当8路D/A使用) 00 0000 0000
#include "intrins.h"
unsigned int dy;unsigned char tempData[9];/*MCU发送到串行口的数据*/unsigned char shuzi[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};/*数组串行口显示数值用*/
void UartInit() //9600bps@11.0592MHz
{
SCON=0x50;/*8位数据,可变波特率*/AUXR|=0x40;/*定时器时钟1T模式*/AUXR &= 0xFE;/*串口1选择定时器1为波特率发生器*/TMOD&=0x0F;/*设置定时器模式*/
TL1=0xE0;/*设置定时初始值*/TH1=0xFE;/*设置定时初始值*/ET1= 0;/*禁止定时器%d中断*/TR1 = 1;/*定时器1开始计时*/
}
void LED1()
{
P5M1=0;P5M0=0x20;//推挽输出
}
void SendData(unsigned char dat)/* 串口发送字节数据函数 参数是你要发送的字节 */
{
SBUF = dat;/*把要发送的数据给了SBUF寄存器*/while(!TI);/*等待数据发送完成*/TI = 0;/*清除发送完成标志位*/
}
void SendString(unsigned char *puf) //发送一个字符串
{
while(*puf!='\0')/*遇到空格跳出循环*/{SendData(*puf);puf++;}SendData('\r');/*回车*/SendData('\n');/*换行*/
}
void adccx() //?只有8位数据 255
{
ADC_CONTR |= 0x40; //启动AD转换
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20));//查询ADC完成标志
ADC_CONTR &= ~0x20; //清完成标志
//dy = ADC_RES+ADC_RESL; //只读取8位ADC结果
ADC_RESL=ADC_RESL&0XC0; //读取10位的低字节2位
dy = (ADC_RES << 2)|ADC_RESL>>6;//读取10位ADC结果
}
void adczh()
{
adccx();tempData[0]=shuzi[dy/1000]; tempData[1]=shuzi[dy%1000/100];tempData[2]=shuzi[dy%100/10]; tempData[3]=shuzi[dy%10];
SendString(tempData);//由0-9发送串口数值
}
void main()
{
unsigned char x =0; /* 定义一个8位变量 用于接收串口接收的字节 */
P5M0 = 0x00;P5M1 = 0x10; /*设置ADC4(P5.4)为ADC口*/LED1(); /* IO设置*/ UartInit(); // 串口初始化
P_SW2 |= 0x80;ADCTIM = 0x3f;/*设置ADC内部时序*/P_SW2 &= 0x7f;ADCCFG = 0x0f;/*设置ADC时钟为系统时钟/2/16*/ADC_CONTR = 0x80;/*使能ADC模块*/
while (1)
{
adczh();
if (RI)// 如果串口接收到数据
{
RI = 0; //清中断标志
x =SBUF;
SendData(SBUF); // 把接收的数据再发送出去
if (x == 0x02)
{
P55 = !P55; //翻转led状态
}
}
}
}
void Uart() interrupt 4
{
if (RI)/*接收中断标志位*/{RI = 0;/*清除RI位*/}if (TI)/*发送中断标志位*/{TI = 0;/*清除TI位*/}
}
|