📄 main.c
字号:
/******************************************************************************
*******************************************************************************
** **
* *
作品名称:交通灯
功 能:交通灯的红绿灯点亮,夜晚的黄闪,红绿灯时间间隔可调,夜晚黄闪时间
可设定。
说 明:采用Atmal公司的 ATmega8 AVR单片机,通过SPI口扫描显示红绿黄灯,时
间显示用UART口扫描显示,
软件中对硬件控制部分的说明,软件流程说明
对本程序中的重要定义进行说明
硬件接口:注明硬件电路中外围电路与可编程器件的连接接口和其它主要硬件连接
设计单位:郑州铁路职业技术学院 实践教学中心 无线电协会
程序设计:庞志军,信息系,网络03A1,#29(另有设计人另起一行注明)
::::::::::::::::
设计时间:2006.03.05----完成时间,完善时间
完 善:完善人姓名专业班级,起-----止时间(另有完善人另起一行注明)
:::::::::::::::::
版 本 号:
* *
** **
*******************************************************************************
******************************************************************************/
//头文件
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <ds1302.h>
#include <avr/pgmspace.h>
#include <avr/delay.h>
//宏定义
#define uchar unsigned char
#define uint unsigned int
#define red_time_rom 0x00//红灯时间存储地址
#define green_time_rom 0x01//绿灯时间存储地址
#define yellow_start_h_rom 0x02//黄闪起始时间(时)存储地址
#define yellow_start_m_rom 0x03//黄闪起始时间(分)存储地址
#define yellow_stop_h_rom 0x04//黄闪终止时间(时)存储地址
#define yellow_stop_m_rom 0x05//黄闪终止时间(分)存储地址
#define key1 PD4
#define key2 PD5
#define key3 PD6
#define key4 PD7
#define jtd_red() jtd_data=0xfffe
#define jtd_yellow() jtd_data=0xffef
#define jtd_green jtd_data=0xfeff
#define set_data() PORTB|=1<<PB1
#define clr_data() PORTB&=~(1<<PB1)
#define set_clk() PORTB|=1<<PB0
#define clr_clk() PORTB&=~(1<<PB0)
//定义工作模式
#define run_mode 1//正常工作
#define T_time 2//调整时钟
#define T_rg 3//调整红绿灯
#define T_yellow 4//调整黄闪时间
#define T_h 1//正常工作
#define T_m 2//调整时钟
#define NULL 10
//全局变量
const uchar led[11] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};
uint jtd_data1,jtd_data2;
uchar jtd_row=0;
uchar color;//交通灯颜色
uchar key_data;//按键值
uchar work_mode;//工作模式变量:四种
uchar work_m=0;//第二级工作模式
uchar led_data_1,led_data_2,led_data_3,led_data_4;
uchar led_wei;
uchar led_wx=0xfe;
uchar t0_quantum;
//函数声名
void transmission_byte(uchar x_byte);
void transmision_jtd(void);
void transmision_red(void);
void transmision_green(void);
void transmision_yellow(void);
void T0_INIT(void);
void spi_init(void);
uchar _key_(void);
void setting_time(void);
void init(void);
void normal_mode(void);
void setting_mode(void);
delay(unsigned int i)
{
for(;i>0;i--);
}
/************************************************
调用方式:IGNAL(SIG_OVERFLOW0)
函数说明:定时器T0中断函数,用以扫描显示
传递参数:无
返 回 值:无
************************************************/
SIGNAL(SIG_OVERFLOW0) //T0定时中断显示
{
PORTC&=0XF8;
setting_mode();
// PORTD=0Xfe;
// transmission_byte(0);
}
/************************************************
调用方式:void T0_INIT(void)
函数说明:初始化定时器T0
传递参数:无
返 回 值:无
************************************************/
void T0_INIT(void) //溢出中断用于秒记时
{
//T/C0 中断例程 7.3728MHz
TCNT0=00;
//TCCR0=_BV(CS01)|_BV(CS00); // 预分频 ck/64 ,计数允许
TCCR0=_BV(CS01); //ck/8
TIMSK=_BV(TOIE0); //T0溢出中断使能
TIFR&=~(1<<TOV0); //清除没有执行的中断
SREG=0X80; //中断EN or use sei();
}
/************************************************
调用方式:主函数
函数说明:
传递参数:无
返 回 值:无
************************************************/
int main(void)
{
PORTC=0XFE;
transmission_byte(0XFF);
init();
T0_INIT();
hour=0x01;
year=0x06,month=0x03,day=0x15,week=0x02;
hour=0x02,minute=0x14,second=0x00;
ds1302_write_time();//写入调整后的时间
while(1)
{
led_data_1=hour>>4;
led_data_2=hour&0x0f;
led_data_3=minute>>4;
led_data_4=minute&0x0f;
ds1302_read_time();
}
}
/************************************************
调用方式:void init(void)
函数说明:
传递参数:无
返 回 值:无
************************************************/
void init(void)
{
//T0_INIT();
// color=0;
led_wei=0;
jtd_row=0;
work_mode=run_mode;
DDRC|=(1<<PC0)|(1<<PC1)|(1<<PC2);
//DDRB|=_BV(PB6);//为595锁存信号
//DDRB|=_BV(PB0);
//DDRB|=_BV(PB1);
DDRB=0XFF;
DDRD=0xFF;//设置PD口高四位为按键输入,高四位设置为数码管位控输出
}
/************************************************
调用方式:void setting_mode(void)
函数说明:
传递参数:无
返 回 值:无
************************************************/
void setting_mode(void)
{
PORTD=0xff;
switch(led_wei)
{
case 0:
transmission_byte(led[led_data_1]);
break;
case 1:
transmission_byte(led[led_data_2]);
break;
case 2:
transmission_byte(led[led_data_3]);
break;
case 3:
transmission_byte(led[led_data_4]);
break;
}
PORTD=led_wx;
led_wx=(led_wx<<1)|0x01;
if(++led_wei>3)
{
led_wei=0;
led_wx=0xfe;
}
}
/************************************************
调用方式:uchar transmission_byte(uchar x_byte)
函数说明:用IO口模拟SPI发送一个字节数据
传递参数:发送数据 uchar x_byte
返 回 值:无
************************************************/
void transmission_byte(uchar x_byte)
{
unsigned char i,j;
for(i=0;i<8;i++)
{
j=x_byte&0x80;
if(j==0x80)
set_data();
else clr_data();
clr_clk();
set_clk();
clr_clk();
x_byte=x_byte<<1;
}
}
/************************************************
调用方式:uchar transmission_byte(uchar x_byte)
函数说明:用IO口模拟SPI发送一个字节数据
传递参数:发送数据 uchar x_byte
返 回 值:无
************************************************/
/*void JTD_red(void)
{
transmission_byte(uchar x_byte);
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -