atmega16精准时钟程序

  • 格式:txt
  • 大小:3.02 KB
  • 文档页数:2

/*****************************************************

*****************************************************/

#include

#define HC595_DATA_HIGH PORTC |= (1<<0)
#define HC595_DATA_LOW PORTC &= ~(1<<0)

//输出锁存器控制时钟信号
#define HC595_LCLK_HIGH PORTC |= (1<<1)
#define HC595_LCLK_LOW PORTC &= ~(1<<1)

//移位时钟时钟信号
#define HC595_SCLK_HIGH PORTC |= (1<<2)
#define HC595_SCLK_LOW PORTC &= ~(1<<2)

unsigned char LED[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned int wei=0;

unsigned char time[3]={55,20,20};
unsigned char dis_buff[6];
int time_counter;
unsigned char posit;
bit time_1s_ok;



void DataSendTo74HC595(unsigned char data)
{
unsigned char i = 0;
unsigned char Data_Temp;
Data_Temp = data;
HC595_SCLK_LOW; //时钟信号拉低
for(i=0;i<8;i++)
{
if(Data_Temp & 0x80)
HC595_DATA_HIGH;
else
HC595_DATA_LOW; //传输数据0还是1

HC595_SCLK_HIGH; //时钟信号拉高
HC595_SCLK_LOW; //时钟信号拉低

Data_Temp <<= 1;
}
}

void shumaguan(unsigned char weixuan,unsigned char duanxuan) //数码管点亮函数
{
HC595_SCLK_LOW;
HC595_LCLK_LOW;
DataSendTo74HC595(~(1<DataSendTo74HC595(LED[duanxuan]);
HC595_LCLK_HIGH;
}



void gang(unsigned char weixuan) //时分秒之间的间隔符号点亮函数,一横杠符号
{
HC595_SCLK_LOW;
HC595_LCLK_LOW;
DataSendTo74HC595(~(1<DataSendTo74HC595(1<<6);
HC595_LCLK_HIGH;
}




void display()
{
shumaguan(posit,LED[dis_buff[posit]]); //前6位依次显示时分秒
if(++posit>=6) posit=0;
}



interrupt[TIM0_COMP] void timer0_comp_isr() //比较中断匹配函数
{
display();
if(++time_counter>=125); //计数器满125的时候,就是1s到了
{
time_counter=0;
time_1s_ok=1;
}
}



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



void system_init() //系统初始化函数
{
MCUCSR = 0x80;
MCUCSR = 0x80; //C端口为普通I/O口
DDRC = 0xff;
PORTC = 0x00;
DDRA=0xff;
PORTA=0X00;

TCCR0=0b00001011; //64分频,CTC模式,1/64 MHz
TCNT0=0X00;
OCR0=124; //(124+1)/1000000*64=0.008毫秒
TIMSK=0X02;
posit=0;


}
void main()
{
system_init();
time_to_disbuffer();

#asm("sei") //全局中断使能

while(1)
{
if(time_1s_ok)
{
time_1s_ok=0;
if(++time[0]>=60)
{
time[0]=0;
if(++time[

1]>=60)
{
time[1]=0;
if(++time[2]>=24) time[2]=0;
}
}
time_to_disbuffer();
}
}
}






下载文档原格式

  / 2
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。