用atmega16编程十位数计算机,mega16

1-322-jpg_6_0_______-610-0-0-610.jpg

刚学AVR想用MEGA16做过数显电源,用BASCOM-AVR编程

用八段数码管分辨显示四位数电压,四位数电流,BASCOM编程(感觉比较简单学)。

其凑八凑,凑足一个程序。

只是数显,东西到手了,上面原来那个程序很不行,闪烁很严重。于是修改了如下:

$regfile = "m16def.dat" '目标单片机为ATmega16

$crystal = 8000000 '系统时钟8兆

Config Timer1 = Timer , Prescale = 64 '使用定时器1,64分频

On Ovf1 Timer1_isr '启用定时器溢出中断

Config Adc = Single , Prescaler = Auto , Reference = Avcc '设置ADC为单次转换模式,采样频率系统设定,参考电压使用AVcc

Config Portb = Output '配置端口PortB输出

Config Portd = Output '配置端口PortD输出

Dim V As Word '定义ADC采集变量 V

Dim I As Word '定义ADC采集变量 I

Dim V1 As Integer , V2 As Integer , V3 As Integer , V4 As Integer '定义ADC采样变量V1为十位,V2为个位,V3为十分位,V4为百分

Dim I1 As Integer , I2 As Integer , I3 As Integer , I4 As Integer '定义ADC采样变量I1为个位,I2为十分位,I3为百分位,I4为千分位

Dim L(10) As Byte '定义字形数组

Dim T As Byte '定义计数,循环控制变量T

Dim Dx As Byte : Dx = 0 '定义计数,段选DX

Dim _change As Byte : _change = 0 '中断发生计数变量

#include #include #define uchar unsigned char #define uint unsigned int void main() { DDRA=0X00; DDRB=0XFF; DDRD|=0X30; TCCR1A=0x91; //8位相位修正PWM 8000000/(64*2*256)=244.14hz TCCR1B=0x03; //clk/64 OCR1A=250; //初值占空比100% while(1) { if(PINA==0xe7)//加速前进4、5灯 { OCR1A=202;//占空比100% turn();//居中 } if(PINA==0xcf)//速度稍减前进5、6灯 { OCR1A=202;//占空比90% turnL();//左转-15度 } if(PINA==0x9f)//速度再减前进6、7灯 { OCR1A=176;//占空比80% turnLL();//左转-30度 } if(PINA==0x3f)//速度减前进7、8灯 { OCR1A=176;//占空比70% turnLLL();//左转-45度 } if(PINA==0X7f)//速度稍减前进8灯 { OCR1A=176;//占空比70% turnLLL();//右转45度 } if(PINA==0xf3)//速度稍减前进3、4灯 { OCR1A=202;//占空比90% turnR();//右转15度 } if(PINA==0Xf9)//速度再减前进2、3灯 { OCR1A=176;//占空比80% turnRR();//右转30度 } if(PINA==0Xfc)//速度稍减前进1、2灯 { OCR1A=176;//占空比70% turnRRR();//右转45度 } if(PINA==0Xfe)//速度稍减前进1灯 { OCR1A=176;//占空比70% turnRRR();//右转45度 } } } /*-45度*/ void turnLLL() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(4); } } /*-30度*/ void turnLL() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(6); } } /*-15度*/ void turnL() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(8); } } /*0度居中*/ void turn()//居中 { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(10); } } /*15度*/ void turnR() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(12); } } /*30度*/ void turnRR() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(14); } } /*45度*/ void turnRRR() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(17); } } /*定时0.1MS*/ void delay(uint z) { uint i,j; for(i=0;i<z;i++) for(j=0;j<90;j++); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值