搜索
bottom↓
回复: 3

《AVR单片机嵌入式系统原理与应用实践》AVR Studio编译系统定时、中断代码

[复制链接]

出0入0汤圆

发表于 2011-3-8 13:37:08 | 显示全部楼层 |阅读模式
#include<avr/io.h>
#include<avr/interrupt.h>
unsigned char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char  position[6] ={0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char time[3];
unsigned char dis_buff[6];
unsigned char time_counter;
unsigned char posit;
unsigned int point_on,time_1s_ok;

void display(void)
{
        PORTC =0x00;
        PORTA =led_7[dis_buff[posit]];
        if(point_on && (posit==2||posit==4)) PORTA |=0x80;
        PORTC =position[posit];
        if(++posit>=6) posit = 0;
}
//定时器0初始化中断-比较匹配CTC模式4M/16分频
//ISR (TIMER0_COMP_vect)  
ISR(SIG_OUTPUT_COMPARE0)
{
        TCNT0 =0x00;
        display();
        if(++time_counter>=500)
        {
                time_counter =0;
                time_1s_ok =1;

        }
}

void time_to_disbuffer(void)
{
        char i,j=0;
        for(i=0;i<=2;i++)
        {
                dis_buff[j++] =time%10;
                dis_buff[j++] =time/10;
        }
}

void main(void)
{
        PORTA =0x00;
        DDRA =0xFF;
        PORTC =0xC0;
        DDRC =0x3F;

        time[2]=23;time[1]=58;time[0]=55;
        posit=0;
        time_to_disbuffer();
        //T0初始化
        TCCR0 =0x00;
        TCNT0 =0x00;
        OCR0 =0x7C;
        TIMSK =0x02;
        sei();

        while(1)
        {
                if(time_1s_ok =1)
                {
                        time_1s_ok=0;
                        point_on=~point_on;
                        if(++time[0]>=60)
                        {
                                time[0]=0;
                                if(++time[1]>=60)
                                {
                                        time[1]=0;
                                        if(++time[2]>=24) time[2]=0;
                                }
                        }
                        time_to_disbuffer();
                }
        }
}
此代码是《AVR单片机嵌入式系统原理与应用实践》中8.4节移植过来的

出0入0汤圆

 楼主| 发表于 2011-3-8 13:43:31 | 显示全部楼层
#include <avr/io.h>
#include <avr/delay.h>

unsigned char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char position[6]={0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char time[3];                                        // 时、分、秒计数
unsigned char dis_buff[6];                                // 显示缓冲区,存放要显示的6个字符的段码值
unsigned char time_counter;                                // 1秒计数器
unsigned int point_on;                                        // 秒显示标志

void display(void)                                // 扫描显示函数,执行时间12ms
{
        unsigned char i;
        for(i=0;i<=5;i++)
                {
                        PORTA = led_7[dis_buff];
                        if (point_on && ( i==2 || i==4 )) PORTA |= 0x80;        // (1)
                        PORTC = position;
                _delay_ms(2);                                                                        // (2)
                PORTC = 0x00;                                                                        // (3)
          }
}

void time_to_disbuffer(void)                        // 时间值送显示缓冲区函数
{
                unsigned char i,j=0;
                for (i=0;i<=2;i++)
                {
                        dis_buff[j++] = time % 10;
                            dis_buff[j++] = time / 10;
                }
}

int main(void)
{
PORTA=0x00;                // PORTA初始化
DDRA=0xFF;
PORTC=0xC0;                // PORTC初始化
DDRC=0x3F;

time[2] = 11; time[1] =34; time[0] = 52;        // 时间初值23:58:55
time_to_disbuffer();

while (1)
{
        display();                                                // 显示扫描,执行时间12ms
        if (++time_counter >= 40)
        {
                time_counter = 0;                                // (4)
                point_on = ~point_on;                        // (5)
                if (++time[0] >= 60)
                {
                        time[0] = 0;
                        if (++time[1] >= 60)
                        {
                                time[1] = 0;
                                if (++time[2] >= 24) time[2] = 0;
                        }
                }
                time_to_disbuffer();
        }
_delay_ms(13);                                        // 延时13ms,可进行其它处理(6)
}
}
此代码《AVR单片机嵌入式系统原理与应用实践》中6.5节移植过来的

出0入0汤圆

 楼主| 发表于 2011-3-8 13:47:43 | 显示全部楼层
本人是电子爱好者,AVR单片机是看过马老师的书和mega16资料自学的,之前也没有学过单片机,不对地方请鞭策

出0入0汤圆

 楼主| 发表于 2011-3-8 19:25:41 | 显示全部楼层
回复【楼主位】starlu163 星星
#include&lt;avr/io.h&gt;
#include&lt;avr/interrupt.h&gt;
unsigned char led_7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char  position[6] ={0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char time[3];
unsigned char dis_buff[6];
unsigned char time_counter;
unsigned char posit;
unsigned int point_on,time_1s_ok;
void display(void)
{
portc =0x00;
porta =led_7[dis_buff[posi......
-----------------------------------------------------------------------

//T0初始化
TCCR0 =0x03;    //TCCR0 =0x00; 此处修改
TCNT0 =0x00;
OCR0 =0x7C;
TIMSK =0x02;
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 21:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表