#include "reg51.h"
#include "intrins.h"
#include "music.h"
//#define uchar unsigned char
//#define uint unsigned int
sbit ADCRD=P3^7; //定義ADC0804的RD埠
sbit ADCWD=P3^6; //定義ADC0804的WD埠
sbit xuantong=P2^0; //選通ADC0804控制腳
sbit led=P2^1;
sbit INTR=P3^2;
INT8U Data;
INT8U time;
INT8U PWM;
INT8U flag1=0;
INT8U flag2=0;
INT8U flag3=0;
#define Time_init 78
//void delayms(INT8U x)
//{
// INT8U i,j;
// for(i=x;i>0;i--)
// for(j=110;j>0;j--);
//}
void ADC_init()
{
ADCWD=1;
_nop_();
ADCWD=0;//啟動A/D轉換
_nop_();
ADCWD=1;
_nop_();
// delayms(2000);//啟動之后,多留點時間用于AD轉化
// P1=0xff;//讀取數字信號時先把P1口置1
// ADCRD=1;
// _nop_();
// ADCRD=0;// A/D讀使能
// _nop_();
// Data=https://bbs.csdn.net/topics/P1;
}
void Timer0Init()
{
TMOD|=0X20;//選擇為定時器0模式,作業方式0,僅用TR0打開啟動。
//IP=0x10;
//TMOD |= 0x20; // 設定 T1 為波特率發生器
SCON = 0x50; // 0101,0000 8 位資料位, 無奇偶校驗
PCON = 0x00; //PCON=0;
TH1=256-(OSC_FREQ/COMM_BAUD_RATE/32/12);//設定為9600 波特率
TL1=256-(OSC_FREQ/COMM_BAUD_RATE/32/12);
TR1 = 1; //定時器1 打開
REN = 1; //串口1 接收使能
ES = 1; //串口1 中斷使能
TH0=(8192-Time_init)/32;//賦初值定時
TL0=(8192-Time_init)%32;//
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時器
}
void Timer0() interrupt 1
{
TH0=(8192-Time_init)/32; //重新賦值
TL0=(8192-Time_init)%32;
time++;
if(time==100) //
time=0;
else if(time<=PWM)
{
led=1;
}
else
led=0;
}
void Int0Init()//A/D轉化外部中斷
{
IT0=1;
EX0=1;
EA=1;
}
void Int0() interrupt 0
{
if(INTR==0)
{
P1=0xff;//讀取數字信號時先把P1口置1
// ADCRD=1;
// _nop_();
ADCRD=0;// A/D讀使能
_nop_();
Data=https://bbs.csdn.net/topics/P1;
ADCRD=1;
_nop_();
}
ADC_init();
}
void main()
{
//Serial_init() ;//串口暫存器的初始化設定
Delay_Ms(1000) ; //延時,充分初始化
xuantong=0; //選通ADC0804芯片
Timer0Init();
ADC_init();
Int0Init();
while(1)
{
if(Data<50&&Data>=0) //占空比20%
{
if(flag1==0)
{
flag1=1;
flag2=0;
flag3=0;
Play_music(0x0B);
}
PWM=20;
}
else if(Data>=50&&Data<80) //占空比50%
{
// if(flag2==0)
// {
// flag2=1;
// flag1=0;
// flag3=0;
//Play_music(0x0C);
// }
PWM=50;
}
else //占空比90%
{
// if(flag3==0)
// {
// flag3=1;
// flag2=0;
// flag1=0;
//Play_music(0x0D);
// }
PWM=90;
}
// if(time==100) //
// time=0;
// else if(time<=PWM)
// {
// led=1;
// }
// else
// led=0;
}
}
/******************************************************************************
- 實作功能:實作芯片上電分別指定播放第一曲和第二曲,基本的程式供用戶測驗
- 日期 :2013-05-06
- 運行環境:STC 晶振:11.0592M 波特率:9600
- 備注 :在普中科技的51 開發板上除錯OK --- STC89C516RD+
1、該測驗程式必須是模塊或者芯片方案中有設備在線,譬如U 盤、TF 卡、FLASH
******************************************************************************/
#include "REG52.h"
#include "music.h"
//#define COMM_BAUD_RATE 9600 //串口波特率
//#define OSC_FREQ 11059200 //運行晶振:11.05926MHZ
//typedef unsigned char INT8U ;
//typedef unsigned int INT16U ;
//typedef unsigned long INT32U ;
static INT8U Send_buf[10] = {0} ;
void Delay_Ms(INT32U z)
{
INT32U x=0 , y=0;
for(x=110 ; x>0 ;x--)
for(y=z; y>0;y-- );
}
/******************************************************************************
- 功能描述: 串口 1 初始化
- 注: 設定為9600 波特率
******************************************************************************/
//void Serial_init(void)
//{
// //IP=0x10;
// TMOD |= 0x20; // 設定 T1 為波特率發生器
// SCON = 0x50; // 0101,0000 8 位資料位, 無奇偶校驗
// PCON = 0x00; //PCON=0;
// TH1=256-(OSC_FREQ/COMM_BAUD_RATE/32/12);//設定為9600 波特率
// TL1=256-(OSC_FREQ/COMM_BAUD_RATE/32/12);
// TR1 = 1; //定時器1 打開
// REN = 1; //串口1 接收使能
// ES = 1; //串口1 中斷使能
//}
void Uart_PutByte(INT8U ch)
{
SBUF = ch;
// while(!TI);
// TI = 0;
}
/******************************************************************************
- 功能描述: 串口向外發送命令[包括控制和查詢]
- 引數說明: CMD:表示控制指令,請查閱指令表,還包括查詢的相關指令
feedback:是否需要應答[0:不需要應答,1:需要應答]
data:傳送的引數
******************************************************************************/
void SendCmd(INT8U len)
{
INT8U i = 0 ;
Uart_PutByte(0x7E); //起始
for(i=0; i<len; i++)//資料
{
Uart_PutByte(Send_buf[i]) ;
}
Uart_PutByte(0xEF) ;//結束
}
/******************************************************************************
- 功能描述:求和校驗
- 和校驗的思路如下:
發送的指令,去掉起始和結束。將中間的6 個位元組進行累加,最后取反碼。接收端就將
接收到的一幀資料,去掉起始和結束。將中間的資料累加,再加上接收到的校驗位元組。剛好
為0.這樣就代表接收到的資料完全正確。
******************************************************************************/
void DoSum( INT8U *Str, INT8U len)
{
INT16U xorsum = 0;
INT8U i;
for(i=0; i<len; i++)
{
xorsum = xorsum + Str[i];
}
xorsum = 0 -xorsum;
*(Str+i) = (INT8U)(xorsum >>8);
*(Str+i+1) = (INT8U)(xorsum & 0x00ff);
}
void Uart_SendCMD(INT8U CMD ,INT8U feedback , INT16U dat)
{
Send_buf[0] = 0xff; //保留位元組
Send_buf[1] = 0x06; //長度
Send_buf[2] = CMD; //控制指令
Send_buf[3] = feedback;//是否需要反饋
Send_buf[4] = (INT8U)(dat >> 8);//datah
Send_buf[5] = (INT8U)(dat); //datal
DoSum(&Send_buf[0],6); //校驗
SendCmd(8); //發送此幀資料
}
void Play_music(INT16U shou)
{
//Serial_init() ;//串口暫存器的初始化設定
Uart_SendCMD(0x03 , 0 , shou) ;//播放第一首
//Delay_Ms(1000) ;//延時大概6S
// Uart_SendCMD(0x03 , 0 , 0x02) ;//播放第二首
// Delay_Ms(1000) ;//延時大概6S
// Uart_SendCMD(0x03 , 0 , 0x04) ;//播放第四首
// while(1) ;
}
uj5u.com熱心網友回復:
是51定時器不夠用嘛?uj5u.com熱心網友回復:
你的串口中斷怎么沒寫轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/72559.html
標籤:單片機/工控
上一篇:JavaScript(基礎、高級)學習筆記匯總表【尚硅谷最新版JavaScript基礎全套教程完整版(140集實戰教學,JS從入門到精通)】
下一篇:使用海康工業相機的心路歷程(一)
