}
//如果地址匹配本机或者是广播地址就关闭地址筛选(多机通讯)功能 if(inbox[0]==address ||inbox[0]==255) UCSR0A&=254;
if(n==amount) //接收到amount个数据以后... {
n=0; //接收计数清0
UCSR0A|=0x01; //重新打开接收器的地址帧筛选功能
if(inbox[amount-1]==w1_dow_crc8(inbox,amount-1)) //如果crc8校验正确就... {
if(inbox[0]==address) //如果地址匹配本机就回复数据
{
send[0]=1; //发件箱地址指向主机
send[amount-1]=w1_dow_crc8(send,amount-1); //产生发件箱的crc8校验码
TXD(send); //发送发件箱的数据包send[] //请在这里备份你的收件箱信息 }
if(inbox[0]==255) //如果是广播地址就... {
//请在这里添加你的代码 //收到广播数据请不要回复 } } } }
//---------------------------------------------------------------------
void main(void) {
USARTinit(); //串口初始化
UCSR0A=0x01; //从机打开地址帧筛选功能(多机通讯模式)
#asm(\打开全局中断 while(1) {
//请在这里添加你的代码
}
} //end
//*********************************************************************************************
//*********************************************************************************************
//波特率9600/9个数据位/1个停止位/奇校验/收发开启/接收中断 void USARTinit(void) {
UCSR0B=0x9C; UCSR0C=0x36; UBRR0L=0x2F;
PORTD.4=0; //MAX485平时工作在接收状态 DDRD.4=1; }
//-----------------------------------------------------------
//从数组datas[]的首地址开始发送amount个数据,其中第0个数据是地址帧,其他是数据帧
void TXD(unsigned char *datas) {
unsigned char i=0;
PORTD.4=1; //使MAX485处于发送状态 while(i
if(i==0) UCSR0B|=1; else UCSR0B&=254; UDR0=*(datas+i); //装载数据开始发送 while((UCSR0A&64)==0); //等待发送结束 UCSR0A|=64; //清除发送结束标志 i++; //发送次数统计 }
PORTD.4=0; //使MAX485处于接收状态 }
//*********************************************************************************************
ATMEGA48中T/C0的相位修正PWM与快速PWM例子
/***************************************************** CodeWizardAVR V1.25.3 Professional http://www.avrdiy.com
相位修正PWM,也可以叫双斜率PWM
*****************************************************/
#include
TCCR0A=0b10000001; //升序比较匹配时OC0A=0,降序时比较匹配时置OC0A=1,TOP固定等于255
TCCR0B=0b00000101; //时钟=1024分频,一旦设定时钟,TCNT0就开始不断的计数
OCR0A =123; //比较设定值,数字越大,PD6输出1的占空比越大 DDRD.6=1; //端口方向设置为输出才有效 while (1); }
/***************************************************** CodeWizardAVR V1.25.3 Professional http://www.avrdiy.com
快速PWM,也可以叫单斜率PWM
*****************************************************/
#include
TCCR0A=0b10000011; //比较匹配时OC0A=0,计数到比较值时OC0A=1,TOP固定等于255
TCCR0B=0b00000101; //时钟=1024分频
OCR0A =123; //比较设定值,数字越大,PD6输出1的占空比越大 DDRD.6=1; //端口方向设置为输出才有效 while (1); }
名词解释:TOP
计数器(TCNT0)由0开始不断的作+1计数,计数到最大值时,计数器又返回到0开始作+1计数(单斜率),如此循环;
计数器(TCNT0)由0开始不断的作+1计数,计数到最大值时就开始作-1计数,计数到0时又开始不断的作+1计数(双斜率),如此循环;
这个最大值就是TOP(TOP可以为固定值255,也可以是OCR0A的值)
由于 TCNT0 是一个计数器,一旦时钟设定,它就会不断的计数(倒数),这样 TCNT0 和 OCR0A(OCR0B) 就会有相等的时候,相等时就是比较匹配。 上面的2个例子中,由于TOP是固定的255,所以要调节PWM频率只能通过调节时钟分频来实现。可以看出来,如果上面的2个例子中TOP相同、时钟相同,那么快速PWM的频率比相位修正PWM的频率高一倍,而占空比的分辩率却刚好相反。 下面的例子是一个“真正的快速PWM”,它除了改变T/C时钟可以改变PWM的频率以外,还可以改变TOP的值(OCR0A)的值来改变PWM的频率,但是它只能是由OC0B输出,不能由OC0A输出,因为这时寄存器OCR0A的值就是TOP的值(计数最高值)。也就是说:如果不使用中断,如果T/C时钟是固定的,那么,OC0A输出快速PWM的频率就无法改变。
/***************************************************** CodeWizardAVR V1.25.3 Professional http://www.avrdiy.com
快速PWM,也可以叫单斜率PWM
*****************************************************/
#include
TCCR0A=0b00100011; //比较匹配时OC0B=0,计数到0时OC0B=1,TOP等于OCR0A的值
TCCR0B=0b00001101; //时钟=1024分频
OCR0A =123; //设定TOP的值,数字变化,PWM的频率和占空比都会发生变化
OCR0B =5; //设定比较比较值,PWM的占空比就会发生变化
DDRD.5=1; //端口方向设置为输出才有效 while (1); } 返回主页