找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 349|回复: 1
收起左侧

AVR单片机热敏电阻加热器仿真

[复制链接]
ID:342822 发表于 2024-2-12 12:00 | 显示全部楼层 |阅读模式
62.gif

纸上谈兵的程序如下:

$regfile = "m8def.dat"
$crystal = 8000000
'$baud = 9600
'*******************端口B用于编码器及开关*********************
ddrb=&B00000000
Portb = &B11111111                                               ' 激活上拉寄存器
'*******************端口D用于LED指示灯*********************
ddrd=&b11111111
Portd = &B00000000

'*******************设置"SSD1306"*******************
'Config Clockdiv = 1                                        ' 确保芯片以8 MHz运行
Config Scl = Portc.5                                        ' 使用i2c引脚
Config Sda = Portc.4
Config Twi = 400000                                         ' i2c 速度
I2cinit
$lib "i2c_twi.lbx"                                          ' 不使用模拟软I2C,使用硬TWI
$lib "glcdSSD1306-I2C.lib"                                  ' 用这个特殊的lib覆盖默认lib
Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"


'****************设置定时器**************************
Config Timer0 = Timer , Prescale = 256                      'timer0 以 256uS tick 自动启动
Stop Timer0                                                 '所以现在停止它
On Ovf0 checkidle                                           '每 20 毫秒检查一次空闲按钮








'********************** ADS1110的I2C 地址*********************
'  -------------
' ADS1110的I2C地址是1001aaa,其中aaa是出厂时默认设置。ADS1110有8种不同类型,每种类型都有不同的I2C地址。封装上,
' ADS1110的每种类型都以EDx为标识,其中x表示地址变量。

'   部件               设备I2C设备地址               部件
'   型号            BIN        HEX        DEC       标记
' ---------       -------      ----       ---     -------
' ADS1110A0       1001000      0x48       72        ED0
' ADS1110A1       1001001      0x49       73        ED1
' ADS1110A2       1001010      0x4A       74        ED2
' ADS1110A3       1001011      0x4B       75        ED3
' ADS1110A4       1001100      0x4C       76        ED4
' ADS1110A5       1001101      0x4D       77        ED5
'ADS1110A6       1001110      0x4E       78        ED6
' ADS1110A7       1001111      0x4F       79        ED7
'  ----------------------------
Const ADS1110_DIZHI = &B10010001         '选择ED0标识的芯片ADS1110A0  地址:1001000 + 位0(读/写)
'Const Addressw = &B10010000                          '没使用


'*******************变量
Dim idleflag As Bit                                         '标记待机模式
dim switchevent as bit                                      '空闲开关防抖

Dim it As word
Dim ut As word  
Dim srt_temp As word
Dim Bt As Byte'因为我们需要保持编码器的状态

Dim dianya_zhuanhuan As word'Single                 '计算电压转换变量
Dim Pga As Integer                            '增益变量
Dim CE_LIANG_H As Byte , CE_LIANG_l As Byte        '数据测量变量

green alias portd.0                    '绿色LED指示降温引脚
red alias portd.1                      '红色LED指示升温引脚
dc alias portd.2                        'dc加热器引脚
idleswitch alias pinB.5                 '待机开关引脚

'*************初始化***************
green = 0
red = 0
dc = 0
Pga = 1
:it=0
:ut=0
:srt_temp=90


Tcnt0 = 178                      '设置 timer0,因此溢出需要 78 个刻度.即: 256-78 = 178 (78*256uS=20mS)
Enable Timer0                                               ' 启用定时器中断
Enable Interrupts                                           '允许中断发生
start timer0        
                                        '
Cls
Setfont Font12x16

'*************编码器程序***************
set123:
waitms 50
Do
  Bt = Encoder(pinb.0 , Pinb.1 , decline , rise , 0)
Lcdat 2 , 2 ,"SET:"; srt_temp;" C " ;
Waitms 10
'if PINB.3=0 then Exit Do
Debounce PINb.3 , 0 , gh
Loop

'*************主程序*************
Do
'***********查表ad值
gh:
It=srt_temp-1
Waitms 10
ut = Lookup(it, AD1)
Waitms 200
Gosub duqu
Waitms 100
Debounce PINb.4 , 0 , set123
Waitms 50
Loop
End


'------------------------------------------------------------------------------
duqu:           '测量读取计算子程序
I2cstart
I2cwbyte ADS1110_DIZHI                        '读取地址
I2crbyte CE_LIANG_H , Ack                       '测量读数   如果要读取更多字节,请指定ACK。
I2crbyte CE_LIANG_l , Nack                      '如果NACK是要读取的最后一个字节,则指定NACK
I2cstop                                       '停止位

   dianya_zhuanhuan = CE_LIANG_H * 256                       '左移至高8位
   dianya_zhuanhuan = dianya_zhuanhuan + CE_LIANG_l           '添加低8位

'**************模式选择及显示********************
waitms 3

   if idleflag = 1 then ut = 2003                      '如果选择了空闲模式,则设置空闲温度对应105摄氏度
   if idleflag = 1 then Lcdat 2 , 1 , "IDLE100 C"
   if idleflag = 0 then ut = ut
   if idleflag = 0 then Lcdat 2 , 1 , "SET:"; srt_temp;" C " ;


'****************温度控制信号执行****************
waitms 50
if dianya_zhuanhuan > ut then
      red = 1                                               '打开红色 LED
      green = 0                                             '关闭绿色 LED
      dc = 1                                                '并打开络铁的电源
Lcdat 2 , 112 ,chr(127)
   endif

   if dianya_zhuanhuan <= ut then
      green = 1
      red = 0
      dc = 0                                                '关闭电源
Lcdat 2 , 112 ,chr(126)
  endif
   waitms 500   

Return
end
'-------------------------------------------------------------------------------------------
$include "../Font12x16.font"                                   ' 字体文件

checkidle:                                                  'timer0 溢出中断例程,每 20mS 调用一次
   Tcnt0 = 178                                              '下次重新加载计时器

   if idleswitch = 0 then                                   '是否按下了空闲开关?
      toggle switchevent                                    '是的,所以去抖动
      if switchevent = 0 then                               '去抖动,所以必须真正按下开关
        stop timer0                                         '等一下,我们把这一切解决掉
        while idleswitch = 0
        wend                                                '等待用户释放开关
        start timer0                                        '现在我们可以下次重新启动计时器
        toggle idleflag                                     '指示开关已按下
      endif
   else
      switchevent = 0                                       '如果上次是1,但20毫秒后不是,那就不是误报了。
  endif
Return

'************************NTC温度转换ADC值表1----400****************************
AD1:

Data  24704% ,24395% ,24079% ,23757% ,23429% ,23096% ,22757% ,22414% ,22066% ,21713% ,
Data  21357% ,20997% ,20635% ,20270% ,19902% ,19533% ,19162% ,18791% ,18419% ,18047% ,
Data  17675% ,17304% ,16934% ,16566% ,16200% ,15836% ,15475% ,15116% ,14761% ,14410% ,
Data  14062% ,13718% ,13379% ,13045% ,12715% ,12390% ,12071% ,11757% ,11448% ,11145% ,
Data  10848% ,10556% ,10271% ,9991% ,9717% ,9449% ,9187% ,8931% ,8681% ,8437% ,
Data  8199% ,7967% ,7741% ,7520% ,7305% ,7096% ,6892% ,6694% ,6501% ,6313% ,
Data  6131% ,5954% ,5782% ,5614% ,5452% ,5294% ,5140% ,4992% ,4847% ,4707% ,
Data   4571% ,4439% ,4311% ,4187% ,4066% ,3950% ,3836% ,3727% ,3620% ,3517% ,
Data  3417% ,3320% ,3226% ,3134% ,3046% ,2960% ,2877% ,2797% ,2719% ,2643% ,
Data  2570% ,2499% ,2430% ,2363% ,2298% ,2236% ,2175% ,2116% ,2058% ,2003% ,
Data  1949% ,1897% ,1847% ,1797% ,1750% ,1704% ,1659% ,1616% ,1573% ,1533% ,
Data  1493% ,1454% ,1417% ,1381% ,1346% ,1312% ,1278% ,1246% ,1215% ,1185% ,
Data  1155% ,1127% ,1099% ,1072% ,1046% ,1020% ,995% ,971% ,948% ,925% ,
Data  903% ,882% ,861% ,841% ,821% ,802% ,783% ,765% ,747% ,730% ,
Data  713% ,697% ,681% ,666% ,651% ,636% ,622% ,608% ,595% ,582% ,
Data  569% ,557% ,545% ,533% ,521% ,510% ,499% ,489% ,478% ,468% ,
Data  458% ,449% ,439% ,430% ,421% ,413% ,404% ,396% ,388% ,380% ,
Data  373% ,365% ,358% ,351% ,344% ,337% ,330% ,324% ,318% ,311% ,
Data  305% ,300% ,294% ,288% ,283% ,277% ,272% ,267% ,262% ,257% ,
Data  252% ,248% ,243% ,239% ,234% ,230% ,226% ,222% ,218% ,214% ,

AD2:
Data  210% ,207% ,203% ,199% ,196% ,192% ,189% ,186% ,183% ,180% ,
Data  176% ,173% ,171% ,168% ,165% ,162% ,159% ,157% ,154% ,152% ,
Data  149% ,147% ,144% ,142% ,140% ,137% ,135% ,133% ,131% ,129% ,
Data  127% ,125% ,123% ,121% ,119% ,117% ,115% ,114% ,112% ,110% ,
Data  109% ,107% ,105% ,104% ,102% ,101% ,99% ,98% ,96% ,95% ,
Data  93% ,92% ,91% ,89% ,88% ,87% ,86% ,84% ,83% ,82% ,
Data  81% ,80% ,79% ,78% ,76% ,75% ,74% ,73% ,72% ,71% ,
Data  70% ,69% ,69% ,68% ,67% ,66% ,65% ,64% ,63% ,62% ,
Data  62% ,61% ,60% ,59% ,58% ,58% ,57% ,56% ,55% ,55% ,
Data  54% ,53% ,53% ,52% ,51% ,51% ,50% ,50% ,49% ,48% ,
Data  48% ,47% ,47% ,46% ,45% ,45% ,44% ,44% ,43% ,43% ,
Data  42% ,42% ,41% ,41% ,40% ,40% ,39% ,39% ,39% ,38% ,
Data  38% ,37% ,37% ,36% ,36% ,36% ,35% ,35% ,34% ,34% ,
Data  34% ,33% ,33% ,33% ,32% ,32% ,32% ,31% ,31% ,31% ,
Data  30% ,30% ,30% ,29% ,29% ,29% ,28% ,28% ,28% ,27% ,
Data  27% ,27% ,27% ,26% ,26% ,26% ,26% ,25% ,25% ,25% ,
Data  25% ,24% ,24% ,24% ,24% ,23% ,23% ,23% ,23% ,22% ,
Data  22% ,22% ,22% ,22% ,21% ,21% ,21% ,21% ,21% ,20% ,
Data  20% ,20% ,20% ,20% ,19% ,19% ,19% ,19% ,19% ,19% ,
Data  18% ,18% ,18% ,18% ,18% ,18% ,17% ,17% ,17% ,17% ,



'************************************************
'编码器子程序
decline:
srt_temp=srt_temp-10
if srt_temp<20 then srt_temp=10
Return

rise:
srt_temp=srt_temp+10
if srt_temp>390 then srt_temp=400
Return


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1079566 发表于 2024-2-14 10:15 | 显示全部楼层
又见楼主新贴, 原来BASCOM-AVR 可以直接用编码器 ENCODE....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表