#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位*/}
}
|