mega16最小系统原理图
- 格式:pdf
- 大小:43.49 KB
- 文档页数:1


刚学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为单次转换模式,采样频率系统设定,参考电压使用AVccConfig Portb = Output '配置端口PortB输出Config Portd = Output '配置端口PortD输出Dim V As Word '定义ADC采集变量VDim I As Word '定义ADC采集变量IDim 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 '定义计数,循环控制变量TDim Dx As Byte : Dx = 0 '定义计数,段选DXDim _change As Byte : _change = 0 '中断发生计数变量'Enable Interrupts '使能中断'Enable Timer1 '使能timer1 中断Portd = &B11111110 '段选第一位置1Restore Daima '字形数组初始化For T = 1 To 10Read L(t)Next TStart Adc '启动ADC转换'Start Timer1 '启动定时器1DoV = Getadc(0) '取0通道ADC的转换结果,送入VV = V * 5 '10位ADC的结果最大值是1024,1024 /2 约等于512,'用以表示0~50伏的电压变化V1 = V / 1000 '将结果再除1000,得到取值范围0 ~ 9 的千位部分,存入变量V1V2 = V / 100 '将结果再除100,得到取值范围0 ~ 9 的百位部分,存入变量TV3 = V / 10 '将结果再除10,得到取值范围0 ~ 9 的十位数部分V4 = V Mod 10 '将T取10的模数,得到取值范围0 ~ 9 的个位数部分I = Getadc(1) '取0通道ADC的转换结果,送入VI = I * 5 '10位ADC的结果最大值是1024,1024 /2 约等于512,'用以表示0~50伏的电压变化I1 = I / 1000 '将结果再除1000,得到取值范围0 ~ 9 的千位部分,存入变量V1I2 = I / 100 '将结果再除100,得到取值范围0 ~ 9 的百位部分,存入变量TI3 = I / 10 '将结果再除10,得到取值范围0 ~ 9 的十位数部分I4 = I Mod 10 '将T取10的模数,得到取值范围0 ~ 9 的个位数部分Select Case DxCase 0 : T = V1 '第0位数码管显示,Case 1 : T = V2 '第1位数码管显示,Case 2 : T = V3 '第2位数码管显示,Case 3 : T = V4 '第3位数码管显示,Case 4 : T = I1 '第4位数码管显示,Case 5 : T = I2 '第5位数码管显示,Case 6 : T = I3 '第6位数码管显示,Case 7 : T = I4 '第7位数码管显示,End SelectPortb = L(t + 1)Dx = Dx + 1Rotate Portd , Left '段选左移一位,If Dx = 8 ThenDx = 0End IfLoopEndTimer1_isr: '10 毫秒定时中断服务程序Tcnt1h = &HFB '10 毫秒定时初值高字节Tcnt1l = &H1E '10 毫秒定时初值低字节_change = _change + 1 '中断发生计数If _change = 100 Then '判是否已中断2次,_change = 0 '是,已定时10豪秒,_change清零End IfReturn'字型数组Daima:Data &H3F , &H06 , &H5B , &H4F , &H66 '0,1,2,3,4Data &H6D , &H7D , &H07 , &H7F , &H6F '5,6,7,8,9首先要初始化AD的控制寄存器,主要是通道选择,转换速率选择,控制控制寄存器的开关位,打开AD功能,它自己会转换,转换完了就会有标志,转换完了的高低位它规格书也会说明存在哪里,你去那里把数拿出来,跟你计算出来的电压AD做比较,比如你的1.5V ,8位AD的话,1.5V对应的AD为1.5/5*256=77,那你就看你取出的值是比77大还是小至于你去多少次AD做平均后才比较就根据精度要求了,一般做16次平均,多的做256次平均定时器就简单了,自己看下,随便怎么设置都可以。