AVR单片机ATMEGA48的C程序举例(4)

2020-05-03 17:59

}

//如果地址匹配本机或者是广播地址就关闭地址筛选(多机通讯)功能 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 void main(void) {

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 void main(void) {

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 void main(void) {

TCCR0A=0b00100011; //比较匹配时OC0B=0,计数到0时OC0B=1,TOP等于OCR0A的值

TCCR0B=0b00001101; //时钟=1024分频

OCR0A =123; //设定TOP的值,数字变化,PWM的频率和占空比都会发生变化

OCR0B =5; //设定比较比较值,PWM的占空比就会发生变化

DDRD.5=1; //端口方向设置为输出才有效 while (1); } 返回主页


AVR单片机ATMEGA48的C程序举例(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2015届外研版高考英语一轮 必修一Module 5复习题及答案解析

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: