电子表决器 功能:可对某一个议题进行表决,表决人数为“0-9”,10人“A”表示赞成,“B”表示反对,预设通过表决条件,当符合条件时,LED亮绿色,否则亮红色,并显示赞成反对弃权的比例 要求: ①超级终端显示议题内容,表决结果后同步显示在议题后 3按键表决可以两步完成:1.编号,2.表决,不按者视为弃权 4数码管显示投票结果票数,LED显示表决结果如何用51单片机c语言实现代码
时间: 2024-02-28 14:53:55 浏览: 26
以下是一个基于51单片机的电子表决器的示例代码,其中使用了STC89C52单片机、数码管、LED和按键:
```
#include <REG52.H>
sbit LED = P1^0; // LED连接在P1.0上
sbit key1 = P3^0; // 按键1连接在P3.0上
sbit key2 = P3^1; // 按键2连接在P3.1上
sbit key3 = P3^2; // 按键3连接在P3.2上
unsigned char code table[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; // 数码管显示表
unsigned char display_buf[4] = {0}; // 数码管显示缓存,4位依次为个位、十位、百位、千位
unsigned char vote_buf[10] = {0}; // 投票结果缓存,10位依次为0-9号投票者的投票结果,A表示赞成,B表示反对,C表示弃权
unsigned char vote_num = 0; // 当前投票者编号,0-9
void delay(unsigned int ms) // 延时函数
{
unsigned int i, j;
for (i = 0; i < ms; i++)
{
for (j = 0; j < 125; j++);
}
}
void display() // 数码管显示函数
{
unsigned char i;
for (i = 0; i < 4; i++)
{
P2 = 0xFF; // 先清空P2口
P0 = table[display_buf[i]]; // 显示当前位的数字
P2 = ~(0x01 << i); // 打开对应的数码管
delay(5); // 延时
}
}
void keyscan() // 按键扫描函数
{
if (key1 == 0) // 按键1按下
{
display_buf[0]++; // 个位加1
if (display_buf[0] > 9) display_buf[0] = 0; // 超过9则清零
while (!key1); // 等待按键1松开
}
if (key2 == 0) // 按键2按下
{
vote_buf[vote_num] = 'A'; // 投赞成票
vote_num++; // 投票者编号加1
if (vote_num > 9) vote_num = 0; // 超过9则循环编号
display_buf[1]++; // 十位加1
if (display_buf[1] > 9) display_buf[1] = 0; // 超过9则清零
while (!key2); // 等待按键2松开
}
if (key3 == 0) // 按键3按下
{
vote_buf[vote_num] = 'B'; // 投反对票
vote_num++; // 投票者编号加1
if (vote_num > 9) vote_num = 0; // 超过9则循环编号
display_buf[1]++; // 十位加1
if (display_buf[1] > 9) display_buf[1] = 0; // 超过9则清零
while (!key3); // 等待按键3松开
}
}
void main()
{
unsigned char i, agree_num = 0, oppose_num = 0, abstain_num = 0;
unsigned char agree_rate = 0, oppose_rate = 0, abstain_rate = 0;
while (1)
{
display(); // 数码管显示
keyscan(); // 按键扫描
for (i = 0; i < 10; i++)
{
if (vote_buf[i] == 'A') agree_num++; // 统计赞成票数
if (vote_buf[i] == 'B') oppose_num++; // 统计反对票数
if (vote_buf[i] == 'C') abstain_num++; // 统计弃权票数
}
if (agree_num >= 6) // 符合通过表决条件
{
LED = 1; // LED亮绿色
}
else
{
LED = 0; // LED亮红色
}
agree_rate = agree_num * 10 / 10; // 计算赞成比例
oppose_rate = oppose_num * 10 / 10; // 计算反对比例
abstain_rate = abstain_num * 10 / 10; // 计算弃权比例
display_buf[2] = (agree_rate << 4) | oppose_rate; // 显示赞成反对比例
display_buf[3] = abstain_rate; // 显示弃权比例
agree_num = 0; // 清零赞成票数
oppose_num = 0; // 清零反对票数
abstain_num = 0; // 清零弃权票数
}
}
```
以上代码仅为示例,实际应用中还需要根据具体需求进行修改和完善。