完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这里有一些参考程序
定时器3,OCRB3输出PWM波形,占空比可调,数码管显示占空比,同时控制舵机转动 需要注意的问题: 如果直接将输出的pwm信号连接到舵机的信号输入端,是不能够驱动舵机的,必须有驱动电路,我用的是TLP281-4进行光耦隔离。 舵机的三根线依次为:地线(棕色),电源线(红色),信号线(黄色),当然不同的舵机,可能有所不同。 display.h文件: #define SS 0 #define SCK 1 #define MOSI 2 #define MISO 3 #define SS_H() PORTB|=(1< #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 4 #define dp 7 #include #include void port_init (void) { DDRA=0XFF; PORTA=0XFF; } const unsigned char table[]={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 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 } 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 } /*完成spi的初始化*/ void spi_init(void) { DDRB |= (1< /*spi主机传送数据*/ void SPI_MasterTransmit(char Data) { /* 启动数据传输 */ SPDR = Data; /* 等待传输结束 */ while(!(SPSR & (1< } /*完成对HC595的初始化*/ void HC_595_init(void) { DDRC |= (1< 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< HC_595_OUT(table[led_buffer[3]]); led0_en(); delay_nus(60); led0_dis(); if(point==1) HC_595_OUT(table[led_buffer[2]]|(1< HC_595_OUT(table[led_buffer[2]]); led1_en(); delay_nus(60); led1_dis(); if(point==2) HC_595_OUT(table[led_buffer[1]]|(1< HC_595_OUT(table[led_buffer[1]]); led2_en(); delay_nus(60); led2_dis(); /*最高位数码管,第一个数码管*/ if(point==3) HC_595_OUT(table[led_buffer[0]]|(1< HC_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]=16; //关闭最高位的那个数码管 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]=16; led_buffer[1]=16; led_buffer[2]=(data%100)/10; led_buffer[3]=data%10; leddis_update(); } else { led_buffer[0]=16; led_buffer[1]=16; led_buffer[2]=16; led_buffer[3]=data%10; leddis_update(); } } void init_devices(void) { port_init(); //端口初始化 HC_595_init(); //595初始化 } main.c文件: /*====================================================== 使用定时器3,OCR3A,OCR3B,OCR3C三个管脚同时输出PWM波形 在快速PWM的模式下,top=0x03ff=1023 OCRnX在top时刻更新 频率=8000000/8/1023=977.5HZ =======================================================*/ #include #include "display.h" #define uchar unsigned char #define uint unsigned int uint num; /*延时函数 */ void delay_ms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=1140;y>0;y--); } void init_key() { DDRD=0X00; PORTD=0XFF; } /*键盘扫描 */ void keyscan(void ) { if((PIND&0x01)==0) { while(!(PIND&0x01)); //松手检测 delay_ms(50); num+=20; if(num>=512) num=0; } if((PIND&0x02)==0) { while(!(PIND&0x02)); delay_ms(50); num-=20; if(num<=0) num=0; } if((PIND&0x08)==0) { while(!(PIND&0x01)); delay_ms(50); num=256; } } int main () { uint temp; init_key(); init_devices(); TCCR3A=0xff; //通道A,B,C均设置为比较输出模式 TCCR3B=0x0A; //采用10位快速PWM模式,top值为0X03FF,决定pwm频率; TCNT3=0X0000; //设置定时器3的初始值 TIMSK=0X00; ETIMSK=0X00; DDRE=0xff; num=256; while(1) { //OCR3A=512; //决定OCR3A的占空比 keyscan(); OCR3B=num; //决定OC3B的占空比 temp=num*100/1023; display_led(temp); } } 这是用led做的,框架大致对的
|
|
相关推荐
5 个讨论
|
|
只有小组成员才能发言,加入小组>>
AVR Atmega16 Bootloader程序与上位机LabView程序
5057 浏览 6 评论
#include <ioavr.h>这个头文件我应该下什么编译器
7711 浏览 0 评论
2985 浏览 2 评论
3071 浏览 1 评论
9981 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-6 06:51 , Processed in 0.759342 second(s), Total 78, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号