ATmega128几个常用程序例子

合集下载

ATmega128ADC学习笔记

ATmega128ADC学习笔记

ATmega128 ADC学习笔记ATmega128 ADC 的配置非常简单,仅需三条语句即可实现1、配置I/O口的输入2、配置ADMUX寄存器(选择参考电压,输入通道与增益选择)3、配置ADCSRA寄存器(启动AD转换,使能AD转换,选择分频系数)在下面的程序中实现的是差分输入AD转换,PF0为正输入,PF1为负输入,转换的结果在数码管上显示出来,数码管采用74HC595来驱动,各个部分的子程序可以单独放在其他程序中使用程序经过实测,为本人编写,绝对好用#include<iom128v.h>#include<macros.h>#define uchar unsigned char#define uint unsigned int#define Seg7_Bit0_En() {DDRB|=BIT(4);PORTB|=BIT(4);}#define Seg7_Bit0_Dis() {DDRB|=BIT(4);PORTB&=~BIT(4);}#define Seg7_Bit1_En() {DDRB|=BIT(5);PORTB|=BIT(5);}#define Seg7_Bit1_Dis() {DDRB|=BIT(5);PORTB&=~BIT(5);}#define Seg7_Bit2_En() {DDRB|=BIT(6);PORTB|=BIT(6);}#define Seg7_Bit2_Dis() {DDRB|=BIT(6);PORTB&=~BIT(6);}#define Seg7_Bit3_En() {DDRB|=BIT(7);PORTB|=BIT(7);}#define Seg7_Bit3_Dis() {DDRB|=BIT(7);PORTB&=~BIT(7);}#pragma data:codeconst Data[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,4 0x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,9 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};//a,b,c,d,e,f,0x00==关闭数码管uint num;uchar ge,shi,bai,qian;void delay(void){ uint i,j;for(j=0;j<1;j++)for(i=0;i<400;i++);}void spi_init(void){DDRB |= 0x07;//设置MOSI,SCK输出SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI,主机模式}void SPI_MasterTransmit(char Data){/* 启动数据传输 */SPDR = Data;/* 等待传输结束 */while(!(SPSR & (1<<SPIF)));}void HC_595_init(void){DDRB |=0XF0;DDRC |= BIT(7);PORTC &= ~BIT(7);//使能端输出0清空寄存器的数据PORTB |= 0x0F;}void HC_595_OUT(unsigned char data){PORTB &= ~BIT(0); //SPI_MasterTransmit(data);PORTB |= BIT(0); //}void Seg7_Led_Update(void){HC_595_OUT(Data[ge]);Seg7_Bit0_En();delay();Seg7_Bit0_Dis();HC_595_OUT(Data[shi]);Seg7_Bit1_En();delay();Seg7_Bit1_Dis();HC_595_OUT(Data[bai]);Seg7_Bit2_En();delay();Seg7_Bit2_Dis();HC_595_OUT(Data[qian]);Seg7_Bit3_En();delay();Seg7_Bit3_Dis();}void smg_dis(){if(num>9999) //错误处理,超出显示范围则全亮{HC_595_OUT(0xFF);PORTB |= 0X0F;}else if(num>999){qian = num/1000;bai = (num%1000)/100;shi = (num%100)/10;ge = num%10;Seg7_Led_Update();}else if(num>99){qian = 16;bai = (num%1000)/100;shi = (num%100)/10;ge = num%10;Seg7_Led_Update();}else if(num>9){qian = 16;bai = 16;shi = (num%100)/10;ge = num%10;Seg7_Led_Update();}else{qian = 16;bai = 16;shi = 16;ge = num%10;Seg7_Led_Update();}}uint mega128_ad(){uint addata;DDRF &= ~BIT(PF0);PORTA &= ~BIT(PF0);ADMUX = 0X10; // 差分输入,ADC0为正输入 ADC1为负输入 ADCSRA = 0X86; // 启动ADC功能,64分频ADCSRA |= BIT(ADSC); // 开始转换。

mega328的例子程序

mega328的例子程序

mega328的例子程序以下是一个简单的Arduino示例程序,演示了如何使用ATmega328芯片来控制LED灯的闪烁。

该程序使用Arduino IDE编写,并且假定你已经熟悉了Arduino编程环境的基本操作。

c.// 定义LED引脚。

int ledPin = 13;void setup() {。

// 初始化LED引脚为输出。

pinMode(ledPin, OUTPUT);}。

void loop() {。

// 将LED引脚设为高电平,点亮LED.digitalWrite(ledPin, HIGH);// 程序延时1秒。

delay(1000);// 将LED引脚设为低电平,熄灭LED.digitalWrite(ledPin, LOW);// 程序延时1秒。

delay(1000);}。

在这个示例程序中,我们首先定义了一个整型变量`ledPin`,用来存储LED的引脚号。

在`setup()`函数中,我们通过`pinMode()`函数将LED引脚设置为输出模式。

在`loop()`函数中,我们使用`digitalWrite()`函数来控制LED引脚的电平,从而控制LED的亮灭,并通过`delay()`函数来实现延时效果。

这只是一个非常简单的示例程序,演示了如何使用ATmega328芯片来控制外围设备。

实际上,ATmega328芯片具有丰富的功能和强大的性能,可以用于各种嵌入式系统和电子项目中。

通过合理的编程和外围电路设计,ATmega328芯片可以实现复杂的控制和处理任务,包括但不限于传感器数据采集、通信接口、电机控制等。

希望这个简单的示例程序能够帮助你更好地了解如何使用ATmega328芯片进行编程。

如果你有更具体的问题或者需要进一步的帮助,请随时告诉我。

AVR_128_spi串口通信程序

AVR_128_spi串口通信程序

UCSR1B=(1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);//发送接收使能,接收中断使能
UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);//8位数据,UCSZ12,11,10共同确定
DDRD|=BIT(3); //设置发送口为输出
}
/*串口0单字符发送,查询方式*/
{
UCSR1B = 0x00; //禁止发送和接收
UCSR1A = 0x02; //倍速异步模式 USX0=1
UBRR1L=(Crystal/8/Baud1-1)%256; //根据数据手册的计算法
UBRR1H=(Crystal/8/Baud1-1)/256; //如果不是倍速则(Crystal/16/Baud1-1)
Flag1=1;
UCSR1B|=BIT(RXCIE1);//重开接收中断
}
以下是主机部份 #include <iom128v.h> #include <macros.h> #define uchar unsigned char #define uint unsigned int #include "delay.h" #include "lcd.h" void port_init(void); //SPI initialize // clock rate: 1843199hz void spi_init(void) { SPCR = 0x74; //setup SPI
init_devices(); LCD1602_initial(); LCD1602_sendbyte(iDat,1+0x30 ); // while(1) //{ for(i=0;i<2;i++) {

【2019年整理】基于ATmega128的步进电机控制

【2019年整理】基于ATmega128的步进电机控制

基于ATmega128的步进电机控制----基于proteus仿真设计潜刘方摘要:本文以ATmega12驴片机作为系统的CPU来控制步进电动机。

步进电动机具有性能稳定,广泛应用于实际生活中。

由于做实物不仅要耗费金钱,还要耗费大量的时间用来做板子,焊接元器件。

本系统采用了Proteus仿真,只需要画画电路图就可以做出类似实物的效果。

通过测试,本系统可以实现电机启动、停止、加速、减速、正转、反转等控制。

对于广大初学者售企业来说具有很大的学习价值。

关键字:ATmega128 步进电机Proteus 控制稳定一、背景随着生产过程机械化、电气化和自动化的不断发展,出现了步进电机。

这种电机的工作原理与普通的异步电机和直流电机基本相似,但它们在性能、结构、生产工艺有其特殊性。

随着集成化的发展,AVFO其低功耗,高运算速度在单片机的领域中占有重要位置,ATmegeS列AVF^片机主要有ATmega 8/16/32/64128/128L 等。

二、设计方案:本系统由ATmega128乍为CPl^控制步进电机,LED作为案件按下作为显示,来显示有关方面的显示信息。

其总体设计框图如图1所示:°LED显示Atmega128按键输入Q步进电机控制图1总体框架图二、硬件设计:1、步进电机工作原理步进电机不同丁一般的电动机,它是一步一步转动的。

每输入一个脉冲信号,步进电机就转过一定的角度,因此它是一种把脉冲变成角度位移的执行元件。

驱动芯片:ULN2003是高耐压、大电流达林顿阵列,由7个硅PNP达林顿管组成。

ULN200刎电流可达500mA 并且能够在关态时承受50V 的电压,输出 还可以在高负载电流并行运行。

2、总体硬件电路设计总体硬件电路图如图2所示。

图2总体硬件电路图三、软件设计:步进电机控制关键在丁励磁序歹0的定义, 表1给出了四相步进电机的3种励 磁方式。

表1四相步进电机的三种励磁方式按键检测以及处理程序如图3所示下:图3按键流程图步进电机运行流程图如图4所示.图4电机运行流程图主程序流程图如图5所小图5主程序流程图五、总结以心得体会:通过本次系统的制作及仿真,对步进电机的运行原理有了更深的感触,为以后运用电机打下了坚实的基础。

atmega128实用双串口通讯

atmega128实用双串口通讯

}
tx_data[21] =data;
led_2_0();
//----------------数据校验、处理部分
if( (tx_data[0]==0xfe) && (tx_data[21]==0x16) )

//--------------------------略 }
} //--------uart 1----RX-----中断方式- 同上---------------------ISR(USART1_RX_vect) {
unsigned char status,data; status=UCSR1A; data=UDR1; unsigned char f; //----status &= ~(FRAMING_ERROR1 | PARITY_ERROR1 | DATA_OVERRUN1); //----f=data;
//---------------------------------------------
#define
led_1_1() (PORTE |= bit(3))//--1
#define #define #define #define #define #define #define #define #define
Atmega128 实用串口通讯程序
1、 双串口异步通讯, USART0——发送使能,接收使能 、2400bps/8 位/偶校验/1 停止位
USART1——发送使能、9600bps/8 位/无校验/1 停止位
2、 外围 5 个 LED 指示 共阳极, PE3~PE7
#include <avr/io.h> #include <util/delay.h> #include <stdio.h> #include <avr/interrupt.h> #include <avr/wdt.h>

AVR ATmega128全功能工业控制器设计文档说明书

AVR ATmega128全功能工业控制器设计文档说明书

AVR单片机的全功能工业控制器设计吴焕琅深圳市中天越华自动控制科技有限公司摘要:介绍一款工业级的实用全功能控制器。

该控制器能隔离采集多种输入信号,输出多种控制信号;具有实时时钟、历史数据存储功能,彩色液晶显示界面,带有触摸屏操作和远程通信接口。

核心部分CPU采用AVR ATmega128单片机。

目前已用于批量生产。

关键词:隔离采集控制单片机彩色显示485接口ATmega128DS1642引言在自动控制产品的设计过程中,实现方案的选择常常是很矛盾的。

使用可编程逻辑控制器(PLC)和人机界面(HMI)来实现,开发速度较快,但成本太高,所开发的产品没有市场竞争力;使用单片机开发,成本低但开发周期长、开发量大且通用性不好。

用户需要的是一种成本低、开发周期较短、通用性较好的控制器,因此全功能工业控制器有很大的应用市场。

全功能工业控制器的整个电路分为信号隔离输入部分、控制器输出部分、实时时钟与历史数据存储部分、彩色液晶显示和触摸屏控制部分、通信接口等。

1信号隔离输入电路信号隔离输入电路分为开关量隔离输入、模拟量隔离输入、高速电脉冲隔离输入,电路如图1所示,开关量的隔离输入较为简单,输入信号采用光耦进行隔离后送入单片的普通I/O,单片机用查询方式进行采集。

图1信号隔离输入电路高速电脉冲的采集需要注意的是,所设计的电路必须适应高速信号采集的要求,因此隔离光耦应采用高速光耦(如6N137等)。

采用查询方式采集高速脉冲容易造成采集数据的丢失,高速脉冲应采用中断方式进行采集。

模拟量隔离采集是本控制器的一个重点和难点,笔者之前采用了线性光耦等多种方式进行模拟量的隔离采集实验,均未获满意的效果。

这里采用一种先将模拟量数字化(使用AD7705),然后通过有光耦隔离的数据口送到CPU进行模拟量隔离采集的方式,效果理想。

2控制器输出电路控制器的输出方式有继电器输出、晶体管输出、模拟电压输出,如图2所示。

继电器输出和晶体管输出电路较为简单,这里不作详细的介绍。

Almel ATmega128 ATmega128L 可编程 Flash 说明书

Almel ATmega128 ATmega128L 可编程 Flash 说明书

产品特点•高性能、低功耗的 AVR® 8位微处理器•先进的 RISC 结构–133条指令 – 大多数可以在一个时钟周期内完成–32 x 8 通用工作寄存器 + 外设控制寄存器–全静态工作–工作于16 MHz时性能高达16 MIPS–只需两个时钟周期的硬件乘法器•非易失性的程序和数据存储器–128K 字节的系统内可编程Flash寿命: 10,000次写/擦除周期–具有独立锁定位、可选择的启动代码区通过片内的启动程序实现系统内编程真正的读-修改-写操作–4K字节的EEPROM寿命: 100,000次写/擦除周期–4K 字节的内部SRAM–多达64K字节的优化的外部存储器空间–可以对锁定位进行编程以实现软件加密–可以通过SPI实现系统内编程•JTAG接口(与IEEE 1149.1标准兼容)–遵循JTAG标准的边界扫描功能–支持扩展的片内调试–通过JTAG接口实现对Flash, EEPROM, 熔丝位和锁定位的编程•外设特点–两个具有独立的预分频器和比较器功能的8位定时器/计数器–两个具有预分频器、比较功能和捕捉功能的16位定时器/计数器–具有独立预分频器的实时时钟计数器–两路8位PWM–6路分辨率可编程(2到16位)的PWM–输出比较调制器–8路10位ADC8个单端通道7个差分通道2个具有可编程增益(1x, 10x, 或200x)的差分通道–面向字节的两线接口–两个可编程的串行USART–可工作于主机/从机模式的SPI串行接口–具有独立片内振荡器的可编程看门狗定时器–片内模拟比较器•特殊的处理器特点–上电复位以及可编程的掉电检测–片内经过标定的RC振荡器–片内/片外中断源–6种睡眠模式: 空闲模式、ADC噪声抑制模式、省电模式、掉电模式、Standby模式以及扩展的Standby模式–可以通过软件进行选择的时钟频率–通过熔丝位可以选择ATmega103兼容模式–全局上拉禁止功能•I/O和封装–53个可编程I/O口线–64引脚TQFP与 64引脚 MLF封装•工作电压–2.7 - 5.5V ATmega128L–4.5 - 5.5V ATmega128•速度等级–0 - 8 MHz ATmega128L–0 - 16 MHz ATmega128微处理器,具有128K字节的系统BDTIC /ATMEL2ATmega1282467L–AVR–05/04引脚配置Figure 1. ATmega128的引脚综述ATmega128为基于AVR RISC 结构的8位低功耗CMOS 微处理器。

Atmega128AD转换程序

Atmega128AD转换程序

}
/*******************************************************/
/****** 函数名称: SPI_putchar()
******/
/****** 功 能: SPI 发送数据
**/
/****** 参 数: 无
******/
/****** 返回值 : 无
SPI_putchar((unsigned char)((i&0x003f)<<2));
Set_CS5615;
//释放 TLC5615
delay_nms(2);
//延时
}
for(i=1023;i>0;i--)
//电压逐渐变低
{
Clr_CS5615;
//片选 TLC5615
SPI_putchar((unsigned char)((i&0x03c0)>>6));//发送数据
**/
/****** 参 数: 无
******/
/****** 返回值 : 无
******/
/*******************************************************/
void SPI_Init(void)
{
char i;
DDRB|=0x07;
//MISO(PB3)输入 MOSI(PB2),SCK(PB1),SS(PB0)输出
void main(void)
{
unsigned int i;
DDRG=0x1f;
//设置 PORTG 输出
SPI_Init();
while(1)
{
for(i=0;i<1024;i++)

atmega128单片机pwm学习总结

atmega128单片机pwm学习总结

ATMEGA128 PWM输出系列例程1、定时器0,快速PWM模式快速PWM可以的到比较高频率的PWM输出,但占空比的调节精度稍微差一些。

此时计数器仅工作在单程正向计数方式,计数器的上限值决定PWM的频率,而比较匹配寄存器的值决定了占空比的大小。

PWM 频率的计算公式为:))PWM频率= 系统时钟频率/(分频系数*(1+计数器上限值计数器上限值))快速PWM模式适合要求输出PWM频率较高,但频率固定,占空比调节精度要求不高的应用。

/*定时器0,快速PWM模式,由OC0输出PWM波 *//*PWM频率= 系统时钟频率/(分频系数*(1+计数器上限值))*//*本程序中:频率=8000000/(8*(1+255))=3.91KHZ,频率固定 *//*占空比为:OCR0/0XFF=OCR0/256,占空比可调 *//*TCNT0从BOTTOM计数到MAX,然后回到BOTTOM重新开始;TCNT0计数到与OCR0相等时,OC0清零,在BOTTOM时置位1 */#include <iom128v.h>#include<macros.h>#define uint unsigned int#define uchar unsigned charvolatile uchar num;void pwm0_init(void){DDRB=0X10; //将PB4设置为输出TCCR0=0X00; //关闭num=64; //设置输出比较寄存器的初值TCNT0=0; //计数器初值为0TCCR0=0X6A; //设置为快速pwm模式,采取8分频}/*键盘初始化*/void init_key(){DDRD=0X00;PORTD=0XFF;}/*延时函数 */void delay_ms(uint z){uint x,y;for(x=z;x>0;x--)for(y=1140;y>0;y--);}/*键盘扫描 */void keyscan(void ){if((PIND&0x01)==0){while(!(PIND&0x01)); //松手检测delay_ms(50);num+=5;if(num==255)num=0;}if((PIND&0x02)==0){while(!(PIND&0x02));delay_ms(50);num-=5;if(num==0)num=255;}if((PIND&0x08)==0){while(!(PIND&0x01));delay_ms(50);num=128;}}void main(void){uchar wide;pwm0_init();init_key();while(1){OCR0=num;keyscan();}}相位修正((调整调整))模式2、定时器0,相位修正频率(相位)调整PWM模式的占空比调节精度高,但输出频率比较低,因为此时计数器仅工作在双向计数方式。

ATmega128 ATmega128L 介绍

ATmega128 ATmega128L 介绍
ATmega128 具有一整套的编程和系统开发工具 C编译器 宏汇编器 调试/模拟器 JTAG ICE 在线仿真器和SL-MEGA128评估板 二 ATmega103 和 ATmega128 的兼容性
ATmega128 是一种很复杂的微控制器 它的 I/O 地址取代了保留在AVR指令集中的 64 个 I/O地 址 为确保向后兼容 ATmega103 ATmega103上所有I/O的位置与ATmega128上的相同 很多附加的 I/O 地址被加到一个从$60到$FF的扩展外部I/O空间中(例如 在ATmega103 的内部 RAM 空间中) 这些地址只能用 LD/LDS/LDD 和 ST/STS/STD 指令访问 而不能用 IN 和 OUT 指令 内部 RAM 空 间的重定位对于ATmega103用户来说可能仍是一个问题 同样 如果代码使用绝对地址那么增加的中 断向量也是一个问题 要解决这些问题 可以通过编程一个熔丝M103C来选择 ATmega103 兼容模式 在这一模式下 不能使用扩展I/O空间中的程序 所以内部 RAM象ATmega103一样定位 同时 扩展 中断向量被去除 ATmega128 百分之百与 ATmega103引脚兼容 在PCB上可以替代ATmega103 应用笔记 “用ATmega128 替换 ATmega103” 中说明了用户在用ATmega128 替换 ATmega103时应 注意的事项 三 ATmega103 兼容模式
– 53个可编程的I/O 脚
– 64脚TQFP封装 (7) 工作电压
– 2.7 - 5.5V ATmega128L
– 4.5 - 5.5V ATmega128 (8) 速度等级
– 0 - 8 MHz ATmega128L
– 0 - 16 MHz ATmega128

ATmega128几个常用程序例子要点

ATmega128几个常用程序例子要点

ATMEGA128相关例程自己学avr单片机已经有相当一段时间了,一开始用的是atmega128,觉得不是很好用。

于是自己去买了一块16L的芯片,觉得还行。

一开始用的是ICC AVR,应为它用起来比较简单,不像winavr那样,要写个Makefie,比较的麻烦,但icc avr的缺点是太过于简陋,调试程序时,感觉不是很好。

后来经同学介绍,用起了winavr,其实也是比较的简单,只不过要加一个makefile而已,其实makefile可以用软件自带的组建自动生成,只需修改几个参数就可以用。

后来又用起了code vision avr,虽然不太习惯,也谈不上不好用.需要注意的是,三个不同的软件所带的同文件不一样。

icc avr 是iom128v.h(姑且以128为例),winavr 是avr/io.h,不过makefile中要设置芯片为atmega128.而cvavr则是mega128.h。

记得一开始的时候,我对这些不同的同文件不是很理解,是从一个学长那里了解到,才弄明白的。

其实前两个软件只需把头文件稍微改一下基本上可以通用。

而最后一个软件的中断的写法似乎不太一样,因而和钱两个软件的兼容性是最差的。

总体说winavr给人的感觉是比较专业自己学习时多总结吧!1、流水灯/*硬件环境:atmega128开发板软件环境:CodeVisionAVR-C*/#include <mega128.h>#define uchar unsigned char#define uint unsigned intuchar cnt;void timer1_init(){TCCR1B=0X00; //先停止定时器1TCNT1H=0XF0; //设定定时器初值TCNT1L=0XBE;TCCR1A=0X00; //启动定时器1TCCR1B=0X05; //使用1024分频}interrupt [TIM1_OVF] void timer1_ovf_isr(void){TCNT1H=0XF0; //重载定时器初值TCNT1L=0XBE;DDRE|=1<<2;PORTE|=1<<2;DDRA=0xff;PORTA=cnt; //输出led的值到端口Bcnt++;if(cnt==255)cnt=0;}void main(){//DDRB=0XFF;SREG|=0X80;TIMSK=0X04;timer1_init();while(1){;}}2、AD转换+数码管显示/*********************************************************************** ****//*ADC测试程序*//*目标器件:ATmega128 *//*晶振:RC 8MHZ *//*编译环境:ICCAVR 7.13A *//*E-Mail:number007cool@ *//*时间:2010年11月13日*///Aref接AVCC(+5V),采用Aref作参考电压/*用数码管显示AD转换的结果*//*********************************************************************** ****//*********************************包含头文件********************************/#include <iom128v.h>#include <macros.h>/********************************数码管段码表*******************************/extern const unsigned char tab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*********************************全局变量**********************************/unsigned int adc_rel=0;/*********************************************************************** *****函数功能:ADC初始化函数入口参数:出口参数:************************************************************************ ****/void adc_init(void){DDRF&=0XFE; //PORTF0设置为输入,即作为ADC0口输入模拟电压PORTF&=0XFE; //PORTF0设置为输入低电平ADCSRA=0x00; //关ADCADMUX = 0X00; //采用Aref作为参考电压,ADC0单端输入,右对齐ACSR=(1<<ACD);ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1); //ADEN,启动ADC;ADSC,ADC开始转换;ADIE,ADC中断使能;ADPSx,设置分频因子64}/*********************************************************************** *****函数功能:ADC中断函数入口参数:出口参数:************************************************************************ ****/#pragma interrupt_handler adc_isr:iv_ADCvoid adc_isr(void){//int data_h,data_l;//data_l=ADCL;//data_h=ADCH;ADCSRA = 0x00;ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE);adc_rel=ADC;/*if(adc_rel>0x1ff){PORTA|=1<<2;}elsePORTA&=~(1<<2);*/}/*********************************************************************** *****函数功能:延时子程序入口参数:出口参数:************************************************************************ ****/void delay(void){int i;for(i=0;i<1800;i++);}/*********************************************************************** *****函数功能:显示子程序入口参数:k出口参数:************************************************************************ ****/void display(unsigned int k)//发光二极管显示初始化{DDRE|=1<<2;PORTE|=1<<2;DDRA=0XFF;PORTA=k;}#define SS 0#define SCK 1#define MOSI 2#define MISO 3#define SS_H() PORTB|=(1<<SS)#define SS_L() PORTB&=~(1<<SS)#define led0_en() {DDRB|=1<<4;PORTB|=(1<<4);} //开第一个数码管的位选#define led0_dis() {DDRB|=1<<4;PORTB&=~(1<<4);} //关第一个数码管的位选#define led1_en() {DDRB|=1<<5;PORTB|=(1<<5);}#define led1_dis() {DDRB|=1<<5;PORTB&=~(1<<5);}#define led2_en() {DDRB|=1<<6;PORTB|=(1<<6);}#define led2_dis() {DDRB|=1<<6;PORTB&=~(1<<6);}#define led3_en() {DDRB|=1<<7;PORTB|=(1<<7);}#define led3_dis() {DDRB|=1<<7;PORTB&=~(1<<7);}#define OE 7#define point 3#define dp 7#include <iom128v.h>#include <macros.h>const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,40x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,9 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; //a,b,c,d,e,f volatile unsigned char led_buffer[4];void delay_1us(void) //1us延时函数{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}/*完成spi的初始化*/void spi_init(void){DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS);//设置MOSI,SCK输出SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI,主机模式}/*spi主机传送数据*/void SPI_MasterTransmit(char Data){/* 启动数据传输*/SPDR = Data;/* 等待传输结束*/while(!(SPSR & (1<<SPIF)));}/*完成对HC595的初始化*/void HC_595_init(void){DDRC |= (1<<OE); //设置PORTC7为输出PORTC &= (1<<OE); //输出高电平,使能595 PORTB = 0x0F; //同时打开四个数码管的位选 spi_init();led_buffer[0]=16; //初始化数码管段码led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=16;}/*HC595完成传送数据*/void HC_595_OUT(unsigned char data){SS_L();SPI_MasterTransmit(data);SS_H();}void leddis_update(void){/*最低位数码管,第四个数码管*/if(point==0)HC_595_OUT(table[led_buffer[3]]|(1<<dp)); elseHC_595_OUT(table[led_buffer[3]]);led0_en();delay_nus(60);led0_dis();if(point==1)HC_595_OUT(table[led_buffer[2]]|(1<<dp)); elseHC_595_OUT(table[led_buffer[2]]);led1_en();delay_nus(60);led1_dis();if(point==2)HC_595_OUT(table[led_buffer[1]]|(1<<dp)); elseHC_595_OUT(table[led_buffer[1]]);led2_en();delay_nus(60);led2_dis();/*最高位数码管,第一个数码管*/if(point==3)HC_595_OUT(table[led_buffer[0]]|(1<<dp));elseHC_595_OUT(table[led_buffer[0]]);led3_en();delay_nus(60);led3_dis();}void display_led(unsigned int data){if(data>9999){HC_595_OUT(0xFF);//当计数大于9999时,四个数码管同时输出8 PORTB|=((1<<4)|(1<<5)|(1<<6)|(1<<7));}else if(data>999){led_buffer[0]=data/1000;led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>99){led_buffer[0]=data/1000; //关闭最高位的那个数码管led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>9){led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else{led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=data%10;leddis_update();}}volatile unsigned int countnum=0;void timer1_init(void){TCCR1B = 0x00; //stopTCNT1H = 0x8F; //setupTCNT1L = 0x81;OCR1AH = 0x70;OCR1AL = 0x7F;OCR1BH = 0x70;OCR1BL = 0x7F;OCR1CH = 0x70;OCR1CL = 0x7F;ICR1H = 0x70;ICR1L = 0x7F;TCCR1A = 0x00;TCCR1B = 0x04; //start Timer}#pragma interrupt_handler timer1_ovf_isr:15 void timer1_ovf_isr(void){TCNT1H = 0x8F; //reload counter high value TCNT1L = 0x81; //reload counter low value countnum++;if(countnum>9999) countnum=0;}void init_devices(void){CLI(); //disable all interruptstimer1_init();TIMSK = 0x04; //timer interrupt sourcesSEI(); //re-enable interrupts}/*********************************************************************** *****函数功能:主程序入口参数:出口参数:************************************************************************ ****/void main(void){init_devices();HC_595_init();adc_init();SEI();//开全局中断变量display(0);while(1){delay();display_led(adc_rel/1024.0*5*1000);}}3、对EEPROM进行读写操作/************************************************文件:main.c用途:注意:内部8M晶振************************************************/#include "config.h"/*向EEPROM里面写入数据输入量:地址,数据*/void EEPROM_write(unsigned int uiAddress,unsigned char ucData){while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //地址EEDR = ucData; //数据EECR |=(1<<EEMWE); //置位EEMWE,主机写使能EECR |=(1<<EEWE); //置位EEWE,写使能,启动写操作}/*从EEPROM指定的地址里面读出相应的数据*/unsigned char EEPROM_read(unsigned int uiAddress){while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //设置地址寄存器EECR |=(1<<EERE); //读使能return EEDR; //返回读入EEDR里面的数据}void main(void){unsigned char temp=123;unsigned char data;HC_595_init();EEPROM_write(0x01,temp);data=EEPROM_read(0x01);while(1){Seg7_Led_display(data); //调用显示函数将写入的数据又读出来}}文件: eeprom12.rar大小: 40KB下载: 下载4、定时器0(轮循方式)/*定时器0和2(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。

atMega128的bootloader例程

atMega128的bootloader例程
//读取校验
char CheckFlash(void)
{
unsigned int i;
unsigned int TempInt;
unsigned int TempInt2;
for (i=0;i<ageByte;i+=2)
{
TempInt = read_program_memory(PageAddress + i,0x00);
//大于64K控制
if (PageAddressHigh) RAMPZ = 1;
else RAMPZ = 0;
}
/*****************************************************************************/
char GetPage(void)
TxChar(BootSize);
TxChar(BootVer);
break;
case 'L': //写配置信息
break;
case 'R': //读配置信息
break;
case 'I': //读信息
break;
default :
break;
}
//
void FlashLoad(void)
{
TxChar('O')
TxChar('K'); //发送OK
while (1)
{
GetPageNumber();
if (RealPageAddress == 0xffff) return;

EASY AVR ATmega128课程设计课题具体要求

EASY AVR ATmega128课程设计课题具体要求

一、动态显示类交通灯的控制:基本要求:1、用4个7段数码管或LCD液晶显示东西及南北两个方向的通行及等待时间。

2、用两组各3个发光二极管模拟两个方向的红、黄、绿交通灯的显示。

3、要求对东西、南北直行方向的交通灯进行控制,在通行方向的最后5秒这样处理:绿灯闪烁3秒后灭,最后2秒黄灯亮。

禁行方向则直接由红灯变为绿灯。

扩展要求:1、用定时器而不是普通的延时程序控制显示时间2、可通过按键强行控制东西或南北向的通行。

3、夜间模式按钮按下,所有方向显示黄灯闪烁。

4、用按键控制十字路口两个方向不同的通行及等待的时长以适应一天中不同的路况显示格式:由具体课题决定,如是使用LCD12864,能使用汉字的请一律显示汉字。

7段数码管及发光二极管动态显示设计基本要求:1、完成数码管的显示,显示值自定。

2、完成8个发光二极管的显示。

3、通过按键选择数码管显示或发光二极管显示,以及不同的显示格式,显示格式包括:静止显示、整体闪烁、单字闪烁、不同位置的多字闪烁、向左、向右的单字及多字的单向移动显示、由两边向中间及由中间向两边的单字及多字的双向移动显示。

4、显示还包括实现启动、停止、计数、清零及倒计时功能扩展要求:1、数码管或LCD液晶显示的值通过串口(使用串口调试助手)从电脑下载。

2、使用定时器控制闪烁频率及滚动速度,闪烁频率及滚动速度均可变。

3、设计所有动作的联合效果LCD动态显示设计基本要求:1、通过按键选择不同的显示格式,显示格式包括:静止显示、整体闪烁、单字闪烁、不同位置的多字闪烁、向左、向右的单字及多字的单向移动显示、由两边向中间及由中间向两边的单字及多字的双向移动显示。

2、显示还包括实现启动、停止、计数、清零及倒计时功能扩展要求:1、LCD液晶显示的值通过串口(使用串口调试助手)从电脑下载。

2、使用定时器控制闪烁频率及滚动速度,闪烁频率及滚动速度均可变。

3、设计所有动作的联合效果设备告警设计假设有四套设备(0-3),每套设备分别有六种告警状态,使用8个发光二极管来显示这些告警。

AVR ATMEGA128 串口简单好使程序

AVR ATMEGA128 串口简单好使程序
}
//以上是串口发送接收函数
int main(void)
{
//PORTE=0B01000011;//调整让单片机的发送和接收直接连到MAX3232上
//DDRE =0B11100110;
PORTE=0B01110011;//针对本电路中的相关设置RS485通信
DDRE =0B11110110;
unsigned char temp;
Usart0_init();
while(1)
{
temp=Usart0_receive();
Usart0_transmit(temp);
//Usart0_transmit(0x5f);
}
//return 0;
}
#include <avr/io.h>
#include <avr/interrupt.h>
#include<util/delay.h>
#define UDRE0 5
#define RXC0 7
void Usart0_init(void) ;
//设置波特率9.6k,8位数据位,无校验,接收发送使能,1位停止位
UCSR0B=(1<<RXEN0)|(1<<TXEN0); //发送接收使能,使用查询方式,故没有使能中断
}
void Usart0_transmit(unsigned char c) //查询方式发送接收字符函数
{
while( !(UCSR0A&(1<<UDRE0)));//等待发送缓冲区为空
UDR0=c;
void Usart0_transmit(unsigned char c);

atmega128L串口通信详解

atmega128L串口通信详解

/***********************************************************************
void uart0_init(void00; //关闭 UART00 //不使用倍速发送(异步) //数据位为 8 位 //异步正常情况下的计算公式 //接收使能和发送使能
while (*s) { putchar0(*s); s++; } putchar0(0x0a);//回车换行 //putchar0(0x0d); } /*********************************************************************** ***** 函数功能:主程序 入口参数: 出口参数: ************************************************************************ ****/ void main(void) { unsigned char i; uart0_init();//UART0 初始化 puts0("HELLO!"); while(1) { puts0("test ok!"); } }
eg:
UCSR0C=0B00000110 //异步模式,禁止奇偶校验,停止位为 1 位,数据位为 8 位
4、设置 UBRR:
UBRR 的设置和这些参数有关:U2X0,CPU 频率,波特率 当 U2X0 为 0 时,即异步正常模式 异步正常模式下 异步正常模式 ,UBRR 的计算公式: 1、U2X=0 时的公式计算 UBRR0L= (F_CPU/BAUDRATE/16-1)%256; UBRR0H= (F_CPU/BAUDRATE/16-1)/256; 2、U2X=1 时的公式计算

AVRATMega128自引导IAP(bootload)的应用设计

AVRATMega128自引导IAP(bootload)的应用设计

AVR ATMega128自引导IAP(boot load)的应用设计嵌入式2009-08-11 16:11 阅读43 评论0字号:大中小ATmega128具备引导加载支持的用户程序自编程功能(In-Sysytem Programming b y On-chip Boot Program),它提供了一个真正的由MCU本身自动下载和更新(采用读/写同时“Read-While-Write”进行的方式)程序代码的系统程序自编程更新的机制。

利用AV R的这个功能,可以实现在应用编程(IAP)以及实现系统程序的远程自动更新的应用。

IAP的本质就是,MCU可以灵活地运行一个常驻Flash的引导加载程序(Boot Loa der Program),实现对用户应用程序的在线自编程更新。

引导加载程序的设计可以使用任何的可用的数据接口和相关的协议读取代码,或者从程序存储器中读取代码,然后将代码写入(编程)到Flash存储器中。

引导加载程序有能力读写整个Flash存储器,包括引导加载程序所在的引导加载区本身。

引导加载程序还可以对自身进行更新修改,甚至可以将自身删除,使系统的自编程能力消失。

引导加载程序区的大小可以由芯片的熔丝位设置,该段程序区还提供两组锁定位,以便用户选择对该段程序区的不同级别的保护。

本节将给出一个实际的的Boot Loader程序,它可以配合Windows中的超级终端程序,采用Xmodem传输协议,通过RS232接口下载更新用户的应用程序。

1.1 基本设计思想1.1.1 Boot Loader程序的设计要点Boot Loader程序的设计是实现IAP的关键,它必须能过通过一个通信接口,采用某种协议正确的接收数据,再将完整的数据写入到用户程序区中。

本例Boot Loader程序的设计要点有:l 采用ATmega128的USART口实现与PC之间的简易RS232三线通信;l 采用Xmodem通信协议完成与PC机之间的数据交换;l 用户程序更新完成后自动转入用户程序执行;l Boot Loader程序采用C语言内嵌AVR汇编方式编写,阅读理解方便,可移植性强,代码小于1K字。

Atmega128外部中断程序

Atmega128外部中断程序
SEI();
/* CLI();//关闭中断
//设置INT0上升沿触发中断
// EICRB|=(1<<ISC60);
EIMSK|=(1<<INT6);
SREG|=0x80;//使能INT0//使能Timer0溢出中断(T/C1中断屏蔽寄存器p106)
SEI();*/ //打开中断
}
#pragma interrupt_handler Int6_isr:8 //引脚PE6
unsigned int Int7_isr(void)
{
}
EICRB&=~(1<<ISC70);
EICRB|=(1<<ISC71); //设置INT0上升沿触发中断
EIMSK|=(1<<INT7);
SREG|=0x80;//使能INT0//使能Timer0溢出中断(T/C1中断屏蔽寄存器p106)
SEI();//打开中断
}
#pragma interrupt_handler Int7_isr:9 //引脚PE6
unsigned int Int6_isr(void)
{
unsigned char i;
mmm=1;
Clear_All();
LCD_write_string(2,1,"进入输入模式");
}
void exteral_interrupt5()//外部中断服务函数初始化
{
CLI();//关闭中断
DDRE&=~(1<<PE7);
使能timer0溢出中断tc1中断屏蔽寄存器p106sei
//static unsigned char tel[11];

ATMEGA128单片机读写倾角传感器ADXL345及所有I2C器件读写通用程序程序

ATMEGA128单片机读写倾角传感器ADXL345及所有I2C器件读写通用程序程序

}
uchar shin() {
uchar i,read_data; DDRD&=0XFD;//输入 for(i=0;i<8;i++)
{ PORTD|=0X01;//SCL=1 read_data<<=1; read_data|=(uchar)((PIND&0X02)>>1);//SDA PORTD&=0XFE; Delayuslcd(5);
temp1=((float)y_data*3.9); display(0,1,temp1);//显示 Y 方向加速度值 temp2=((float)z_data*3.9); display(0,9, temp2);//显示 Z 方向加速度值 delaylcd(1000); angle=(((atan2f(temp,temp1)*180)/3.14159265)+180);//算出倾角值 writeonechar(12,angle);//显示角度 }
void AX353_INIT()//倾角传感器初始化 {
write_byte(0x31,0x0B); //测量范围,正负 16g,13 位模式 write_byte(0x2C,0x08); //速率设定为 12.5 参考 pdf13 页 write_byte(0x2D,0x08); //选择电源模式 参考 pdf24 页 write_byte(0x2E,0x80); //使能 DATA_READY 中断 write_byte(0x1E,0x00); //X 偏移量 根据测试传感器的状态写入 pdf29 页 write_byte(0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入 pdf29 页 write_byte(0x20,0x05); //Z 偏移量 根据测试传感器的状态写入 pdf29 页 }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ATMEGA128相关例程自己学avr单片机已经有相当一段时间了,一开始用的是atmega128,觉得不是很好用。

于是自己去买了一块16L的芯片,觉得还行。

一开始用的是ICC AVR,应为它用起来比较简单,不像winavr那样,要写个Makefie,比较的麻烦,但icc avr的缺点是太过于简陋,调试程序时,感觉不是很好。

后来经同学介绍,用起了winavr,其实也是比较的简单,只不过要加一个makefile而已,其实makefile可以用软件自带的组建自动生成,只需修改几个参数就可以用。

后来又用起了code vision avr,虽然不太习惯,也谈不上不好用.需要注意的是,三个不同的软件所带的同文件不一样。

icc avr 是iom128v.h(姑且以128为例),winavr 是avr/io.h,不过makefile中要设置芯片为atmega128.而cvavr则是mega128.h。

记得一开始的时候,我对这些不同的同文件不是很理解,是从一个学长那里了解到,才弄明白的。

其实前两个软件只需把头文件稍微改一下基本上可以通用。

而最后一个软件的中断的写法似乎不太一样,因而和钱两个软件的兼容性是最差的。

总体说winavr给人的感觉是比较专业自己学习时多总结吧!1、流水灯/*硬件环境:atmega128开发板软件环境:CodeVisionAVR-C*/#include <mega128.h>#define uchar unsigned char#define uint unsigned intuchart;void timer1_init(){TCCR1B=0X00; //先停止定时器1TCNT1H=0XF0; //设定定时器初值TCNT1L=0XBE;TCCR1A=0X00; //启动定时器1TCCR1B=0X05; //使用1024分频}interrupt [TIM1_OVF] void timer1_ovf_isr(void){TCNT1H=0XF0; //重载定时器初值TCNT1L=0XBE;DDRE|=1<<2;PORTE|=1<<2;DDRA=0xff;PORTA=cnt; //输出led的值到端口Bt++;if(cnt==255)t=0;}void main(){//DDRB=0XFF;SREG|=0X80;TIMSK=0X04;timer1_init();while(1){;}}2、AD转换+数码管显示/***************************************************************************//*ADC测试程序 *//*目标器件:ATmega128 */ /*晶振:RC8MHZ *//*编译环境:ICCAVR 7.13A */ /*E-Mail:number007cool163.*//*时间:2010年11月13日*///Aref接AVCC(+5V),采用Aref作参考电压/*用数码管显示AD转换的结果*//***************************************************************************//*********************************包含头文件********************************/#include <iom128v.h>#include <macros.h>/********************************数码管段码表*******************************/extern const unsigned char tab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*********************************全局变量**********************************/unsigned int adc_rel=0;/**************************************************************************** 函数功能:ADC初始化函数入口参数:出口参数:****************************************************************************/ void adc_init(void){DDRF&=0XFE; //PORTF0设置为输入,即作为ADC0口输入模拟电压PORTF&=0XFE; //PORTF0设置为输入低电平ADCSRA=0x00; //关ADCADMUX = 0X00; //采用Aref作为参考电压,ADC0单端输入,右对齐ACSR=(1<<ACD);ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);//ADEN,启动ADC;ADSC,ADC开始转换;ADIE,ADC中断使能;ADPSx,设置分频因子64}/**************************************************************************** 函数功能:ADC中断函数入口参数:出口参数:****************************************************************************/ #pragma interrupt_handler adc_isr:iv_ADCvoid adc_isr(void){//int data_h,data_l;//data_l=ADCL;//data_h=ADCH;ADCSRA = 0x00;ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE);adc_rel=ADC;/*if(adc_rel>0x1ff){PORTA|=1<<2;}elsePORTA&=~(1<<2);*/}/**************************************************************************** 函数功能:延时子程序入口参数:出口参数:****************************************************************************/void delay(void){int i;for(i=0;i<1800;i++);}/****************************************************************************函数功能:显示子程序入口参数:k出口参数:****************************************************************************/void display(unsigned int k)//发光二极管显示初始化{DDRE|=1<<2;PORTE|=1<<2;DDRA=0XFF;PORTA=k;}#define SS 0#define SCK 1#define MOSI 2#define MISO 3#define SS_H() PORTB|=(1<<SS)#define SS_L() PORTB&=~(1<<SS)#define led0_en() {DDRB|=1<<4;PORTB|=(1<<4);} //开第一个数码管的位选#define led0_dis() {DDRB|=1<<4;PORTB&=~(1<<4);} //关第一个数码管的位选#define led1_en() {DDRB|=1<<5;PORTB|=(1<<5);}#define led1_dis() {DDRB|=1<<5;PORTB&=~(1<<5);}#define led2_en() {DDRB|=1<<6;PORTB|=(1<<6);}#define led2_dis() {DDRB|=1<<6;PORTB&=~(1<<6);}#define led3_en() {DDRB|=1<<7;PORTB|=(1<<7);}#define led3_dis() {DDRB|=1<<7;PORTB&=~(1<<7);}#define OE 7#define point 3#define dp 7#include <iom128v.h>#include <macros.h>const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,40x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,90x77,0x7C,0x39,0x5E,0x79,0x71,0x00};//a,b,c,d,e,fvolatile unsigned char led_buffer[4];void delay_1us(void) //1us延时函数{asm("nop");}void delay_nus(unsigned int n) //N us延时函数 {unsigned int i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数 {unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数 {unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}/*完成spi的初始化*/void spi_init(void){DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS);//设置MOSI,SCK输出SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI,主机模式}/*spi主机传送数据*/void SPI_MasterTransmit(char Data){/* 启动数据传输 */SPDR = Data;/* 等待传输结束 */while(!(SPSR & (1<<SPIF)));}/*完成对HC595的初始化*/void HC_595_init(void){DDRC |= (1<<OE); //设置PORTC7为输出PORTC &= (1<<OE); //输出高电平,使能595PORTB = 0x0F; //同时打开四个数码管的位选spi_init();led_buffer[0]=16; //初始化数码管段码led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=16;}/*HC595完成传送数据*/void HC_595_OUT(unsigned char data){SS_L();SPI_MasterTransmit(data);SS_H();}void leddis_update(void){/*最低位数码管,第四个数码管*/if(point==0)HC_595_OUT(table[led_buffer[3]]|(1<<dp));elseHC_595_OUT(table[led_buffer[3]]);led0_en();delay_nus(60);led0_dis();if(point==1)HC_595_OUT(table[led_buffer[2]]|(1<<dp));elseHC_595_OUT(table[led_buffer[2]]);led1_en();delay_nus(60);led1_dis();if(point==2)HC_595_OUT(table[led_buffer[1]]|(1<<dp));elseHC_595_OUT(table[led_buffer[1]]);led2_en();delay_nus(60);led2_dis();/*最高位数码管,第一个数码管*/if(point==3)HC_595_OUT(table[led_buffer[0]]|(1<<dp));elseHC_595_OUT(table[led_buffer[0]]);led3_en();delay_nus(60);led3_dis();}void display_led(unsigned int data){if(data>9999){HC_595_OUT(0xFF);//当计数大于9999时,四个数码管同时输出8 PORTB|=((1<<4)|(1<<5)|(1<<6)|(1<<7));}else if(data>999){led_buffer[0]=data/1000;led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>99){led_buffer[0]=data/1000; //关闭最高位的那个数码管 led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>9){led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else{led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=data%10;leddis_update();}}volatile unsigned int countnum=0;void timer1_init(void){TCCR1B = 0x00; //stopTCNT1H = 0x8F; //setupTCNT1L = 0x81;OCR1AH = 0x70;OCR1AL = 0x7F;OCR1BH = 0x70;OCR1BL = 0x7F;OCR1CH = 0x70;OCR1CL = 0x7F;ICR1H = 0x70;ICR1L = 0x7F;TCCR1A = 0x00;TCCR1B = 0x04; //start Timer}#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isr(void){TCNT1H = 0x8F; //reload counter high valueTCNT1L = 0x81; //reload counter low valuecountnum++;if(countnum>9999) countnum=0;}void init_devices(void){CLI(); //disable all interruptstimer1_init();TIMSK = 0x04; //timer interrupt sourcesSEI(); //re-enable interrupts}/**************************************************************************** 函数功能:主程序入口参数:出口参数:****************************************************************************/ void main(void){init_devices();HC_595_init();adc_init();SEI();//开全局中断变量display(0);while(1){delay();display_led(adc_rel/1024.0*5*1000);}}3、对EEPROM进行读写操作/************************************************文件:main.c用途:注意:部8M晶振************************************************/#include "config.h"/*向EEPROM里面写入数据输入量:地址,数据*/void EEPROM_write(unsigned int uiAddress,unsigned char ucData){while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //地址EEDR = ucData; //数据EECR |=(1<<EEMWE); //置位EEMWE,主机写使能EECR |=(1<<EEWE); //置位EEWE,写使能,启动写操作}/*从EEPROM指定的地址里面读出相应的数据*/unsigned char EEPROM_read(unsigned int uiAddress){while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //设置地址寄存器EECR |=(1<<EERE); //读使能return EEDR; //返回读入EEDR里面的数据}void main(void){unsigned char temp=123;unsigned char data;HC_595_init();EEPROM_write(0x01,temp);data=EEPROM_read(0x01);while(1){Seg7_Led_display(data); //调用显示函数将写入的数据又读出来}}4、定时器0(轮循方式)/*定时器0和2(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。

相关文档
最新文档